我的做法是:
1.注册,当用户输入自已想要的用户名,密码后,用JS对输入的密码进行初次加密,具体方法可以百度
2.用户点击注册时,将用户名和加密后的密码密文发送到服务端。
3.服务端接收到用户名和密文密码后 ,先生成一个随机的摘要(其实就是MD5的种子),然后与公司内部才能取得的摘要(也是一个字符串)和官密文密码(共3部分)用MD5或SHA(建议)进行再一次加密,形成最终密文密码。
4.然后将用户名,随机摘要,最终密文放入数据库中。(注意小心保管公司内部的字符串)
5.怎么验证?用户登录的时候,做1.2.3步骤。将形成的结果与数据库的内容进行比对。一致则验证通过,否则拒绝登录。
思考: 1.用户注册之时,服务端是不知道用户输入的是什么密码的,在网络上传输的是密文。其实,这应该算一纸墙。
黑客如果拦截到用户登录时发送的用户名和密码密文,他直接将该信息发送到服务端就可以仿冒用户登录了。只是需要的技术手段要复杂一些。比直接能看到密码好一点点。但如果人家都知道怎么抓包了,可能这一点事,他不会觉得麻烦。进一步优化的效果,可以结合登录人的IP地址,浏览器信息对密码进行加密码,在服务端根据登录数据包的源IP,浏览器等信息,对仿冒数据包进行过滤。
2.网站如果要支持多种客户端,比如手机时,可能有的手机无法支持js文件的时候,就只有向服务端传送明文了,然后服务端还必须进行与js文件相同的加密后,再执行后面的操作。可以用nodejs之类的,或干脆重新用服务端语言重新实现js加密算法。
3.公司内部的开发人员或数据库管理人员无法知悉用户的密码,这是很显然的事,所以一定程度上避免了公司人员离职时搞什么小破坏,把用户信息给泄露了,貌似这个是法律和道德问题,不管。
4.为什么有一个公司内部才能取得的摘要?这个是为了最后一次的保险了,那一天,你的数据库同CSDN一样被暴了。。。。加密算法时确发现还有一个未知数,破解的人头就应该大了吧,呵呵。至于怎么保存这最后一把钥匙呢?没想清楚。这个东西防的是公司外部的人,而不是公司内部的人吧。
5.所有的加密均是不可逆的。是的,因为我用的MD5和SHA,密码这种东西,只有用户知道,就行了。而且验证的时候又不需要最初的密码,只需要一个MD5或SHA值就行了,是吧?
6.我想多了,人家都暴你库了,还要你的用户密码来做甚?直接把用户资料DOWN下去就是了,干嘛非要去破你的密码?搞好数据库安全才是真的。少在程序上面写几个漏洞,就好了。