小弟需要写一个用户登录的模块,现在已经完成了...但是由于密码是明文存在数据库的,
现在需要改为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的那個網站,網站名稱就不說了