Я пытаюсь сгенерировать HMAC-SHA256 для приложения, которое проверяет данные на своем сервере с помощью того же механизма, которому мы должны следовать.Идея состоит в том, чтобы хэшировать XML с заданным секретом и количеством итераций.Что я сделал до сих пор:
$file = 'TESTXML.xml';
$fp = fopen($file, "r");
$string = fread($fp,filesize($file));
$secret = 'somesecret';
$ctx = hash_init('sha256');
$sig = hash_hmac('sha256', $string, $secret);
for ($i=0; $i < 2481 ; $i++) {
hash_update($ctx, $sig);
}
$hash = hash_final($ctx, true);
echo base64_encode($hash);
Но вывод отличается от кода JAVA, предоставленного компанией, которая нуждается в этом.
Я знаю, что я близок к решениюно я чувствую, что упускаю что-то действительно глупое.
JAVA-код:
private static String generateHash(final InputStream is, final int iteration, final String key) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
Mac sha256_HMAC;
sha256_HMAC = Mac.getInstance(ALGORITHM);
final SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), ALGORITHM);
sha256_HMAC.init(secret_key);
byte[] bytesBuffer = new byte[2048];
int bytesRead = -1;
while ((bytesRead = is.read(bytesBuffer)) != -1) {
sha256_HMAC.update(bytesBuffer, 0, bytesRead);
}
byte[] digestValue = sha256_HMAC.doFinal();
for (int i = 0; i < iteration; i++) {
sha256_HMAC.reset();
digestValue = sha256_HMAC.doFinal(digestValue);
}
final String generatedHash = Base64.encodeBase64String(digestValue);
return generatedHash;
}