【web安全】-- springboot實現兩次MD5加密

1、爲何要作兩次MD5

客戶端MD5:HTTP在網絡上是使用明文傳輸,用戶輸入的明文密碼直接在網絡上傳輸太危險。因此,在客戶端須要進行一次MD5(明文+固定鹽)。數據庫

服務端:防止數據庫被入侵,被人經過彩虹表反查出密碼。因此服務端接受到後,也不是直接寫入到數據庫,而是生成一個隨機鹽,再進行一次MD5後存入數據庫。apache

2、具體步驟

一、引入依賴網絡

<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); }
相關文章
相關標籤/搜索