Я пытаюсь конвертировать ac # программу в javascript.Цель состоит в том, чтобы проверить открытый текстовый пароль по его хэшу sha-256, хранящемуся в базе данных.Этот код будет выполняться на стороне сервера.
Программа c # была реализована в соответствии со статьей MSDN Как хэшировать пароли .
Чтобы проверить мою реализацию, мне дали пример хэша для пароля «test» со случайно сгенерированной солью длиной 4 символа.
Вот что я написал до сих пор:
var unhashedPass = "test";
var originalHashedPass = "F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0B81F764E443C68B0E9808096CDF2D";
var saltStringLength = 4;
var unicodeCharLength = 2;
var saltHexLength = unicodeCharLength * saltStringLength;
var saltHex = originalHashedPass.substr(0, saltHexLength);
var strSalt1 = String.fromCharCode(parseInt(saltHex.substr(0, 2), 16).toFixed());
var strSalt2 = String.fromCharCode(parseInt(saltHex.substr(2, 2), 16).toFixed());
var strSalt3 = String.fromCharCode(parseInt(saltHex.substr(4, 2), 16).toFixed());
var strSalt4 = String.fromCharCode(parseInt(saltHex.substr(6, 2), 16).toFixed());
//var strSalt = str2rstr_utf16le(strSalt1 + strSalt2 + strSalt3 + strSalt4);
var strSalt = strSalt1 + strSalt2 + strSalt3 + strSalt4;
var finalHash = saltHex + hex_sha256(strSalt + unhashedPass).toUpperCase();
return (finalHash == originalHashedPass);
Этот код является одним из нескольких вариантов, которые я пробовал, пытаясь преобразовать шестнадцатеричную соль в допустимую строку (см. Строку с комментариями, например).Казалось, что ничего не работает.
hex_sha256 и функции str2rstr_utf16le происходят из этой реализации SHA javascript
Я предполагаю, что часть c #, которую мне не удалось правильно "перевести" в javascript, - это преобразованиесоли в строку.
binarySaltValue[0] = byte.Parse(saltValue.Substring(0, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[1] = byte.Parse(saltValue.Substring(2, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[2] = byte.Parse(saltValue.Substring(4, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[3] = byte.Parse(saltValue.Substring(6, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
Я заметил, что реализация c # использует массив байтов, но я думаю, что я должен использовать строки в JavaScript.
Мне также интересно, если моя проблема имеетчто-то связанное с тем, что программа на c # вычисляет строки в кодировке Unicode.
Есть ли у вас какие-либо предложения?
РЕДАКТИРОВАТЬ
Чтобы прояснить мою проблему: я не могу проверить в JavaScript пароль«проверить» его соленый хеш SHA256 «F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0B81F764E443C68B0E9808096CDF2D» (вычислено ранее в программе ac #).