最近接触java,需要用md5加密一个字符串,找了半天没找到现成的方法,
自己实现 #(错误示例)
String str = "1234567890";//目标
MessageDigest instance;
try {
//获取 MD5实例
instance = MessageDigest.getInstance("MD5");
//str.getBytes() 获取目标的字节数组
//instance.digest() 加密方法 ,会返回一个有16个元素的字节数组
byte[] byteArray = instance.digest(str.getBytes());
StringBuffer result = new StringBuffer();
//遍历加密结果
for (byte b : byteArray) {
//每个字节转成两个十六进制数
result.append(Integer.toHexString(b & 0xFF));
}
System.out.println(result);
//结果 e87f1fcf82d132f9bb018ca6738a19f
//正确 e807f1fcf82d132f9bb018ca6738a19f
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
坑爹的输出结果竟然是31位,明显不对
分析
问题出在把字节转成两个十六进制数的时候.
转换后十六进制的 07
在拼接时 0
会被舍去. 所以少了一位.
解决
转换时判断长度,小于2位在前边补0
最终代码如下
public void test() {
String str = "1234567890";
MessageDigest instance;
try {
instance = MessageDigest.getInstance("MD5");
byte[] byteArray = instance.digest(str.getBytes());
StringBuffer result = new StringBuffer();
for (byte b : byteArray) {
result.append(
//小于2位在前边补0
(Integer.toHexString(b & 0xFF).length() == 2 ) ?
Integer.toHexString(b & 0xFF) :
'0' + Integer.toHexString(b & 0xFF)
);
}
System.out.println(result);
//e807f1fcf82d132f9bb018ca6738a19f
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
php中只要调用一个方法
<?php
echo md5('1234567890').PHP_EOL;
//结果 e807f1fcf82d132f9bb018ca6738a19f
#PHP是世界上最好的语言!
网友评论