最近经常用到MD5加密,所以觉得有必要好好了解一下原理,与生成方法。
MD5算法其实信息摘要算法,它接受任意大小的数据生成固定长度的哈希值。理论上加密数据无数个,生成的数列却是固定的,会出现重复值。但在工程学认为:错误概率低到一定程度就可以认为是工程可靠的。不过MD5还是适合一些简短的文本加密。
java中有MessageDigest这个类帮助处理数据。
MessageDigest不是new出来的,而是通过MessageDigest的静态方法getInstance("")实例化出来的。
MessageDigest md5 = MessageDigest.getInstance("MD5");
通过update()来处理字符
md5.update("123456".getBytes());
通过digest()生成摘要
byte[] digest = md5.digest();
得到的字节数组不易存贮,一般是转为16进制字符来存储。
一个字节占8bit,而4bit可以用一个16进制字符来表示。也就是一个字节可以转2个16进制字符。
0000 0000 -> 0 0
0001 0001 -> 1 1
0002 0002 -> 2 2
.
.
.
1110 1110 -> E E
1111 1111 -> F F
这里涉及一些位运算
字节的前4位: b>>4 & 0xf
字节的后4位: b & 0xf
因此可以使用下面的转法:
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(Integer.toHexString(b>>4 & 0xf));
sb.append(Integer.toHexString(b & 0xf));
}
输出拼接的字符
e10adc3949ba59abbe56e057f20f883e
完整实例
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update("123456".getBytes());
byte[] digest = md5.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
sb.append(Integer.toHexString(b>>4 & 0xf));
sb.append(Integer.toHexString(b & 0xf));
}
System.out.println(sb.toString());
尊重作者,转载请注明出处!
版权申明:本文版权归作者所有,未经授权,任何单位或个人不得以任何形式转载、摘编或利用其它方式使用本博客内容。作者保留追究相关法律责任的权利。如需使用博客内容,请与作者联系获得授权。感谢对本文的尊重与支持。
免责声明:本网站所载内容仅供参考,不构成任何专业建议。用户基于本网站内容作出的决策,风险自担。对于因使用本网站内容而产生的任何直接或间接损失,本网站不承担任何责任。请用户审慎判断,理性使用。