Возможно ли бинарное хеширование с помощью CryptoJS?

Я хочу создать HOTP-клиент с помощью javascript, аналогичного SpeakEasy.

Вышеупомянутая библиотека предназначена для использования javascript на стороне сервера и использует NodeJS.

Я хочу сделать то же самое на внешнем javascript в браузере, но мне не удалось использовать CryptoJS для достижения такого поведения.

         var key = "abc";
         var counter = "123";

         // create an octet array from the counter
         var octet_array = new Array(8);

         var counter_temp = counter;

         for (var i = 0; i < 8; i++) {
             var i_from_right = 7 - i;

             // mask 255 over number to get last 8
             octet_array[i_from_right] = counter_temp & 255;

             // shift 8 and get ready to loop over the next batch of 8
             counter_temp = counter_temp >> 8;
         }

        // There is no such class called as Buffer on Browsers (its node js)
         var counter_buffer = new Buffer(octet_array);

         var hash = CryptoJS.HmacSHA1(key,counter_buffer);

         document.write("hex value "+ hash);
         document.write("hash value "+    CryptoJS.enc.Hex.stringify(hash));

Я знаю, что это возможно на нативной платформе, такой как java (android) или target c (ios). Вот соответствующая реализация HOTP в Objective C, но я сомневаюсь, что это возможно сделать в веб-интерфейсе.

Кроме того, я очень сомневаюсь, что такая вещь безопасна в браузере, потому что javascript можно просматривать в любом браузере. Любые предложения входов были бы полезны. Я делаю это для POC. Мне любопытно, использовал ли кто-нибудь Hotp на веб-платформе.


person Kunal Balani    schedule 29.06.2015    source источник
comment
Какой хеш вы хотите   -  person Drew    schedule 29.06.2015
comment
@DrewPierce В идеале я хотел бы использовать sha512   -  person Kunal Balani    schedule 29.06.2015
comment
caligatio.github.io/jsSHA   -  person Drew    schedule 29.06.2015
comment
@DrewPierce Я использовал его. Однако ввод этих функций является строкой. Мой ввод в хэш-функцию - это не строка, а двоичные данные. Так что результаты не равнозначны.   -  person Kunal Balani    schedule 29.06.2015
comment
@DanielAranda, мой вопрос отличается от этого. Я хочу знать, возможно ли это сделать с точки зрения наличия hotp на веб-интерфейсе.   -  person Kunal Balani    schedule 29.06.2015


Ответы (2)


Нет такого языка, который бы поддерживал строки двоичных данных в коде. Вам нужно закодировать двоичные данные в какой-либо формат, такой как Hex или Base64, и позволить CryptoJS декодировать их в собственный внутренний двоичный формат, который вы затем можете передать различным функциям CryptoJS:

var wordArrayFromUtf = CryptoJS.enc.Utf8.parse("test");
var wordArrayFromHex = CryptoJS.enc.Hex.parse("74657374"); // "test"
var wordArrayFromB64 = CryptoJS.enc.Base64.parse("dGVzdA=="); // "test"

Другие функции:

wordArrayFromHex.toString(CryptoJS.enc.Utf8)  // "test"
CryptoJS.enc.Utf8.stringify(wordArrayFromB64) // "test"

Если вы передаете строку в функцию CrypoJS (не здесь), предполагается, что это строка в кодировке Utf8. Если вы этого не хотите, вам нужно расшифровать его самостоятельно.

person Artjom B.    schedule 29.06.2015

Код на http://caligatio.github.io/jsSHA/ отлично работает для SHA-512.

Отбросьте файлы .js, посмотрите в их test/test.html строку 515. Это может показаться вам строкой, но это двоичный шестнадцатеричный код.

Таким образом, их ввод является двоичным, что безошибочно. Не зацикливайтесь на том факте, что он сидит на большой цепочке.

person Drew    schedule 29.06.2015
comment
Кстати, я предоставляю это, чтобы показать клиентскую сторону без учета ключей, запеченных в .js, что, конечно, глупо. Что касается темы безопасности, выясните, где фигурирует SSL. SSL для начала снял бы весь этот вопрос. - person Drew; 29.06.2015
comment
есть веская причина, по которой вы видите это на узле, а не на стороне клиента. Это типичное использование на стороне сервера, скажем, php или nodeJs. Для клиентской стороны можно использовать открытый ключ сервера pki (например, rsa). Только сервер может расшифровать с помощью закрытого ключа pki. Или один использует соединения SSL/TLS и не изобретает велосипед. - person Drew; 30.06.2015