我注意到我的很多谷歌搜索都把我带到了这里,所以我想也许我可以借用你的聪明才智:)
作为我三年级学位论文的一部分,我正在为移动设备(以及用于登录的网站)开发一次性密码生成器。
使用 org.bouncycastle.crypto.digests.MD5Digest 库,我正在获取一个字节数组(来自字符串用户输入),然后将其散列 X 次。这也称为菊花链散列字符串或加密方法。
我的问题是,如果字符串被散列一次,那么它正确地散列它,但是如果新的散列再次被散列,结果是不正确的。
请参见下面的代码:
private String generateHash(String OTP, int loopNum)
{
byte[] secretBytes = OTP.getBytes();
for (int x = 0; x < loopNum; x++)
{
byte[] tempStore = new byte[16];
tempStore = hash(secretBytes);
secretBytes = tempStore;
}
return convertToHex(secretBytes);
}
public byte[] hash(byte[] secretBytes)
{
org.bouncycastle.crypto.digests.MD5Digest digest = new org.bouncycastle.crypto.digests.MD5Digest();
digest.reset();
// Update MD5 digest with user secret in byte format
digest.update(secretBytes, 0, secretBytes.length);
// get length of digest to initialise new md5 byte array
int length = digest.getDigestSize();
// create md5 byte array using length
byte[] md5 = new byte[length];
// calculate MD5 hash, using md5 byte array, 0 for buffer offset
digest.doFinal(md5, 0);
return md5;
}
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
String Hex;
String formattedHex;
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] <<< 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a'+ (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
Hex = buf.toString();
formattedHex = "\n" + Hex.substring(0, 4) + " " + Hex.substring(4, 8) + " " + Hex.substring(8, 12) + " "
+ Hex.substring(12, 16) + " " + Hex.substring(16, 20) + " " +Hex.substring(20, 24) + " "
+ Hex.substring(24, 28) + " " + Hex.substring(28, 32);
return formattedHex;
}
我认为两者都是;
- 摘要未返回正确的字节数组
- 十六进制转换器错误地转换了这个
我使用以下秘密进行测试:A 具有以下 MD5 输出:
- 7fc56270e7a70fa81a5935b72eacbe29
- 8f28f2e7231860115d2a8cacba019dbe(这应该是 4cbd6d53280de25e04712c7434a70642)
非常感谢您提前提供的帮助:)
ps 我正在对照 PHP md5 检查它,这也可能是一个问题吗?