Генерация хеша HMAC-SHA256 с итерацией, чтобы сделать его еще сложнее - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь сгенерировать 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;
    }
...