我非常无聊所以我正在制作一个实验性的Brute Forcer。但是,我遇到了MD5的一些问题。我得到两个非常不同的输出,
1aabac6d068eef6a7bad3fdf50a05cc8
-7d881f6ef28afe6a4bb78689e91f6e53
第一个有效且为dd
,第二个无效,即使我删除了前导连字符。
我正在查看this answer,我调整了解决了我的主要问题,但我仍然得到了无效的MD5。
我的代码:
public boolean testValidity(String s) {
try {
MessageDigest md = MessageDigest.getInstance(name());
byte[] hashDigest = md.digest(s.getBytes("UTF-8"));
String hash = String.format("%032x", new BigInteger(md.digest(s.getBytes("UTF-8"))));
System.out.println(hash);
return getCompare().equalsIgnoreCase(hash);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException | NullPointerException e) {
e.printStackTrace();
return false;
}
}
在上文中,name()
只获取"MD5"
,getCompare()
获取哈希值以进行比较。
我的问题是,如何修复我的代码以确保所有MD5都有效?
答案 0 :(得分:2)
你的BigInteger构造函数使用二进制补码。使用符号/幅度变量代替第一个参数1. http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#BigInteger(int,%20byte[])