CryptoJS可以进行二进制散列吗?

时间:2015-06-29 19:26:28

标签: javascript hash sha cryptojs one-time-password

我想使用类似于SpeakEasy

的javascript创建一个HOTP客户端

以上库用于服务器端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)或objective c(ios)等本机平台上是可行的 以下是相应的实施HOTP in Objective C,但我怀疑它是否可以在基于网络的前端上进行。

另外,我非常怀疑这样的东西在浏览器中是否安全,因为可以从任何浏览器查看javascript。任何输入建议都会有用。我这样做是为了POC。我很好奇是否有人在基于网络的平台上使用过Hotp。

2 个答案:

答案 0 :(得分:3)

在代码中没有支持二进制数据字符串的语言。您需要将二进制数据编码为某种格式(如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编码的字符串。如果你不想那样,你需要自己解码。

答案 1 :(得分:1)

http://caligatio.github.io/jsSHA/的代码适用于SHA-512

删除.js文件,在第515行查看test / test.html。它可能看起来像一个字符串,但它是二进制十六进制。

所以他们的输入是二进制的,这是没有错的。不要挂在它正坐在一根大绳子上的事实。