Md5加密原理

前言算法

項目中不管是密碼的存儲或者說判斷文件是不是同一文件,都會用到md5算法,下面來總結一下md5加密算法。安全

什麼是MD5加密算法?加密

Md5英文全稱‘Message-Digest Algorithm 5’翻譯過來是‘消息摘要算法5’有md2,md3,md4演變過來的,是一種單項加密算法,是不可逆的一種加密方式。spa

Md5加密有特色?翻譯

1.壓縮性: 任意長度的數據,算出的md5值長度都是固定的code

2.容易計算:從元數據計算出md5值很容易。md5

3.抗修改性:對原數據進行任何改動,哪怕只修改一個字節,所獲得的md5值都有 很大的區別。字符串

4.搶抗碰撞:已知原數據和其md5值,想找到一個巨頭相同md5值的數據(僞造數據) 是很是困難的。get

MD5應用場景: 1.一致性驗證 2.數字簽名 3.安全訪問認證string

MD5加密算法實現: 1.計算字符串md5值

public static String md5(String string) {
    if (TextUtils.isEmpty(string)) {
        return "";
    }
    MessageDigest md5 = null;
    try {
        md5 = MessageDigest.getInstance("MD5");
        byte[] bytes = md5.digest(string.getBytes());
        String result = "";
        for (byte b : bytes) {
            String temp = Integer.toHexString(b & 0xff);
            if (temp.length() == 1) {
                temp = "0" + temp;
            }
            result += temp;
        }
        return result;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}
複製代碼

2.計算文件的md5值 public static String md5(File file) { if (file == null || !file.isFile() || !file.exists()) { return ""; } FileInputStream in = null; String result = ""; byte buffer[] = new byte[8192]; int len; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); in = new FileInputStream(file); while ((len = in.read(buffer)) != -1) { md5.update(buffer, 0, len); } byte[] bytes = md5.digest();

for (byte b : bytes) {
            	String temp = Integer.toHexString(b & 0xff);
            	if (temp.length() == 1) {
                	temp = "0" + temp;
            	}
            	result += temp;
        	}
    	} catch (Exception e) {
        	e.printStackTrace();
   	 	}finally {
        	if(null!=in){
            	try {
                	in.close();
            	} catch (IOException e) {
                	e.printStackTrace();
            	}
       	 }
    	}
    	return result;
	}
複製代碼

MD5加密安全性討論 雖說md5加密自己是不可逆的,但並非不可破譯的,網上有管md5 解密的資料數不勝數,破解及價值採用窮舉法,就是咱們平時說的跑字典,因此如何才能加大md5破解的難度呢?

1.對字符串屢次md5加密

public static String md5(String string, int times) {
    if (TextUtils.isEmpty(string)) {
        return "";
    }
    String md5 = md5(string);
    for (int i = 0; i < times - 1; i++) {
        md5 = md5(md5);
    }
    return md5(md5);
}
複製代碼

2.md5加鹽 加鹽的方式也是多種多樣 1.string+key 而後進行md5加密 2.用string銘文的hashcode做爲鹽,而後進行md5加密 3.隨機生成遺傳字符串做爲鹽,而後進行md5加密

public static String md5(String string, String slat) {
    if (TextUtils.isEmpty(string)) {
        return "";
    }
    MessageDigest md5 = null;
    try {
        md5 = MessageDigest.getInstance("MD5");
        byte[] bytes = md5.digest((string + slat).getBytes());
        String result = "";
        for (byte b : bytes) {
            String temp = Integer.toHexString(b & 0xff);
            if (temp.length() == 1) {
                temp = "0" + temp;
            }
            result += temp;
        }
        return result;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}複製代碼
相關文章
相關標籤/搜索