Nodejs crypto 模块生成签名的问题

Nodejs crypto 模块生成签名的问题

有个签名业务要求如下 签名算法采用Hmac-md5,hmac(secret+“app_key”+app_key+“timestamp”+timestamp+secret, secret),其中原始字符串secret+“app_key”+app_key+ “timestamp”+timestamp+secret,加密串是secret,其中timestamp(时间戳格式为13位数字类型)

可是我用

    var a = config.AppSecret;
    var shasum = crypto.createHmac('md5',a);
    shasum.update(message);
    var msg = shasum.digest('hex');```
    会提示TypeError: Not a string or buffer   在```var shasum = crypto.createHmac('md5',a);```  这行
    请问 这个hmac key 到底要怎么生成啊,

4 回复

当然可以。根据你的描述,你需要使用 Node.js 的 crypto 模块来生成 HMAC-MD5 签名。你遇到的错误是因为你在创建 HMAC 实例时传递了一个非字符串类型的参数。下面是正确的实现方式:

示例代码

首先,确保你已经安装了 Node.js。然后你可以创建一个简单的 JavaScript 文件,比如 generateSignature.js,并添加以下代码:

const crypto = require('crypto');
const config = {
  AppSecret: 'your_secret_key',
  AppKey: 'your_app_key'
};

function generateSignature(timestamp) {
  const message = `${config.AppSecret}app_key${config.AppKey}timestamp${timestamp}${config.AppSecret}`;
  
  // 创建 HMAC 实例,注意这里的 key 必须是字符串或 Buffer 类型
  const shasum = crypto.createHmac('md5', config.AppSecret);
  
  // 更新 HMAC 实例的内容
  shasum.update(message);
  
  // 获取签名结果
  const signature = shasum.digest('hex');
  
  return signature;
}

// 示例调用
const timestamp = Date.now().toString(); // 获取当前时间戳
console.log(generateSignature(timestamp));

解释

  1. 配置信息

    • config.AppSecretconfig.AppKey 分别是你的密钥和应用键。
  2. 生成签名函数

    • generateSignature 函数接受一个时间戳作为参数,并构造出所需的原始字符串 message
    • 使用 crypto.createHmac('md5', config.AppSecret) 创建 HMAC 实例。这里 config.AppSecret 是密钥,必须是一个字符串或 Buffer 类型。
    • 调用 shasum.update(message) 更新 HMAC 实例的内容。
    • 最后,使用 shasum.digest('hex') 将结果转换为十六进制字符串形式的签名。
  3. 测试

    • 通过 Date.now().toString() 获取当前时间戳,并调用 generateSignature 函数生成签名。

这样,你应该能够正确地生成所需的 HMAC-MD5 签名。


顶一下 。原文是 crypto.createHmac(algorithm, key) ,这个key要怎么生成啊?

你可以去看看http://cnodejs.org/topic/504061d7fef591855112bab5

根据你的描述,错误的原因是因为你在调用 crypto.createHmac 方法时传递了一个非字符串类型的参数。你需要确保所有参与签名的字符串都正确地拼接在一起,并且作为单独的一部分传递给 HMAC 函数。

以下是一个示例代码,展示如何使用 Node.js 的 crypto 模块生成符合你需求的 HMAC-MD5 签名:

const crypto = require('crypto');
const config = {
    AppSecret: 'your_secret',
    AppKey: 'your_app_key'
};

function generateSignature(timestamp) {
    const message = `${config.AppSecret}app_key${config.AppKey}timestamp${timestamp}${config.AppSecret}`;
    const hmac = crypto.createHmac('md5', config.AppSecret);
    const signature = hmac.update(message).digest('hex');
    return signature;
}

const timestamp = Date.now().toString();
const signature = generateSignature(timestamp);

console.log(`Timestamp: ${timestamp}`);
console.log(`Signature: ${signature}`);

在这个示例中:

  • 我们首先定义了 config 对象,包含 AppSecretAppKey
  • generateSignature 函数接收一个 timestamp 参数。
  • 在函数内部,我们构建了完整的消息字符串 message,并将其传递给 createHmac 方法。
  • createHmac 方法的第一个参数是 md5,第二个参数是 AppSecret,这是 HMAC 的密钥。
  • 最后,我们使用 update 方法更新 HMAC 对象,并使用 digest('hex') 方法得到最终的十六进制签名。

确保 timestamp 是一个 13 位数字格式的时间戳。你可以通过 Date.now() 获取当前时间戳。

回到顶部