网站注册登陆,密码如何进行加密?
在网上看了好多这方面的文章,都说客户端的密码,登陆时要用md5加密后发给服务器,然后服务器再和数据库中的salt和加密后的密码进行比较
不太明白如果要是这样做的话
假设A用户的用户名为abcd,密码为123456. md5加密后是:e10adc3949ba59abbe56e057f20f883e
对于黑客而言,他偶然获取了用户名:abcd,密码:e10adc3949ba59abbe56e057f20f883e
此时他不用知道abcd的密码是123456,同时也不需要理解e10adc3949ba59abbe56e057f20f883e 是怎样生成的,他只需要输入用户名:abcd,然后密码:e10adc3949ba59abbe56e057f20f883e 来调用服务就可以登录了。
如何避免这种情况的出现呢?
------解决方案--------------------
黑客怎么会知道用户名abcd 和密文?
------解决方案--------------------
客户端不需要加密
只需要按正常的用户名和密码登入就可以了。
然后服务器端,对密码执行 md5(md5(密码)+salt) 操作,生成加密后的密码。salt从数据库中获取。
再与数据库中加密的密码比对。
相同则登入成功,否则登入失败。
这种做法的好处是,即使数据库被黑客进入了,也不能知道用户的明文密码。
------解决方案--------------------
服务端的密码是这么比较的
if ($row['pwd'] == md5($_POST['pwd'])){
//
}
就算别人知道MD5之后的密码,但是来到服务端,又需要再加密一次的,或者加密多次再比较。
------解决方案--------------------
黑客即使黑进你的数据库,获得了你的会员的用户名与加密过的密码,因为md5的加密基本上是不可逆的,所以黑客是无法调用你已知的服务实现登陆操作的。
但是一层md5加密也不是很安全,很多网站都提供md5的解密。建议多次md5加密或者添加你自定义的字符串然后在md5加密(md5(user_passwd.your_defined_string))。