只對密碼進行md5加密很容易反推出來,另外兩個用戶的密碼相同時,資料庫保存相同的密碼。 解決方法是在用戶的短密碼後面加上一段長字元,再計算 md5,這樣反推出原始密碼就變得非常困難,而且即使兩個用戶密碼相同,資料庫保存的密碼也不一樣。加上的這段長字元,稱為鹽(Salt),通過這種方式加密的結果,稱... ...
只對密碼進行md5加密很容易反推出來,另外兩個用戶的密碼相同時,資料庫保存相同的密碼。
解決方法是在用戶的短密碼後面加上一段長字元,再計算 md5,這樣反推出原始密碼就變得非常困難,而且即使兩個用戶密碼相同,資料庫保存的密碼也不一樣。加上的這段長字元,稱為鹽(Salt),通過這種方式加密的結果,稱為 加鹽 Hash。
使用例子:
假設有兩個用戶admin和abc,密碼都為123456,註冊時,鹽取用戶名+一個MD5值。
最終計算出來的密碼不一樣。
package com.example.shiro; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.util.ByteSource; public class TestPasswordSalt { public static void main(String[] args) { String pwd1 = md5("123456", "admin8d78869f470951332959580424d4bf4f"); System.out.println(pwd1);
//密碼:d3c59d25033dbf980d29554025c23a75 String pwd2 = md5("123456", "abc0c23e95fd137ea96c4ef24366b7e6f1f"); System.out.println(pwd2);
//密碼:ae8bb0dd40e4eddeac081f8e31afdaed } public static final String md5(String password, String salt){ //加密方式 String hashAlgorithmName = "MD5"; //鹽:相同密碼使用不同的鹽加密後的結果不同 ByteSource byteSalt = ByteSource.Util.bytes(salt); //密碼 Object source = password; //加密次數 int hashIterations = 2; SimpleHash result = new SimpleHash(hashAlgorithmName, source, byteSalt, hashIterations); return result.toString(); } }
資料庫表欄位保存見下麵表,登錄後取用戶名+salt進行驗證。
username | password | salt |
admin | d3c59d25033dbf980d29554025c23a75 | 8d78869f470951332959580424d4bf4f |
abc | ae8bb0dd40e4eddeac081f8e31afdaed | 0c23e95fd137ea96c4ef24366b7e6f1f |