MD5 Hash + Salt的密码存储方式实现

时间:2022-10-28 18:20:30

    MD5算法是一种密码散列算法,MD5散列后的数据长度为128 bit,该散列算法在密码上使用得非常多。但现在已经被更安全的SHA-1代替,MD5算法产生的密码可以使用反向查询的方式从预先算出的密码MD5库中查到密码,网上的一些MD5库中大约有上亿到上百亿条密码数据。针对这种破解方式,对密码在存储过程中经过Salt,即加盐后存储的方式可以有效增加反向查询的难度。

    Salt(盐值)是一组随机数据,长度为几个字节,比较安全的密码存储算法要求盐值至少在8 Bytes以上。盐值的产生要求使用安全的随机数算法,例如Java中使用SecureRandom算法产生的随机数就是安全的随机数算法。

    MD5 Hash + Salt存储密码的过程如下:

  1. 产生Salt值,即使用安全随机数算法,产生随即盐值,最好直接产生随机Byte,安全的密码要求盐值在8 Bytes以上。
  2. 将用户密码的Bytes与盐值的Bytes组合在一起,形成Password + Salt或Salt + Password的Bytes数组。Password和Salt顺序任意,但解密时也要相同顺序。
  3. 对上述Password + Salt计算MD5值,得到MD5的Bytes
  4. 见Salt与上述算出的MD5 Bytes组合在一起,成为 Salt + MD5 Bytes
  5. 使用Base 64算法或转为16进制字符串的方式将上述组合后的Bytes转换成为字符串,转换之后即可存储到数据库中。
上述Hash + Salt的密码存储方式是比较有效的对抗从MD5库中查询到密码的方式,在大型系统使用较多。如果需要在更加安全的场合使用,可以将MD5算法更改为SHA-1算法,增加Salt值的长度等方式。