一.什么样的密码保护措施,才是安全的?
首先,天底下没有破解不了的密码。其次,对密码进行保护的目标,不是让密码完全无法破解,而是让密码破解的成本足够高~
当攻击者从中获得的利益远高于付出的成本的时候,你的系统就很难成为被攻击的目标了~
对密码进行保护,首先我们要做以下两种假设:1.攻击者拿到了你系统的源码 2.攻击者破解了你的数据库拿到了和用户密码相关的数据
在这种情况下,我们要做的就是:即使攻击者拿到了密码的密文,也无法轻易地推算出密码的明文。
二.MD5、SHA、Bcrypt、DES、AES、RSA
MD5和SHA都是摘要算法,这两种算法都是不可逆的。
一段不定长度的字符串A,经过这两种算法,都能得到一段长度固定的摘要字符串B。 但是,通过B却无法计算出A的内容。
Bcrypt是一个跨平台的文件加密工具,它是不可逆的。bcrypt也经常被用于密码加密。
bcrypt可以随意调节一次加密运算需要的时间,比如:做一次散列耗时0.5秒钟,这样可以增加破解成本,但同时也会增加服务器校验密码的开销。
DES、AES都是对称加密算法,它们是可逆的。
一段不定长度的字符串A,在密钥K的参与下,经过这两种算法,都能得到一段长度固定的加密字符B,这个过程是加密,记为:E(A,K)=B。
通过B,我们也可以推出A,当然也需要密钥K参与,这个过程是解密,记为:D(B,K)=A。这两种算法的关键,是密钥K。
RSA是非对称加密算法,它是可逆的。
RSA包含密钥生成、加密、解密三个过程。密钥生成过程是基于数学中著名的欧几里得算法,最终能得到一对密钥:公钥(PK)和私钥(SK)。
加密过程通常用公钥(PK),解密通常用私钥(SK)。
三.MD5和SHA的安全问题
MD5 和 SHA 都不能完全抵御“彩虹表”的问题,性能足够强大的计算机可以在几分钟内通过暴力枚举的方式破解一大批16位以下的密码,得到密码的明文。
另外,MD5还存在碰撞的问题,即:如果已知明文密码A,理论上我们可以找到另一个明文密码B,使得A和B通过MD5算法计算出的摘要值是一样的。
这意味着一个密码为123456的帐号,你其实也可以用别的密码来登陆(假设该服务器只是简单地对密码做MD5验证)。当然,前提是你得知道原始密码是123456。
因为黑客们拿到的只是数据库中密码的密文,并不是明文,所以MD5的这种“缺陷”并不影响该算法的安全性。
四.对密码保护而言,MD5+salt是一种可行的方案
salt是一段随机字符串,称为“盐”。我们为每个用户生成不同的salt,存在数据库中。
假设用户的明文密码为A,加密后的密码为B。则加密过程可以是这样:B=MD5(A+MD5(A)+salt)。
MD5+salt 可以有效抵御“彩虹表”的问题。虽然足够强大的计算机破解一个密码依然很容易,但是要破解一批密码,耗费的时间会呈线性增长。
五.数据加密的选择
DES是一种过时的算法,不推荐使用。
AES是相对可靠的加密算法(可以被破解),目前大量的银行、电商,都在使用AES算法做数据加密,可见AES已经足够安全了。中小型项目中,推荐使用AES做数据加密。
RSA算法目前还无法破解,它比AES更安全。与金融相关的大型项目,推荐使用RSA做数据加密。