我正在尝试在 Postman 中通过 JavaScript 生成 OTP。我正在做一些自动化测试,需要使用 OTP 来满足 MFA 要求。我发现我在本地 Postman 中的选择很有限。
我尝试了下面的代码以及其他一些使用 Crypto-JS 的示例代码,但没有成功...我总是得到错误的 6 位 OTP 值。我知道密钥和计数器组合的正确、有效的 OTP,因为我已经在 C# 中成功创建了类似的实用程序。
我正在尝试在预请求脚本中使用以下代码:
function hotp( key, counter, digits ) {
const buffer = Buffer.alloc(8);
for (let i = 0; i < 8; i++) {
buffer[7 - i] = counter & 0xff;
counter = counter >> 8;
}
const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA1, key);
hmac.update(CryptoJS.lib.WordArray.create(buffer));
return zeropad(truncate(Buffer.from(hmac.finalize().toString(), 'hex'), digits), digits);
function zeropad( value, digits = 16 ) {
var fill = '0'.repeat( digits )
return ( fill + value ).slice( -digits )
}
function truncate( hmac, digits ) {
var offset = hmac[ hmac.length - 1 ] & 0x0F
var value = ( hmac[ offset + 0 ] & 0x7F ) << 24 |
( hmac[ offset + 1 ] & 0xFF ) << 16 |
( hmac[ offset + 2 ] & 0xFF ) << 8 |
( hmac[ offset + 3 ] & 0xFF )
return value % ( 10 ** digits )
}
}
var key = "10f869eadb33edf1160477cfcc503d875aeaa17c"; - example key
var counter = 0;
计数器 0-8 生成的值如下: 962076 661983 564874 692146 270493 542260 345608 998477 964548
但是这些值不适用于应用程序后端。我已经在 C# 中成功完成了相同的算法并让 OTP 被接受。
计数器 0-8 的正确 OTP 值应为: 529311 627331 461764 308872 837476 597284 520251 728342 407976
有人能看到我在这里做错了什么吗?
我在 hmac 创建调用上方添加了以下行,并将新编码的键值传递给 hmac create 函数以获得正确的结果。
var wordKey = CryptoJS.enc.Hex.parse(key);
这就是获得我正在寻找的值所缺少的一切。