MD5概述
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
128位二进制等于32位十六进制。每一位0~F。
方法
从掘金那篇文章复制的代码,加上了转换大写字母。
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.toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
分析
“test”用getBytes()
转换得到{116, 101, 115, 116}
顺序:
0:t=116
1:e=101
2:s=115
3:t=116
字符串的尾端在内存的高地址,就是高尾端,也叫大端。
用MessageDigest
转换成MD5后得到byte数组{9, -113, 107, -51, 70, 33, ……},总共16个字节。经过Integer.toHexString
转换得到098F6BCD4621D373CADE4E832627B4F6。
用在线工具计算得到的MD5是098F6BCD4621D373CADE4E832627B4F6,这是32位的十六进制数字,于我的计算结果一致。
为什么-113对应8F?
解:
正数可以直接计算十六进制
113=0X71=0111 0001
正数取反,再加1得到负数
-113=0X8F=1000 1111
加起来刚好等于0。
参考
Android 数据加密之 MD5 加密 - Android - 掘金 https://juejin.im/entry/57e3256aa3413100623c6ec2
Android 加密算法 - 简书 https://www.jianshu.com/p/c7ec2b8d103b
MD5_百度百科 https://baike.baidu.com/item/MD5
Android常用加密手段之MD5加密(字符串加密和文件加密) - frank 的专栏 - CSDN博客 https://blog.csdn.net/briblue/article/details/52984551
java的md5算法中,为什么要将每个字节都&0xff? - yulongkuke的博客 - CSDN博客 https://blog.csdn.net/yulongkuke/article/details/46607127
MD5在线加密/解密/破解 - 站长工具 http://tool.chinaz.com/tools/md5.aspx