博主,开始时候,写的web应用,数据库中的密码,都是直接保存的。真正的原汁原味,真正的所见即所得。
后来,看了别人的web应用都是MD5加密的,感觉很不错,自己也在应用中加入了MD5加密,这样看起来就专业了许多,由于MD5的密文是无法逆向获取明文的,所以也觉得很安全。
看了(探微·智在未来)的一篇博文《安全密码机制(salt机制)》。这里简单说下,所读博文的内容和自己的一点认识吧。
首先,解释下,为什么单纯MD5加密,是不安全的,我们暂且不论MD5是否可以由密文推出明文(有32位密文计算出加密前的密码),也不论用户的密码是否符合很高的安全性(加入大小写字母、数字、特殊字符等)。
当黑客窃取一个大型网站的数据库信息后,通过MD5加密(而非解密)方法,不断加密一些密码,如123abc,在数据库中搜索,加密后的密文A906449D5769FA7361D7ECC6AA3F6D28,如果存在,则相应的用户密码就被破解了。不断的穷举密码,加密,匹配。这个速度是很快的,MD5加密很快,数据库匹配也很快,如果有预先生成的彩虹表,那就更快了。如果用户的密码不太复杂,就会很快被破解,这就是为什么很多网站要求密码中包含至少包含数字+大小写字母+特殊字符,增加穷举破解的难度和成本。然而,这种成本有时候算不上太大。
然后,说下,博文中介绍的salt机制。
1、用户注册时
用户注册密码A、客户端生成一个随机码B(盐),将两者组合到一起(或者增加其他稳定的元素,如邮箱地址等),然后MD5/SHA1/SHA2加密为C,将随机码B(盐)和加密后的C,两者均分别保存到数据库。
2、用户登录时
用户只需要提交密码,提交到服务器后,将密码和该用户数据库中保存的随机码B(盐)组合加密成密文C1,验证是否与数据库中的C一致即可。
有了盐的存在,虽然是保存到数据库的,但是破解一个网站的会员密码信息的成本,会大大大大增加,破解过程可以脑补,最终可能花费很大力气也破解不了几个。
题外话1:加盐可以降低TK后,被破解会员密码的风险。但是,当用户登录时,提交的密码,无论是明文还是密文,一旦被恶意获取,就可以直接登录会员账号。解决被窃取的问题,是使用https,将Client端到Server端的数据传输进行加密,这样就无法被窃取了。
题外话2:为了防止别人暴力破解密码,可以增加验证码,增加登录错误的次数控制。当然,验证码也分很多种啦。