JAVA對字符串進行32位MD5加密的實踐

MD5簡單介紹

MD5 加密後的位數有兩種:16 位與 32 位。默認使用32位。 (16 位實際上是從 32 位字符串中取中間的第 9 位到第 24 位的部分)為提高安全性。根據業務需求,可以對md5 添加偏移量。如對原有字符拼接指定位數的字符串。

MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸完整一致。MD5由美國密碼學傢羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規范。1996年後該算法被證實存在弱點,可以被加以破解,對於需要高度安全性的數據,專傢一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用於安全性認證,如SSL公開密鑰認證或是數字簽名等用途。

大傢都知道,地球上任何人都有自己獨一無二的指紋,這常常成為公安機關鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數量)產生一個同樣獨一無二的“數字指紋”,如果任何人對文件做瞭任何改動,其MD5值也就是對應的“數字指紋”就會發生變化。

MD5算法具有以下特點

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。

2、容易計算:從原數據計算出MD5值很容易。

3、抗修改性:對原數據進行任何改動,哪怕隻修改1個字節,所得到的MD5值都有很大區別。

4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。

代碼1

public static void main(String[] args) {
    String s ="202111012231046012000000111101705104827";
    for (int i = 0; i <50 ; i++) {
        System.out.println( EncodeByMD5(s).toUpperCase()+"   長度"+EncodeByMD5(s).toUpperCase().length());
    }
}

/**
 * 對字符串進行32位MD5加密
 * @param str
 * @return
 */
public static String EncodeByMD5(String str) {
    try {
        // 生成一個MD5加密計算摘要
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 計算md5函數
        md.update(str.getBytes("UTF-8"));
        // digest()最後確定返回md5 hash值,返回值為8為字符串。因為md5 hash值是16位的hex值,實際上就是8位的字符
        // BigInteger函數則將8位的字符串轉換成16位hex值,用字符串來表示;得到字符串形式的hash值
        String md5=new BigInteger(1, md.digest()).toString(16);
        //BigInteger會把0省略掉,需補全至32位
        return fillMD5(md5);
    } catch (Exception e) {
        throw new RuntimeException("MD5加密錯誤:"+e.getMessage(),e);
    }
}

private static String fillMD5(String md5){
    //如果不夠32位則回調自身補零,最後返回32位長度的簽名
    return md5.length()==32?md5:fillMD5("0"+md5);
}

MD5Util

package com.kuang.jiami;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {
    //待加密的密碼
    public static String password = "202111012231046012000000111101705104829";

    public static void main(String args[]) {
        //結果字符串
        String result = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes());
            byte b[] = md.digest();
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            result = buf.toString();
            System.out.println("MD5(" + password + ",32小寫) = " + result);
            System.out.println("MD5(" + password + ",32大寫) = " + result.toUpperCase());
            System.out.println("++++++++++++++++++++++++各位大哥借過+++++++++++++++++++++++");
            System.out.println("MD5(" + password + ",16小寫) = " + buf.toString().substring(8, 24));
            System.out.println("MD5(" + password + ",16大寫) = " + buf.toString().substring(8, 24).toUpperCase());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

MD5Helper

package com.kuang.jiami;

import java.security.MessageDigest;


public class MD5Helper {

    public static String encrypt32(String encryptStr) {
        MessageDigest md5;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] md5Bytes = md5.digest(encryptStr.getBytes());
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < md5Bytes.length; i++) {
                int val = ((int) md5Bytes[i]) & 0xff;
                if (val < 16)
                    hexValue.append("0");
                hexValue.append(Integer.toHexString(val));
            }
            encryptStr = hexValue.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return encryptStr;
    }
    
    public static String encrypt16(String encryptStr) {
        return encrypt32(encryptStr).substring(8, 24);
    }

    public static void main(String[] args) {
        String encryptStr = "202111012231046012000000111101705104829";
        System.out.println(MD5Helper.encrypt32(encryptStr).toUpperCase());
        System.out.println(MD5Helper.encrypt16(encryptStr).toUpperCase());
    }
}

到此這篇關於JAVA對字符串進行32位MD5加密的實踐的文章就介紹到這瞭,更多相關JAVA 字符串32位MD5加密內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: