通过 JavaScript 在 Postman 中生成 OTP

Generating an OTP in Postman via JavaScript

提问人:Dennis Robare 提问时间:11/15/2023 最后编辑:Steve VinoskiDennis Robare 更新时间:11/15/2023 访问量:82

问:

我正在尝试通过 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

谁能看到我在这里做错了什么?

javascript cryptojs 多因素身份验证 一次性密码 postman-pre-request-script

评论

0赞 Topaco 11/15/2023
如果密钥是十六进制解码的,则值 529311,...,40796 对应于计数器 1-9,如果密钥是 UTF-8 编码的,则值962076,...,964548计数器 0-8。
0赞 Dennis Robare 11/23/2023
@Topaco,所以 OTP 计算正确,但解码不正确?
0赞 Topaco 11/23/2023
如前所述,您必须对密钥进行十六进制解码才能重现引用值(对应于计数器 1 到 9)。
0赞 Dennis Robare 11/29/2023
@Topaco,我以为我正在用这一行以十六进制解码 - return zeropad(truncate(Buffer.from(hmac.finalize().toString(), 'hex'), digits);
0赞 Topaco 11/29/2023
这是您第二次花了一周时间回复。但我不想每次都回到这个老问题。也许你可以自己找到解决方案。

答:

0赞 Dennis Robare 11/30/2023 #1

我在 hmac 创建调用上方添加了以下行,并将新编码的键值传递给 hmac create 函数以获得正确的结果。

var wordKey = CryptoJS.enc.Hex.parse(key);

这就是获得我正在寻找的值所缺少的全部内容。