CryptoJS 可以进行二进制哈希吗?

问题描述 投票:0回答:3

我想使用类似于 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) 等本机平台上是可能的 这是 Objective C 中相应的实现 HOTP ,但我怀疑是否可以在基于 Web 的前端上实现。

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

javascript hash sha cryptojs one-time-password
3个回答
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
投票

http://caligatio.github.io/jsSHA/ 上的代码适用于

SHA-512

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

所以他们的输入是二进制的,这是没有错误的。不要因为它坐在一根大绳子上而感到困扰。


0
投票

要使用

otp-agent
npm 包生成 HOTP,请按照以下步骤操作:

安装

首先,通过 npm 安装软件包:

npm install otp-agent

使用方法

以下是如何使用

otp-agent
和各种参数生成 HOTP 的示例:

const { generateHOTP } = require('otp-agent');

const secret = 'YOURSECRET';
const options = {
  counter: 1,            // Mandatory: Counter value for the HOTP
  digits: 6,             // Optional: Number of digits in the OTP. Default is 6.
  algorithm: 'SHA-256',  // Optional: Hashing algorithm. Default is 'SHA-1'. Other options: 'SHA-256', 'SHA-384', 'SHA-512'.
  encoding: 'base32'     // Optional: Encoding of the secret key. Default is 'base32'. Other options: 'ascii', 'hex', 'base64'.
};

const hotp = generateHOTP({ secret: YOURSECRET, ...options });
console.log(hotp); // Example output: 654321

说明

  1. 安装:确保您的项目中安装了
    otp-agent
    软件包。
  2. 导入函数:使用
    require
    generateHOTP
    导入
    otp-agent
    函数。
  3. 参数
    • secret
      :用于生成 HOTP 的共享密钥。
    • counter
      :随着每次 OTP 生成而递增的计数器值。
    • digits
      (可选):OTP 中的位数。默认值为 6。
    • algorithm
      (可选):要使用的哈希算法(例如“SHA-1”、“SHA-256”、“SHA-384”、“SHA-512”)。默认为“SHA-1”。
    • encoding
      (可选):密钥的编码(例如“ascii”、“hex”、“base32”、“base64”)。默认为“base32”。
  4. 生成 HOTP:将密钥以及其他可选参数传递给
    generateHOTP
    函数以生成 HOTP。

补充说明

otp-agent
还支持生成 TOTP、OTP 和带有自定义字符的自定义 OTP。有关更多详细信息和示例,您可以查看otp-agent

© www.soinside.com 2019 - 2024. All rights reserved.