Node.js 的 crypto
模块和 Web Crypto API 都提供了加密功能,但它们是两个不同的实现。Node.js 的 crypto
模块是 Node.js 环境下的加密库,而 Web Crypto API 是浏览器环境下的加密API。
Node.js 的 crypto
模块和 Web Crypto API 在处理加密数据时可能使用不同的算法实现或默认参数,这可能导致签名验证失败。
为了确保签名验证的一致性,可以采取以下步骤:
以下是一个示例,展示如何在 Node.js 中验证由 Web Crypto API 创建的签名。
async function createSignature(data, key) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const keyBuffer = await window.crypto.subtle.importKey(
"raw",
encoder.encode(key),
{ name: "HMAC", hash: { name: "SHA-256" } },
false,
["sign"]
);
const signature = await window.crypto.subtle.sign(
{ name: "HMAC" },
keyBuffer,
dataBuffer
);
return signature;
}
// 示例用法
const data = "Hello, World!";
const key = "secretKey";
createSignature(data, key).then(signature => {
console.log("Signature:", signature);
// 将 signature 转换为 Base64 编码以便传输
const base64Signature = btoa(String.fromCharCode(...new Uint8Array(signature)));
console.log("Base64 Signature:", base64Signature);
});
const crypto = require('crypto');
function verifySignature(data, key, signatureBase64) {
const encoder = new TextEncoder();
const dataBuffer = encoder.encode(data);
const keyBuffer = encoder.encode(key);
const signatureBuffer = Buffer.from(signatureBase64, 'base64');
const hmac = crypto.createHmac('sha256', keyBuffer);
hmac.update(dataBuffer);
const computedSignature = hmac.digest();
return computedSignature.equals(signatureBuffer);
}
// 示例用法
const data = "Hello, World!";
const key = "secretKey";
const signatureBase64 = "Base64 编码的签名"; // 从浏览器端获取的 Base64 编码的签名
console.log("Signature Verification:", verifySignature(data, key, signatureBase64));
通过确保使用相同的算法和参数,并在需要时转换密钥和数据的格式,可以解决 Node.js crypto
模块无法验证 Web Crypto API 创建的签名的问题。
领取专属 10元无门槛券
手把手带您无忧上云