前言:
專案中無論是密碼的儲存或者說判斷檔案是否是同一檔案,都會用到MD5演算法,今天來總結一下MD5加密演算法。
什麼是MD5加密?
MD5英文全稱“Message-Digest Algorithm 5”,翻譯過來是“訊息摘要演算法5”,由MD2、MD3、MD4演變過來的,是一種單向加密演算法,是不可逆的一種的加密方式。
其他幾種加密方式:
MD5加密有哪些特點?
-
壓縮性:任意長度的資料,算出的MD5值長度都是固定的。
-
容易計算:從原資料計算出MD5值很容易。
-
抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
-
強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。
MD5應用場景:
-
一致性驗證
-
數字簽名
-
安全訪問認證
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值
// 計算檔案的 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; }
或者採用nio的方式
public static String md5(File file) { String result = ""; FileInputStream in = null; try { in = new FileInputStream(file); MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(byteBuffer); 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加鹽
加鹽的方式也是多種多樣
-
string+key(鹽值key)然後進行MD5加密
- 用string明文的hashcode作為鹽,然後進行MD5加密
-
隨機生成一串字串作為鹽,然後進行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 ""; }
總結:
MD5加密簡單的總結到此為止。