Я заметил, что многие из моих поисков в Google привели меня сюда, поэтому я подумал, что, возможно, смогу позаимствовать ваши умные способности :)
Я работаю над генератором одноразовых паролей для мобильного устройства (а также веб-сайт для входа в систему) как часть моей дипломной работы на третьем курсе.
Используя библиотеку org.bouncycastle.cigpto.digests.MD5Digest, я беру массив байтов (из пользовательского ввода строки), затемхэширование X разЭто также известно как цепочка хеш-строк с последовательным подключением или метод шифрования lamports.
Моя проблема заключается в том, что если строка хешируется один раз, то она правильно хешируется, однако, если новый хэш хэшируется снова, результат неверен.
См. Код ниже:
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
- 8f28f2e7231860115d2a8beba4cbd6d53280de25e04712c7434a70642)
Большое спасибо за вашу помощь заранее:)
ps Я проверяю это на PHP md5, это также может быть проблемой?