在当今数字世界,保护用户密码是任何在线服务的首要责任,当你在一个网站注册时,你信任它会安全地处理你的敏感信息,数据库是如何做到把你的密码“隐藏”起来,即使数据库本身被泄露,也能最大程度保护你的安全呢?答案在于一系列严谨的密码存储技术,而非简单的“隐藏”,核心是不可逆的转换和精心设计的防护措施。
核心原则:绝不存储明文密码
最重要、最基础的原则是:任何负责任的系统都绝不应该在数据库中直接存储用户的原始密码(明文),明文存储意味着一旦数据库被非法访问(黑客攻击、内部泄露),所有用户的密码将瞬间暴露,后果极其严重。
关键技术:哈希(Hashing)与加盐(Salting)
数据库“隐藏”密码的主要武器是密码哈希函数,这不是加密(Encryption),因为加密是可逆的(有密钥就能解密),而哈希设计上是单向的、不可逆的。
-
哈希(Hashing):
- 过程: 当你设置密码时,系统会将你的原始密码输入到一个特殊的数学函数(哈希函数)中。
- 输出: 这个函数会输出一串固定长度、看起来完全随机的字符序列,称为哈希值或摘要。
- 特性:
- 单向性: 从哈希值几乎不可能反推出原始密码(计算上不可行)。
- 确定性: 相同的输入(密码)每次都会产生完全相同的哈希值。
- 雪崩效应: 输入密码即使只有微小改动(如
password
改为passw0rd
),产生的哈希值也会发生巨大、不可预测的变化。 - 抗碰撞性: 很难找到两个不同的输入密码能产生相同的哈希值。
- 存储: 数据库中存储的是这个哈希值,而不是你的原始密码,当你登录时,系统将你输入的密码再次进行相同的哈希运算,然后将得到的哈希值与数据库中存储的哈希值进行比对,如果两者一致,则密码正确。
-
加盐(Salting):
- 问题: 单纯的哈希存在一个重大安全隐患——彩虹表攻击,攻击者可以预先计算海量常用密码及其哈希值,形成巨大的“彩虹表”,如果数据库泄露,攻击者只需将泄露的哈希值与彩虹表匹配,就能快速破解那些使用简单、常见密码的账户。
- 解决方案: 盐(Salt),盐是一个随机生成的、足够长(通常16字节或更长)的字符串。
- 过程:
- 在用户创建密码或更改密码时,系统为这个用户生成一个唯一的随机盐。
- 系统将盐与用户的原始密码拼接在一起(可以是加在密码前、后,或更复杂的方式)。
- 对拼接后的字符串(密码+盐) 进行哈希运算。
- 将最终的哈希值和使用的盐都存储到数据库的用户记录中。
- 威力:
- 唯一性: 即使两个用户使用了完全相同的密码,由于他们拥有不同的盐,最终存储的哈希值也完全不同。
- 粉碎彩虹表: 彩虹表是针对纯密码计算的,加了随机盐后,攻击者需要为每个盐值重新计算整个彩虹表,这在实际中是不可行的(计算量和存储量巨大)。
- 增加破解成本: 攻击者必须针对每个用户(每个盐)单独进行暴力破解,极大地拖慢了攻击速度。
推荐的现代哈希算法:
并非所有哈希函数都适合存储密码,像MD5
、SHA-1
等通用哈希算法速度太快,容易被专用硬件(如GPU、ASIC)暴力破解,专门为密码设计的密钥派生函数(Key Derivation Functions – KDFs) 才是最佳选择:
-
bcrypt:
- 内置盐值。
- 核心特点是有一个可配置的“成本因子(work factor)”,这个因子可以人为地减慢哈希计算速度(例如从几毫秒减慢到几百毫秒),这对合法用户登录影响微乎其微(一次登录只需计算一次),但对需要尝试数十亿次密码的攻击者来说,成本(时间、计算资源)会变得极其高昂。
- 经过长期实践检验,安全可靠。
-
PBKDF2 (Password-Based Key Derivation Function 2):
- 标准化的KDF(由NIST推荐)。
- 通过多次迭代(通常数万次或更多)一个基础哈希函数(如HMAC-SHA256)来显著增加计算成本。
- 同样需要结合随机盐。
-
Argon2:
- 2015年密码哈希竞赛(Password Hashing Competition)的获胜者,被认为是当前最先进的密码哈希算法。
- 不仅消耗计算资源(CPU时间),还消耗大量内存(RAM),这使得攻击者更难使用成本低廉的专用硬件(如GPU、ASIC)进行大规模并行攻击,因为内存成本更高且并行化效率更低。
- 同样具有可配置的时间成本、内存成本和并行度参数。
最佳实践总结:
- 绝对禁止明文存储。
- 使用专门设计的、抗暴力破解的密码哈希算法: 优先选择
Argon2
,bcrypt
, 或配置得当的PBKDF2
,避免使用MD5
,SHA-1
等快速通用哈希。 - 必须为每个用户生成唯一的随机盐: 盐的长度要足够(建议≥16字节)。
- 合理配置算法强度: 对于
bcrypt
,提高成本因子;对于PBKDF2
,增加迭代次数;对于Argon2
,调整时间、内存和并行度参数,这些参数需要随着计算能力的提升而定期审查和调整。 - 安全地存储盐: 盐通常与哈希值一起存储在用户记录中,这本身是安全的,因为盐的作用是防止预计算攻击,即使盐泄露,攻击者仍需为每个盐单独破解。
- 传输过程也需加密: 密码在从用户浏览器传输到服务器的过程中,必须使用HTTPS(TLS/SSL)加密,防止在传输中被窃听。
安全提醒:
- 没有绝对安全: 即使采用了上述所有最佳实践,如果用户密码本身极其简单(如
123456
,password
),攻击者仍然可以通过针对该用户的定向暴力破解(尽管成本很高)将其破解,用户选择强密码(长度、复杂度)至关重要。 - 密钥管理(进阶): 对于极其敏感的系统,有时会使用加密(如AES)来进一步保护存储的密码哈希值,但这引入了密钥管理的复杂性和风险——保护密钥本身成为了新的安全重点,对于大多数应用,正确使用强密码哈希+加盐已足够。
数据库“隐藏”密码的实质,是利用强大的密码学工具(哈希函数+盐)将原始密码转换成不可逆的、唯一的“指纹”,通过使用现代的抗暴力破解算法(如Argon2, bcrypt, PBKDF2)和确保每个密码都添加了唯一的随机盐,即使数据库不幸泄露,攻击者也极难在可行的时间内将大多数哈希值还原成原始密码,这体现了系统对用户安全的责任和专业性,保护密码安全是一个持续的过程,需要开发者遵循最佳实践,并及时更新技术以应对不断演变的威胁。
引用说明:
- 本文中关于密码哈希、加盐、彩虹表攻击、密钥派生函数(KDF)的概念和技术细节,参考了广泛认可的信息安全标准和最佳实践,特别是来自以下权威来源的核心思想:
- OWASP (Open Web Application Security Project): OWASP Cheat Sheet Series, Top 10 Security Risks (特别是A02:2021 – Cryptographic Failures)。
- NIST (National Institute of Standards and Technology): NIST Special Publication 800-63B (Digital Identity Guidelines – Authentication and Lifecycle Management)。
- 密码学领域关于安全哈希函数和密钥派生函数的学术研究及行业共识(如Argon2作为PHC获胜者的地位)。
- 推荐的算法(bcrypt, PBKDF2, Argon2)是当前信息安全社区广泛推荐和审计的密码存储标准解决方案。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/47141.html