SHA1: перевод реализации javascript на c # - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь войти в систему https://www.interactivebrokers.com/sso/Login с помощью клиента ac #.Есть шаг, который включает создание хэша sha1 из имени пользователя и пароля (https://www.interactivebrokers.com/sso/Templates/javascript/myxyz.js, строка 203):

innerHash = CalcSHA1(username + ":" + password);  

это вызывает (https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js, строка 113)

calcSHA1Blks(str2blks_SHA1(str);

и str2blks_SHA1 () определяется (https://www.interactivebrokers.com/sso/Templates/javascript/sha1.js, строка 28) как

/*
 * Convert a string to a sequence of 16-word blocks, stored as an array.
 * Append padding bits and the length, as described in the SHA1 standard.
 */
function str2blks_SHA1(str)
{
  var nblk = ((str.length + 8) >> 6) + 1;
  var blks = new Array(nblk * 16);
  for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
  blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
  blks[nblk * 16 - 1] = str.length * 8;
  return blks;
}

Я не настолько знаком с вещами SHA1, поэтому я не могускажите, является ли то, что в str2blks_SHA1 (), стандартным материалом, который выполняется автоматически внутри .net SHA1CryptoServiceProvider.ComputeHash (), или это то, что мне нужно сделать явно.Я попытался:

SHA1CryptoServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(userName + ":" + password))

, используя одно и то же имя пользователя и пароль в javascript и в .net, и, похоже, он дает другой результат.

Затем я попытался перенести эту функцию str2blks_SHA1 ()в C #, но я не понимаю, как создать массив байтов (blks) (что требуется SHA1CryptoServiceProvider.ComputeHash ()), так как кажется, что каждый элемент массива в blks может быть больше байта (просто глядя на str.длина * 8)) ...

Итак, уже есть какая-то реализация SHA1, которая делает то же самое, что и эта реализация javascript?Или, если мне действительно нужно реализовать это самостоятельно, как мне портировать str2blks_SHA1 ()?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 января 2011

Эта реализация JavaScript выглядит как стандартный алгоритм заполнения SHA-1 из RFC 3174 .Я получаю те же результаты (игнорируя незначительные различия в форматировании) при запуске:

// JavaScript
calcSHA1("username@example.com:p4ssw0rd");

, как и я:

// C#
using (SHA1 hash = SHA1.Create())
    Console.WriteLine(BitConverter.ToString(
        hash.ComputeHash(Encoding.ASCII.GetBytes("username@example.com:p4ssw0rd"))));

Какие данные вы предоставляете и какие (разные) результаты выполучать?

(Обратите внимание, что если ваше имя пользователя или пароль содержат символы, отличные от ASCII, я не удивлюсь, если JavaScript выдаст результат, отличный от C #, потому что он, похоже, не работает должным образомПреобразование UTF-8, в частности, предполагается, что каждый символ представляет собой всего один байт.)

0 голосов
/ 04 января 2011

Вы пытались установить SHA1 для InputBlockSize или OutputBlockSize?

...