MD5加密
1、什么是MD5
MD5全名: Message Digest Algorithm MD5(中文名为消息摘要算法第五版)。MD5算法具有如下特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的(16位或32位)。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
2、工具计算MD5
MD5在线加密 - 站长工具
MD5在线加密
3、Java String生成MD5
Java将字符串转成MD5,用来保存一些数据,而不能用明文保存,比如LruCache中的key。很多语言内部已经实现了MD5算法。
3.1、Java方法一
public static String getMD5(String source) {
String s = null;
// 用来将字节转换成 16 进制表示的字符
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
java.security.MessageDigest md = java.security.MessageDigest
.getInstance("MD5");
md.update(source.getBytes());
byte[] tmp = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
// 用字节表示就是 16 个字节
char[] str = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
// 所以表示成 16 进制需要 32 个字符
int k = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
// 转换成 16 进制字符的转换
byte byte0 = tmp[i]; // 取第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
// >>>
// 为逻辑右移,将符号位一起右移
str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
}
s = new String(str); // 换后的结果转换为字符串
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
3.2、Java方法二
/**
* Encodes a string to MD5
*
* @param str String to encode
* @return Encoded String
* @throws NoSuchAlgorithmException
*/
public static String toMD5(String str) {
if (str == null || str.length() == 0) {
throw new IllegalArgumentException("String to encript cannot be null or zero length");
}
StringBuilder hexString = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte[] hash = md.digest();
for (byte b : hash) {
if ((0xff & b) < 0x10) {
hexString.append("0").append(Integer.toHexString((0xFF & b)));
} else {
hexString.append(Integer.toHexString(0xFF & b));
}
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return hexString.toString();
}
参考资料:
Java中String生成MD5
How To Find Weak Input Differences For MD5 Collision Attacks
精彩的人生需要浪漫、无畏和勇气。