package ewa;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.math.BigInteger;
/**
*
* @author Lotus
*/
public class md5Hash {
public static void main(String[] args) throws NoSuchAlgorithmException {
String test = "abc";
MessageDigest md = MessageDigest.getInstance("MD5");
try {
md.update(test.getBytes("UTF-8"));
byte[] result = md.digest();
BigInteger bi = new BigInteger(result);
String hex = bi.toString(16);
System.out.println("Pringting result");
System.out.println(hex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(md5Hash.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我正在测试字节到十六进制的转换,完成后,最终结果在字符串的开头有一个减号,为什么会发生这种情况?我已阅读文档,并说它会添加一个减号,但我不明白。减号会影响哈希结果吗?因为我要将它实现为存储在我的数据库中的哈希密码
答案 0 :(得分:8)
因为BigInteger
恰好为负数,意味着最重要的位为1.如果您想要正数,请使用sign-magnitude constructor:
new BigInteger(1, result)
我不清楚为什么要实现自己的MD5哈希包装器。为什么不能将哈希存储为BINARY或BLOB?
答案 1 :(得分:0)
BigIntegers签约。在字节表示中,如果设置了最高位,则显示为负数。解决这个问题的一种方法可能是在数组的开头附加一个0。