我正在使用一个登录框架,该框架根据SQL数据库中的密码检查用户输入密码。我将文本转换为MD5以使用以下
存储在数据库中 HASHBYTES('MD5', 'JavaTest')
这就产生了5E58D71FBD6D17577AAAB8711264A813。
然后在java中我使用以下代码尝试将相同的密码“JavaTest”转换为MD5进行比较。
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(password.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1, digest);
hashText = bigInt.toString();
但是产生了字符串150157350912923000195076232128194914284
我做错了什么?
编辑:我不相信这是重复的,因为我已经研究了答案,它已经让我这么远,但我无法弄清楚我做错了什么。答案 0 :(得分:1)
只需将radix参数传递给bigInt.toString
即可。如果您需要十六进制表示传递16作为基数,如下所示:
hashText = bigInt.toString(16);
public String toString(int radix)
返回String的String表示形式 给定基数中的这个BigInteger。如果基数超出范围 从Character.MIN_RADIX到Character.MAX_RADIX,包括它 默认为10(与Integer.toString的情况一样)。该 使用Character.forDigit提供的数字到字符映射,和 如果合适,可以添加减号。 (这种表示是 与(String,int)构造函数兼容。)
<强>参数:强>
基数 - 字符串表示的基数。返回:表示的字符串 这个BigInteger在给定的基数中。
此外,你可以构建没有BigInteger的十六进制字符串形式的摘要字节数组,如下所示:
public static String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for(byte b : bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}