【问题标题】:Is binary hashing possible with CryptoJS?CryptoJS 可以进行二进制散列吗?
【发布时间】:2015-09-16 09:40:25
【问题描述】:

我想使用类似于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,但我怀疑是否可以在基于 Web 的前端进行。

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

【问题讨论】:

  • 你想要哪个哈希
  • @DrewPierce 理想情况下我想使用 sha512
  • @DrewPierce 我用过。但是,这些函数的输入是字符串。我对哈希函数的输入不是字符串,而是二进制数据。所以结果不等价。
  • @DanielAranda 我的问题与此不同。我想知道在基于 Web 的前端上使用 hotp 是否可行。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    所以他们的输入是二进制的,这是正确的。不要因为它坐在一根大绳子上而挂断电话。

    【讨论】:

    • 顺便说一句,我提供这个来显示客户端而不考虑烘焙到 .js 中的键,这当然是愚蠢的。对于安全主题,请找出 SSL 的位置。SSL 将从一开始就消除整个问题。
    • 您在节点而不是客户端看到这个是有充分理由的。它是服务器端的典型用途,比如 php 或 nodeJs。对于客户端,将使用 pki 的服务器公钥(想想 rsa)。只有服务器可以使用 pki 私钥解密。或者使用 SSL/TLS 连接并且不重新发明轮子。
    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2020-10-06
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多