javascript - CryptoJS 是否可以进行二进制散列?

标签 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。

最佳答案

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

关于javascript - CryptoJS 是否可以进行二进制散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31123925/

相关文章:

javascript - PhoneGap 构建 Android 音频不工作

javascript - 如何在 chrome、IE 8 和 9 中使用 jquery 操作剪贴板数据?

Javascript 不等待 onclick

python - 简明的 Ruby 哈希等同于 Python dict.get()

java - 将 java 中的加密代码转换为 Ruby

.net - Windows 上 native 加密哈希的 native 实现比 .Net 托管版本快多少?

swift - 从 SHA256.hash(data :)?

javascript - Bootstrap 弹出窗口在对象中不起作用

c# - 一致地生成对象的哈希值

node.js - 由于 crypto.DEFAULT_ENCODING ='binary', Node 6 升级导致 aws-sdk 出现 SignatureDoesNotMatch 错误