Мне нужно создать алгоритм хэширования javascript, такой же, как Symfony 3 encodePassword.
Это было похоже на проблему, но в symfony3:
Функция кодировки пароля Symfony2 в Javascript
это создать дайджест сообщения для проверки конечной точки отдыха с заголовками wsse в Symfony и fosbundle в почтальоне.
Мне удалось упростить и дублировать хеширующую функцию Symfony в PHP
$pass = "hello";
$salt = "";
$iterations=5000;
echo $this->encoder->encodePassword($pass,$salt);
//contains: U5xyFq7KQU1CWeX3UcLB0mwWZZQUq0PL8U+GLWomfGW/WQWxxGLi+0ifhmnlw/gQ5pPjNNZV1/q8kMVpAXsFZw==
//simplyfying and replicating the hashing algo in php with same pass/salt:
$salted = $pass.$salt;
$digest = hash("sha512", $salted, true);
for($i=1; $i<$iterations; $i++) {
$digest = hash("sha512", $digest.$salted, true);
}
echo base64_encode($digest);
//contains: U5xyFq7KQU1CWeX3UcLB0mwWZZQUq0PL8U+GLWomfGW/WQWxxGLi+0ifhmnlw/gQ5pPjNNZV1/q8kMVpAXsFZw==
но попытка воспроизвести его в javascript с помощью CryptoJS оказывается проблематичной. Я подозреваю, что это связано и с кодировкой символов.
в соответствии с https://code.google.com/archive/p/crypto-js/#The_Hasher_Input
Алгоритмы хеширования принимают либо строки, либо экземпляры
CryptoJS.lib.WordArray [...] массив 32-битных слов. Когда вы передаете
строка, она автоматически преобразуется в WordArray, закодированный как UTF-8.
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>password = 'hello';
//attempt 1 use hex converted pass
hexpass = CryptoJS.enc.Utf8.parse(password);
digest = CryptoJS.SHA512(hexpass);
for (i = 1; i < 5000; ++i) {
hexvar = CryptoJS.SHA512(digest + hexpass);
}
digest = digest.toString(CryptoJS.enc.Base64);
console.log(digest);
// need hash to contain: U5xyFq7KQU1CWeX3UcLB0mwWZZQUq0PL8U+GLWomfGW/WQWxxGLi+0ifhmnlw/gQ5pPjNNZV1/q8kMVpAXsFZw==
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
Я пробовал много разных способов сначала преобразовать в массив слов и т. Д., Но, похоже, ни один из них не дал такой же хэш
https://jsfiddle.net/munkiepus/awdoq4kL/34/
РЕДАКТИРОВАТЬ: я думаю, что проблема в том, что PHP использует некоторую форму необработанных двоичных файлов
вывод результата $digest = hash("sha512", $salted, true);
на терминал показывает:
▒q▒ $ ▒b▒x] ▒▒j▒▒ = s1▒▒
▒▒▒▒▒% г <▒ ## ▒ ▒▒ | z▒n▒▒▒
FcG.:▒▒os▒▒▒C</p>
так что, возможно, это не возможно в JS в конце концов. если дайджест был закодирован в читаемую строку во время каждой итерации, то это возможно, как в связанном примере.