Javascript CryptoJS可以使用二进制哈希吗?

Javascript CryptoJS可以使用二进制哈希吗?,javascript,hash,sha,cryptojs,one-time-password,Javascript,Hash,Sha,Cryptojs,One Time Password,我想使用javascript创建一个类似于 上面的库用于服务器端javascript,它使用NodeJS 我想在浏览器的前端javascript上做同样的事情,但我还不能使用CryptoJS来实现这种行为 var key = "abc"; var counter = "123"; // create an octet array from the counter var octet_array = new Array(8)

我想使用javascript创建一个类似于

上面的库用于服务器端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));
var key=“abc”;
var counter=“123”;
//从计数器创建八位字节数组
var-octet_数组=新数组(8);
变量计数器_temp=计数器;
对于(变量i=0;i<8;i++){
var i_from_right=7-i;
//将255遮罩在数字上,以获得最后的8
八位字节数组[i_从右]=计数器温度&255;
//换班8,准备循环下一批8
计数器温度=计数器温度>>8;
}
//浏览器上没有称为缓冲区的类(其节点js)
变量计数器缓冲区=新缓冲区(八位字节数组);
var hash=CryptoJS.HmacSHA1(密钥、计数器缓冲区);
文件。写入(“十六进制值”+哈希);
document.write(“哈希值”+CryptoJS.enc.Hex.stringify(哈希));
我知道这在java(android)或objective c(ios)等本机平台上是可能的 下面是相应的实现,但我怀疑是否可以在基于web的前端上实现


此外,我高度怀疑这种东西在浏览器中是否安全,因为javascript可以从任何浏览器中查看。任何意见和建议都是有用的。我这样做是为了一个POC。我很好奇是否有人在基于web的平台上使用过Hotp。

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

上的代码在
SHA-512
上运行良好

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


所以他们的输入是二进制的,这是不可接受的。不要因为它是一根大绳而心烦意乱。

你喜欢哪一根want@DrewPierce理想情况下,我想使用sha512@DrewPierce我已经用过了。但是,这些函数的输入是字符串。我对散列函数的输入不是字符串,而是二进制数据。所以结果是不一样的。@DanielAranda我的问题与此不同。我想知道在基于web的前端上使用hotp是否可行。顺便说一句,我提供此功能是为了显示客户端,而不考虑烘焙到.js中的键,这当然是愚蠢的。对于安全性主题,请了解SSL在何处起作用。SSL将从一开始就消除整个问题。有一个很好的理由可以解释为什么在节点而不是客户端上看到这一点。它是服务器端的典型用法,比如php或nodeJs。对于客户端,可以使用服务器公钥pki(比如rsa)。只有服务器可以使用pki私钥解密。或者使用SSL/TLS连接而不重新发明轮子。