客戶端MD5:HTTP在網絡上是使用明文傳輸,用戶輸入的明文密碼直接在網絡上傳輸太危險。因此,在客戶端須要進行一次MD5(明文+固定鹽)。數據庫
服務端:防止數據庫被入侵,被人經過彩虹表反查出密碼。因此服務端接受到後,也不是直接寫入到數據庫,而是生成一個隨機鹽,再進行一次MD5後存入數據庫。apache
一、引入依賴網絡
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency>
二、MD5Util工具類工具
public class MD5Util { /** * 加密方法 * @param src * @return */ public static String md5(String src) { return DigestUtils.md5Hex(src); } //固定鹽 private static final String salt = "1a2b3c4d"; /** * 將用戶輸入的明文密碼與固定鹽進行拼裝後再進行MD5加密 * @param inputPass * @return */ public static String inputPassToFormPass(String inputPass) { String str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4); System.out.println(str); return md5(str); } /** * 將form表單中的密碼轉換成數據庫中存儲的密碼 * @param formPass * @param salt 隨機鹽 * @return */ public static String formPassToDBPass(String formPass, String salt) { String str = ""+salt.charAt(0)+salt.charAt(2) + formPass +salt.charAt(5) + salt.charAt(4); return md5(str); } public static String inputPassToDbPass(String inputPass, String saltDB) { String formPass = inputPassToFormPass(inputPass); String dbPass = formPassToDBPass(formPass, saltDB); return dbPass; } }
三、前臺進行加密加密
//獲取密碼 var inputPass = $("#password").val(); //獲取固定鹽 var salt ="1a2b3c4d";
//進行拼裝
var str = ""+salt.charAt(0)+salt.charAt(2) + inputPass +salt.charAt(5) + salt.charAt(4);
//加密
var password = md5(str);
四、服務端spa
//獲取數據庫密碼 String dbPass = user.getPassword(); //獲取數據庫卡存儲鹽 String saltDB = user.getSalt(); //將前臺加密後的密碼轉換成數據庫存儲的二次加密密碼 String calcPass = MD5Util.formPassToDBPass(formPass, saltDB); //判斷是否相等 if(!calcPass.equals(dbPass)) { //我配置了全局異常處理器,會捕捉這裏的異常 throw new GlobalException(CodeMsg.PASSWORD_ERROR); }