我想使用类似于 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。
没有这样的语言支持代码中的二进制数据字符串。您需要将二进制数据编码为某种格式,例如 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 编码的字符串。如果你不想这样,你需要自己解码。
http://caligatio.github.io/jsSHA/ 上的代码适用于
SHA-512
。
删除 .js 文件,查看 test/test.html 的第 515 行。它可能看起来像一个字符串,但它是二进制十六进制。
所以他们的输入是二进制的,这是没有错误的。不要因为它坐在一根大绳子上而感到困扰。
要使用
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
otp-agent
软件包。require
从generateHOTP
导入otp-agent
函数。secret
:用于生成 HOTP 的共享密钥。counter
:随着每次 OTP 生成而递增的计数器值。digits
(可选):OTP 中的位数。默认值为 6。algorithm
(可选):要使用的哈希算法(例如“SHA-1”、“SHA-256”、“SHA-384”、“SHA-512”)。默认为“SHA-1”。encoding
(可选):密钥的编码(例如“ascii”、“hex”、“base32”、“base64”)。默认为“base32”。generateHOTP
函数以生成 HOTP。otp-agent
还支持生成 TOTP、OTP 和带有自定义字符的自定义 OTP。有关更多详细信息和示例,您可以查看otp-agent。