SHA256 хешировал проверку пароля в javascript - PullRequest
2 голосов
/ 06 февраля 2012

Я пытаюсь конвертировать 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 #).

1 Ответ

1 голос
/ 06 февраля 2012

Поскольку вы говорите, что это серверная часть, я предполагаю, что Node, в этом случае:

https://github.com/brainfucker/hashlib

Если это что-то отличное от узла:

https://github.com/h2non/jsHashes

но это будет медленнее, чем первый, поскольку это чистая реализация JS (первая в C, доступная для JS)

...