小弟需要写一个用户登录的模块,现在已经完成了...但是由于密码是明文存在数据库的,
现在需要改为md5 加密,然后登录,希望给为前辈给点指导,最好是有源码的,谢谢。(关于为什么用md5,之前也了解过一点,登录加密的用这最好。如果你们有更好的加密方式,也欢迎提出来)。
小伙看你根骨奇佳,潜力无限,来学PHP伐。
$salt = sha1(uniqid(mt_rand(), true)); $pwd_db = sha1($salt.sha1($pwd_user));
$salt是用户注册时生成一个随机盐值.$pwd_db是数据库保存的加盐的密码哈希.$salt和$pwd_db都存到用户表中.其中:uniqid获取一个带前缀(mt_rand),末尾带熵(true),基于当前时间微秒数的唯一编号.mt_rand用于生成更好的随机数.sha1生成的字符串的长度是40位,字段类型可以设为char(40).
加salt现在主流的用户密码加密都要加salt, 因为md5的rainbow table已经包括绝大多数11位一下的"弱密码"了.而且随着多个大型网站的数据泄漏. md5被爆破的风险更大了. 甚者可以用md5的hash来找到一个人的常用网站.
伪代码:
md5(password + salt)
Java里没有md5相关的包吗?反正PHP一个函数md5()就搞定了^﹏^
用md5没有什么问题,也是业内常用方案。需要注意的一点是在对密码进行md5加密之前,最好进行加盐操作,否则弱密码的安全性是极差的。
看看 Web应用的安全登录认证,虽然是 C# 的,Java 类似。
楼主只说数据库中不要存放明文,就是网数据库存的时候调用一下加密方法存进去不就可以了么?加密方法前端后端都有。
就像 savokiss 所述的md5(md5(password)+salt) 已经是比较好的方案了。要更高安全性可以考虑 Bcrypt 之类的。盐最好不要只是重复的字符串,用 id, username, timestamp 等都不错。
md5(md5(password)+salt)
要加盐~要加盐~要加盐~重要的事情说三遍。
dz里用的:
salt就是盐,可以全局一样也可以每个用户唯一,是数据库里的一个字段
md5不可逆,但是可以字典穷举,所以单层md5穷举破解很容易,而加了盐只知道你加密后的密码不知道盐也没用咯
其他加密方式可以看下破解md5的那个网站,网站名就不说了
$salt是用户注册时生成一个随机盐值.
$pwd_db是数据库保存的加盐的密码哈希.
$salt和$pwd_db都存到用户表中.
其中:
uniqid获取一个带前缀(mt_rand),末尾带熵(true),基于当前时间微秒数的唯一编号.
mt_rand用于生成更好的随机数.
sha1生成的字符串的长度是40位,字段类型可以设为char(40).
加salt
现在主流的用户密码加密都要加salt, 因为md5的rainbow table已经包括绝大多数11位一下的"弱密码"了.
而且随着多个大型网站的数据泄漏. md5被爆破的风险更大了. 甚者可以用md5的hash来找到一个人的常用网站.
伪代码:
Java里没有md5相关的包吗?反正PHP一个函数md5()就搞定了^﹏^
用md5没有什么问题,也是业内常用方案。
需要注意的一点是在对密码进行md5加密之前,最好进行加盐操作,否则弱密码的安全性是极差的。
看看 Web应用的安全登录认证,虽然是 C# 的,Java 类似。
楼主只说数据库中不要存放明文,就是网数据库存的时候调用一下加密方法存进去不就可以了么?
加密方法前端后端都有。
就像 savokiss 所述的
md5(md5(password)+salt)
已经是比较好的方案了。要更高安全性可以考虑 Bcrypt 之类的。
盐最好不要只是重复的字符串,用 id, username, timestamp 等都不错。
要加盐~要加盐~要加盐~重要的事情说三遍。
dz里用的:
salt就是盐,可以全局一样也可以每个用户唯一,是数据库里的一个字段
md5不可逆,但是可以字典穷举,所以单层md5穷举破解很容易,而加了盐只知道你加密后的密码不知道盐也没用咯
其他加密方式可以看下破解md5的那个网站,网站名就不说了