【问题标题】:How to convert HMAC Hash from python to node.js如何将 HMAC 哈希从 python 转换为 node.js
【发布时间】:2023-01-13 19:34:53
【问题描述】:

我想将此 sn-p 转换为 Nodejs。

import urllib.request
import base64
import hmac

signature = hmac.new(SECRETKEY.encode("utf-8"), my_string.encode("utf-8"), digestmod="sha256").digest()
urllib.parse.quote(base64.b64encode(signature))

我怎样才能得到完全相同的结果?
我试试这个但这是错误的:

const Base64 = require('crypto-js/enc-base64');
const hmacSHA256  = require('crypto-js/hmac-sha256');

let signature = hmacSHA256(utf8.encode(my_string), utf8.encode(SECRETKEY));
signature = Base64.stringify(signature);

【问题讨论】:

  • 您的 Python 代码中有错字:hashed 必须替换为 signature

标签: python node.js hmac


【解决方案1】:

使用 NodeJS密码模块可用于生成 HMAC。

URL 编码是可能的,例如与encodeURIComponent()。请注意,urllib.parse.quote() 默认情况下不会对 / 进行 URL 编码,因此只有 += 在 Base64 编码字符串中进行了 URL 编码。另一方面,encodeURIComponent() 对所有三个特殊字符进行编码。
如果要在 NodeJS 代码中维护此行为,则必须在应用 encodeURIComponent() 时将 / 进行 URL 解码(例如,通过正则表达式)。 或者,除了 encodeURIComponent(),只有 += 可以进行 URL 编码直接地使用正则表达式。

const crypto = require('crypto');

var SECRETKEY = 'SECRETKEY'
var my_string = 'my_string';
var b64Hmac = crypto.createHmac('sha256', SECRETKEY).update(my_string).digest('base64');
var urlB64Hmac = encodeURIComponent(b64Hmac).replace(/%2F/g, "/"); // Remove replace() if / may also be URL-encoded...
console.log(urlB64Hmac); // aB3nu4l%2BN2jf2Z9ybad6vAPVEE8JbHlya/NYlKyJLsM%3D

或者,可以在您的示例代码中使用 CryptoJS 库:

var CryptoJS = require('crypto-js')

var SECRETKEY = 'SECRETKEY'
var my_string = 'my_string';
var b64Hmac = CryptoJS.HmacSHA256(my_string, SECRETKEY).toString(CryptoJS.enc.Base64);
var urlB64Hmac = encodeURIComponent(b64Hmac).replace(/%2F/g, "/");
console.log(urlB64Hmac); // aB3nu4l%2BN2jf2Z9ybad6vAPVEE8JbHlya/NYlKyJLsM%3D

然而,优势在于密码CryptoJS 库上的模块是不需要额外的依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 2015-11-26
    • 2011-11-20
    • 2015-01-21
    • 2019-10-27
    • 2019-05-23
    • 2012-04-21
    • 2021-08-26
    相关资源
    最近更新 更多