Android傳輸數據時MD5加密解密詳解

Android傳輸數據時MD5加密解密詳解

一、特點

1.長度固定:不管多長的字符串,加密後長度都是一樣長。方便信息的統計和管理。

2.易計算:字符串和文件加密的過程容易。開發者很容易理解和做出加密工具。

3.抗修改:對原數據哪怕隻有一個字節的修改,得到的MD5值都有很大區別

4.不可逆:知道密文和加密方式,卻無法反向計算出原密碼。

註:

vmd5加密無法找回密碼,隻能修改密碼;

v在使用過成中,對比密碼是否正確,隻能把密碼md5加密後對照加密後的數據是否相同。

v在使用過成中,也可以建立一個大型的數據庫,把日常各個語句,通過MD5加密成密文,不斷積累大量的句子,放在一個龐大的數據庫裡,就可以拿著密文去數據庫查詢密碼。

二、MD5加密算法實現

1.計算字符串MD5值

思路過程:

vstr.getBytes():將字符串轉化為字節數組。字符串中每個字符轉換為對應的ASCII值作為字節數組中的一個元素。

v將字節數組通過固定算法轉換為16個元素的有符號哈希值字節數組

v將哈希字節數組的每個元素通過0xff與運算轉換為兩位無符號16進制的字符串

v將不足兩位的無符號16進制的字符串前面加0

v通過StringBuffer.append()或者StringBundle.append()將16個長度為2的無符號進制字符串合並為一個32位String類型的MD5碼

public static String md5(String str) {
if (TextUtils.isEmpty(str)) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(str.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解密的網站,不過破解機制采用窮舉法。就是我們平時所說的跑字典,如特點中所說的在一個大型的數據庫中查找對應的MD解密值。那麼,如何加大MD5破解難度?

1.對字符串多次MD5加密

public static String md5(String str, int times) {
if (TextUtils.isEmpty(str)) {
return "";
}
String md5 = md5(str);
for (int i = 0; i < times – 1; i++) {
md5 = md5(md5);
}
return md5(md5);
}

2.MD5“加鹽”

vstring+key(鹽值key)然後進行MD5加密

v用string明文的hashcode作為鹽,然後進行MD5加密

v隨機生成一串字符串作為鹽,然後進行MD5加密

public static String md5(String str, String key) {
if (TextUtils.isEmpty(str)) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest((str + key).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 "";
}

You May Also Like