网站数据库中“密码加密”方法思考
博主,开始时候,写的web应用,数据库中的密码,都是直接保存的。真正的原汁原味,真正的所见即所得。
后来,看了别人的web应用都是MD5加密的,感觉很不错,自己也在应用中加入了MD5加密,貌似“不可逆”的,哈哈,看起来也专业了许多,后来听说CSDN用户信息被黑客窃取了,自己也赶紧去换了密码。
今天,无意间看了http://howe.im/(探微·智在未来)的一篇博文《安全密码机制(salt机制)》,才知道了,单纯使用MD5加密,也是不安全的,这里简单说下,所读博文的内容和自己的一点认识吧。
首先,解释下,为什么单纯MD5加密,是不安全的,我们暂且不论MD5是否可以由密文推出明文(有32位密文计算出加密前的密码),也不论用户的密码是否符合很高的安全性(加入大小写字母、数字、特殊字符等),当黑客窃取一个大型网站的数据库信息后,通过MD5加密(而非解密)方法,不断加密一些密码,如123abc,加密后A906449D5769FA7361D7ECC6AA3F6D28,在数据库中搜索,是否存在匹配密文,如果存在,则相应的用户密码就被破解了。不断的穷举密码,加密,匹配。这个速度是很快的,MD5加密很快,数据库匹配可以优化。
然后,说下,博文中介绍的salt机制。
1、用户注册时
用户注册密码A、客户端生成一个随机码B,将两者组合到一起,然后MD5加密为C,将随机码B和加密后的C,两者分开提交到服务器,保存到数据库。
2、用户登录时
用户只需要提交密码,提交到服务器后,将密码和该用户数据库中保存的随机码组合,然后MD5加密,验证即可。
问题:这里有一个漏洞,那就是用户登录时,提交的密码,如果是明文,那么很容易被恶意获取。用户提交的信息是有必要加密的,这才是负责任的。
我看了另外一边博文,介绍了腾讯的朋友网,它是怎么加密提交信息的,这里简单说下。
1、将用户密码A加密了三次B,然后与验证码字符C组合,然后进行一次MD5加密成密文D,提交到服务器,这里注意,提交是不包含验证码C的,因为验证码C是服务器生成,提前发送到Client端的。服务器端借助验证码C和用户提交来的密文D,获得密码,进行后续的验证。
这里又有一个问题了,说好的MD5,一般人是没法破解的呢,怎么这里有这个破解步骤呢,其实这是我臆想的步骤,可能它没有破解的,我为什么要破解的,我是想将这两部分整合,所以破解,如果朋友网,没有用salt的加密机制,那么就不需要获得密码A了,哈哈……说的很乱。
总之,可以采取的方案如下:
1、服务器端,用户注册时,保存 (随机码A) 和 (密码B+随机码A进行MD5加密)密文C
2、提交注册或登录信息时,客户端提交(密码M+验证码N进行可逆的方法加密)密文O,服务器端,保存有验证码N,故而,可以逆向运算获得密码M,然后提取数据库中的随机码A,组合后进行MD5加密,与数据库验证。注:虽然密文O是可逆的运算,但是,在提交过程中是不包括验证码N的,加上比较独特的加密算法,基本可以保证安全了,呵呵,除非,服务器端到用户端传输的报文也被截获了,那就没办法了。话说回来,就算获得了密码,那个注册时候生成的随机码A,也是很难获得的。
本文出自 “学海无涯” 博客,请务必保留此出处http://ijustdoit.blog.51cto.com/5682691/1175635