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位数字类型)
可是我用
当然可以。根据你的描述,你需要使用 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));
解释
-
配置信息:
config.AppSecret
和config.AppKey
分别是你的密钥和应用键。
-
生成签名函数:
generateSignature
函数接受一个时间戳作为参数,并构造出所需的原始字符串message
。- 使用
crypto.createHmac('md5', config.AppSecret)
创建 HMAC 实例。这里config.AppSecret
是密钥,必须是一个字符串或 Buffer 类型。 - 调用
shasum.update(message)
更新 HMAC 实例的内容。 - 最后,使用
shasum.digest('hex')
将结果转换为十六进制字符串形式的签名。
-
测试:
- 通过
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
对象,包含AppSecret
和AppKey
。 generateSignature
函数接收一个timestamp
参数。- 在函数内部,我们构建了完整的消息字符串
message
,并将其传递给createHmac
方法。 createHmac
方法的第一个参数是md5
,第二个参数是AppSecret
,这是 HMAC 的密钥。- 最后,我们使用
update
方法更新 HMAC 对象,并使用digest('hex')
方法得到最终的十六进制签名。
确保 timestamp
是一个 13 位数字格式的时间戳。你可以通过 Date.now()
获取当前时间戳。