MD5工具類(含16位、32位、加鹽、無鹽、大小寫)


什么是MD5

MD5(Message-Digest Algorithm 5),即消息摘要算法第五版,是一種被廣泛使用的密碼散列函數。散列算法的基礎原理是:將數據(如一段文字)運算演變為另一段固定長度(16/32)的值。

 

是否屬於加密算法

說法不一:

     1.不屬於:沒有解密算法,密文(散列值)不可逆向得到原文;
     2.屬於:明文經MD5處理后看不到原文,視為加密狀態,類似BASE64算法只能算編碼算法。

 

MD5用途

1.防止被篡改:
如發送電子文檔、接口數據傳輸、文件下載等,為了第三方在中途對數據進行篡改。

2.防止直接看到明文:
數據庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算得到數據庫的用戶密碼的MD5值,也無法知道用戶的密碼。

3.防止抵賴(數字簽名):
這需要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息並做好記錄。若以后A說這文件不是他寫的,權威機構只需對此文件重新產生摘要信息,然后跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數字簽名”。

MD5安全性

比較完全,但是也有部分密碼是可以暴力破解(撞庫),因為很多用戶的密碼都使用生日、紀念日、吉利的數字、英文單詞等。所以網站密碼的策略應該強制要求用戶使用字母+數字+特殊字符+大小寫混搭的組合的方式提高密碼的安全度。

 

MD5工具類

廢話不多嘮,直接上代碼,含注釋:

package com.common.utils.md5;
 
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
 
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.poi.util.IOUtils;
 
/**
* @ClassName: MD5Util
* @Description:MD5加密/驗證工具類
* @author weny.yang
* @date May 11, 2021
*/
public class MD5Util {
    
    /**
     * @Title: md5Lower
     * @Description:不加鹽值32位小寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Lower(String plainText) {
        String md5 = null;
        if (null != plainText && !"".equals(plainText)) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(plainText.getBytes("UTF-8"));
                md5 =  new BigInteger(1, md.digest()).toString(16);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return md5;
    }
    
    /**
     * @Title: md5Lower
     * @Description:加鹽值32位小寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Lower(String plainText, String saltValue) {
        String md5 = null;
        if (null != plainText && !"".equals(plainText) && null != saltValue && !"".equals(saltValue)) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(plainText.getBytes("UTF-8"));
                md.update(saltValue.getBytes("UTF-8"));
                md5 = new BigInteger(1, md.digest()).toString(16);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return md5;
    }
    
    /**
     * @Title: md5_16Lower
     * @Description:不加鹽值16位小寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Lower(String plainText) {
        String md5 = md5Lower(plainText);
        return null==md5?md5:md5.substring(8, 24);
    }
    
    /**
     * @Title: md5_16Lower
     * @Description:加鹽值16位小寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Lower(String plainText, String saltValue) {
        String md5 = md5Lower(plainText, saltValue);
        return null==md5?md5:md5.substring(8, 24);
    }
    
    /**
     * @Title: md5_16Upper
     * @Description:不加鹽值16位大寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Upper(String plainText) {
        String md5 = md5_16Lower(plainText);
        return null==md5?md5:md5.toUpperCase();
    }
 
    /**
     * @Title: md5_16Upper
     * @Description:加鹽值16位大寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Upper(String plainText, String saltValue) {
        String md5 = md5_16Lower(plainText, saltValue);
        return null==md5?md5:md5.toUpperCase();
    }
 
    /**
     * @Title: md5Upper
     * @Description:不加鹽值32位大寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Upper(String plainText) {
        String md5 = md5Lower(plainText);
        return null==md5?md5:md5.toUpperCase();
    }
    
    /**
     * @Title: md5Upper
     * @Description:加鹽值32位大寫
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Upper(String plainText, String saltValue) {
        String md5 = md5Lower(plainText, saltValue);
        return null==md5?md5:md5.toUpperCase();
    }
    
    
 
    public static void main(String[] args) {
        String plainText = "123456";//明文
        String saltValue = "8";//鹽值
 
        System.out.println(md5_16Lower(plainText));
        System.out.println(md5_16Upper(plainText));
        System.out.println(md5Lower(plainText));
        System.out.println(md5Upper(plainText));
        System.out.println("====================");
        System.out.println(md5_16Lower(plainText, saltValue));
        System.out.println(md5_16Upper(plainText, saltValue));
        System.out.println(md5Lower(plainText, saltValue));
        System.out.println(md5Upper(plainText, saltValue));
    }
}

 

 

轉載:https://blog.csdn.net/duoyu779553/article/details/116720451

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM