一、概述
MD5(Message Digest Algorithm 5),是一種散列算法,是不可逆的,即通過md5加密之后沒辦法得到原文,沒有解密算法。
在一般的項目中都會有登錄注冊功能,最簡單的,登錄注冊過程完全沒有加密,存儲在數據庫的密碼也是明文,安全性是很差的,萬一數據泄露就不好了(表一)。所以,通過MD5將密碼加密后保存在數據庫中(表二),在登錄的過程中后端將從前端獲取到的密碼加密,對照數據庫中已經加密的密碼。
但是一般加密算法固定,很容易破解,安全系數低,就我所知,有很多網站可以直接破解密文。為了提高安全性,可以采取加鹽的方式。生成一組隨機串,保存在數據庫中,然后混雜在原來的密碼中,再通過加密算法加密,存進數據庫中(表三)。
表一
表二
表三
至於MD5加密算法的底層原理,參考這篇博客:https://blog.csdn.net/sinat_27933301/article/details/79538169
二、代碼實現
Java有挺多關於MD5加密的方法,這里就用Spring中的 DigestUtils.md5DigestAsHex() 實現。
public class MD5Util { public String passwordEncryptor(String password){ return DigestUtils.md5DigestAsHex(password.getBytes()); } }
從前端獲取用戶輸入的用戶名,查找數據庫中的 salt,並混在用戶輸入的密碼中,這里我直接把 salt 加在后面
// 省略很多代碼,包括查找數據庫的代碼 String username = request.getParameter("username"); String password = request.getParameter("password"); String salt = impUserService.findSalt(username); String mdPassword = md5Util.passwordEncryptor(password + salt); User user = impUserService.find(username, mdPassword);
三、其他的問題
用戶登錄時的密碼需要在前端用js加密后再提交嗎?
我個人想法,應該是不用的。可能覺得前端明文傳輸給后端的話,過程中如果能被人截取到,那不是挺危險的。但是既然能獲取,那前端的加密算法也暴露了,所以感覺像是做無用功。當然這只是我個人想法,有知道的或者有其他想法的大佬跟我說一下哈哈哈。