Я заметил, что многие мои поисковые запросы в Google приводили меня сюда, поэтому я подумал, что, возможно, я смогу позаимствовать ваши подходящие умы :)
Я работаю над генератором одноразовых паролей для мобильного устройства (а также над веб-сайтом для входа) в рамках своей диссертации на третьем курсе.
Используя библиотеку 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;
}
Я думаю, что это тоже;
- Дайджест не возвращает правильный массив байтов
- Конвертер Hex неправильно конвертирует это
Я тестирую, используя секрет: A, который имеет следующие выходы MD5:
- 7fc56270e7a70fa81a5935b72eacbe29
- 8f28f2e7231860115d2a8cacba019dbe (это должно быть 4cbd6d53280de25e04712c7434a70642)
Заранее большое спасибо за вашу помощь :)
p.s. Я проверяю его по PHP md5. Может ли это быть проблемой?