项目中的MD5、盐值加密
首先介紹一下MD5,而項目中用的是MD5和鹽值來確保密碼的安全性;
1. md5簡介
md5的全稱是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一種被廣泛使用的密碼散列函數,可以產生一個128位(16字節,1字節8位)的散列值(常見的是用32位的16進制表示,比如:0caa3b23b8da53f9e4e041d95dc8fa2c),用于確保信息傳輸的完整一致。
2. md5原理
md5將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產生一個唯一的MD5信息摘要。文件的md5類似于人的指紋,在世界上是獨立無二的,如果任何人對文件做了任何改動,其md5的值也就是對應的“數字指紋”都會發生變化。
對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
md5與對稱和非對稱加密算法不同,這兩種密碼是防止信息被竊取,而摘要算法的目標是用于證明原文的完整性。
3. md5特性
1. 不可逆
沒有系統有辦法知道md5原來的文字是什么。
2. 具有高度的離散性
md5碼具有高度的散列性,沒有規律可循,哪怕原信息只有一點點的變化,比如多個空格,那么就會導致md5發生巨大變化,也可以說產生的md5碼是不可預測的。
3. 壓縮性
任意長度的數據,算出的md5值得長度都是固定的。
4. 弱碰撞性
已知原數據和其md5的值,想找到一個具有相同md5值得數據(即偽造數據)是非常困難的。
4. md5的用途
密碼的加密存儲,用戶設置密碼時,服務端只記錄這個密碼的MD5,而不記錄密碼本身,以后驗證用戶身份時,只需要將用戶輸入的密碼再次做一下MD5后,與記錄的MD5作一個比較即可驗證其密碼的合法性。
數字簽名,比如發布一個程序,為了防止別人在你的程序里插入病毒或木馬,你可以在發布這個程序的同時,公開這個程序文件的MD5碼,這樣別人只需要在任何地方下載這個程序后做一次MD5,然后跟公開的這個MD5作一個比較就知道這個程序是否被第三方修改過。
文件完整性驗證,比如當下載一個文件時,服務器返回的信息中包括這個文件的md5,在本地下載完畢時進行md5,將兩個md5值進行比較,如果一致則說明文件完整沒有丟包現象。
文件上傳,比如百度云實現的秒傳,就是對比你上傳的文件md5在百度服務器是否已經存在了。
MD5不安全的3個原因
1、字典表很大
在網上有很多md5解密網站(如:https://md5.cn/),就如同一個字典表。通過在數據庫存儲很多常用的密碼,可以在很短的時間內查找任何哈希值的答案。這種數據庫占用大量的磁盤空間,具有一定的成功率。在計算機安全領域,一些朋友需要用到MD5解密網站,通過這類型的網站,可以提高工作效率,大家可以去試試。
2、碰撞
安全的算法具有良好的抗沖突性,也就是說對于不同的單詞,獲得相同哈希值的可能性比較低,但是MD5的抗沖突性較低。
3、暴力攻擊速度很快
蠻力攻擊是通過嘗試多種可能性來查找密碼的一種方法,即可以猜測用戶可能使用的東西(出生日期,孩子的名字,寵物的名字等),也可以嘗試一切(從a,b, c到10個字符的特殊字符密碼)。抵御暴力攻擊的唯一方法可能是密碼長度,如果您擁有40個字符長的隨機密碼(帶有特殊字符),那么目前你的密碼可能是安全的。
?
所以這里采用MD5+鹽值的方法來加強密碼的安全性:
首先在項目中加入hutool的依賴,我們就可以使用這個類了
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>然后創建一個util工具包來存放我們的密碼工具類 PasswordUtil,
接下來,我們就可以直接使用hutool里面的IdUtil生成隨機鹽值,然后鹽值+密碼再進行MD5進行進一步的加密(因為常用$符進行分隔,這里也用$進行分割)
public static String encrypt(String password) {// 隨機鹽值String salt = IdUtil.simpleUUID();// 密碼(md5(隨機鹽值+密碼))String finalPassword = SecureUtil.md5(salt + password);return salt + "$" + finalPassword;}之后,我們需要進行“解密”,,驗證一下數據庫中加密的密碼是否達到了我們期待的結果
/*** 解密** @param password 要驗證的密碼(未加密)* @param securePassword 數據庫中的加了鹽值的密碼* @return*/public static boolean decrypt(String password, String securePassword) {boolean result = false;if (StringUtils.hasLength(password) && StringUtils.hasLength(securePassword)) {if (securePassword.length() == 65 && securePassword.contains("$")) {String[] securePasswordArr = securePassword.split("\\$");// 鹽值String slat = securePasswordArr[0];String finalPassword = securePasswordArr[1];// 使用同樣的加密算法和隨機鹽值生成最終加密的密碼password = SecureUtil.md5(slat + password);if (finalPassword.equals(password)) {result = true;}}}進行測試
public static void main(String[] args) {String password = "admin";String dbPassword = PasswordUtil.encrypt(password);System.out.println("加密密碼:" + dbPassword);boolean result = PasswordUtil.decrypt("123", dbPassword);System.out.println("對比結果1:" + result);boolean result2 = PasswordUtil.decrypt("123456", dbPassword);System.out.println("對比結果2:" + result2);}這樣我們就完成了這個類似單元測試的一個密碼加密工作,在以后的項目中都可以進行如此設置
總結
以上是生活随笔為你收集整理的项目中的MD5、盐值加密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360浏览器怎么开启翻译功能?
- 下一篇: webappbuilder改为不依赖po