在密码加密存储中,常用的方案包括 MD5、SHA-256 等哈希算法,同时结合一些额外的技术如加盐(Salt)和多次哈希来提高安全性。下面逐步介绍常见的密码加密存储方案、算法之间的区别、以及如何安全存储密码。
1. 基本的哈希算法:MD5 与 SHA-256
1.1 MD5(Message Digest Algorithm 5)
- 特点:MD5 是一种生成 128 位(16 字节)哈希值的算法。它的速度快,效率高,但因其已被破解,不再适合用于安全密码存储。
- 缺点:
- 碰撞攻击(Collision Attack):攻击者可以通过找到不同的输入数据生成相同的哈希值,破坏哈希算法的唯一性。
- 彩虹表攻击:彩虹表是一种预计算的哈希值查找表,攻击者可以通过查表快速获取对应明文密码。
1.2 SHA-256(Secure Hash Algorithm 256-bit)
- 特点:SHA-256 是 SHA-2 系列中的一种,生成 256 位(32 字节)哈希值,安全性较高。相比 MD5,SHA-256 的输出更长,不易被破解。
- 优点:
- 抗碰撞性强:目前还没有有效的碰撞攻击方法,安全性高。
- 长度更长:256 位的哈希值意味着搜索空间大幅增加,使得攻击更加困难。
- 缺点:单独使用 SHA-256 进行加密存储仍然存在风险(如彩虹表攻击),需要结合其他方法增强安全性。
2. 加盐(Salt)与多次哈希
单独使用 MD5 或 SHA-256 对密码进行加密存储存在一定风险,因此需要使用加盐(Salt)和多次哈希来提高安全性。
2.1 加盐(Salt)
- 概念:加盐是指在密码的基础上添加一个随机的字符串(Salt),然后再进行哈希计算。加盐后的密码哈希值即使密码相同,不同用户的哈希结果也不同。
- 优点:
- 防止彩虹表攻击:加盐会生成唯一的哈希值,使得预计算的彩虹表无效。
- 增加破解难度:即使攻击者获取了数据库中的密码哈希值和盐值,仍然需要对每一个哈希值分别进行破解。
- 示例:
- 用户密码:
password123
- 随机盐值:
xyz456
- 哈希计算:
hash(password123 + xyz456)
- 用户密码:
2.2 多次哈希(Key Stretching)
- 概念:多次哈希是指对加盐后的密码进行多次(如数千、数万次)哈希计算,以增加破解的时间成本。常见的实现方式是通过循环多次调用哈希算法。
- 优点:
- 增加破解时间:通过多次哈希,即使攻击者拥有大量计算资源,也需要花费更多时间来破解。
- 示例:使用 1000 次 SHA-256:
- 哈希 1:
hash(password123 + xyz456)
- 哈希 2:
hash(hash1)
- ……依此类推进行 1000 次哈希。
- 哈希 1:
3. 更高级的密码存储算法:PBKDF2、bcrypt、scrypt
为了增强密码存储的安全性,除了 MD5 和 SHA-256 之外,常用的还有专门用于密码存储的哈希算法:
3.1 PBKDF2(Password-Based Key Derivation Function 2)
- 特点:PBKDF2 是一种基于密码的密钥派生函数,通过重复哈希并结合加盐生成密钥,适合密码存储。
- 优点:
- 可配置的哈希迭代次数:可以配置迭代次数(如 1000 次、10000 次等),增加破解难度。
- 常用于密码存储和加密密钥生成。
- 应用场景:许多现代密码存储系统和加密库使用 PBKDF2,如 JWT(JSON Web Tokens)的密钥生成。
3.2 bcrypt
- 特点:bcrypt 是专门设计用于密码存储的哈希算法,基于 Blowfish 加密算法,支持加盐和多次哈希。bcrypt 的强度可以通过配置参数增加。
- 优点:
- 内置加盐:bcrypt 自动为每个密码生成唯一的盐值。
- 自适应安全性:bcrypt 可以根据计算资源提升调整哈希强度(增加迭代次数)。
- 应用场景:常用于 Web 应用的密码存储,如 Ruby on Rails、Django 等框架中默认使用 bcrypt。
3.3 scrypt
- 特点:scrypt 是一种为密码哈希设计的算法,强调使用大量内存资源以增加破解难度,特别是防止专用硬件(如 FPGA 或 ASIC)加速破解。
- 优点:
- 抗硬件破解:通过占用大量内存资源,减少硬件加速破解的可能性。
- 适用于密码存储,以及需要高度安全的场景。
- 应用场景:scrypt 在密码存储、文件加密和区块链(如 Litecoin)中应用广泛。
4. 如何安全存储密码
为了实现安全的密码存储,建议遵循以下流程:
-
使用强哈希算法:
- 不要使用已被证明不安全的 MD5,推荐使用 SHA-256 及以上安全性算法。
- 最好使用 bcrypt、PBKDF2 或 scrypt 这种专为密码存储设计的算法。
-
加盐处理:
- 为每个用户密码生成一个随机的盐值,并将盐值和哈希结果一起存储。
- 避免使用固定的盐值或无盐密码存储。
-
多次哈希(Key Stretching):
- 使用算法的内置功能或手动多次进行哈希运算,以增加破解的计算复杂度。
-
及时更新密码存储方案:
- 随着计算能力的提升,过去认为安全的算法可能会变得不再可靠。定期审查和更新密码存储方案。
-
加密传输:
- 密码应通过 HTTPS 等加密协议传输,避免明文传输密码。
5. 区别与总结
- MD5 和 SHA-256 是基础哈希算法,但单独使用不适合密码存储。
- bcrypt、PBKDF2、scrypt 是专为密码存储设计的更安全的方案,推荐使用。
- 应该通过加盐和多次哈希来增加密码存储的安全性。