前言算法
項目中不管是密碼的存儲或者說判斷文件是不是同一文件,都會用到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 "";
}複製代碼