OpenSSL的HMAC-SHA1摘要不匹配加密的
问题描述:
我已经花了近6小时实现邮件签名算法。它不会在所有的工作:OpenSSL的HMAC-SHA1摘要不匹配加密的
这是PHP代码,并生成摘要:
$payload = "thisisanapple";
$signature = hash_hmac("sha1", $payload, "thisisarandomkey");
$data = base64_encode($signature);
// YzExZWRmZDliMjQzNTZjNzhlNmE3ZTdmMDE3ODJjNmMxMmM4ZTllMQ==
这是JS Node.js的服务器做同样的事情上运行:
var hmac = crypto.createHmac('sha1', "thisisarandomkey");
hmac.update("thisisanapple");
var signature = hmac.digest('base64');
// wR7f2bJDVseOan5/AXgsbBLI6eE=
我不知道这里有什么问题..我有尝试SHA256,但他们仍然是不同的。我还使用了由OpenSSL生成的私钥,无论是明文还是base64,仍然是相同的结果(不同的密钥)。
答
hash_hmac
有四个参数,最后一个指定输出,默认hash_hmac
返回十六进制字符串,而不是原始数据。所以base64_encode
在PHP代码片段中编码十六进制字符串。
这人会工作得很好:如果您希望复制在JS的PHP行为
$payload = "thisisanapple";
$signature = hash_hmac("sha1", $payload, "thisisarandomkey", true);
$data = base64_encode($signature);
// wR7f2bJDVseOan5/AXgsbBLI6eE=
答
,这里是代码:
hmac = crypto.createHmac('sha1', 'thisisarandomkey')
signature = hmac.update('thisisanapple')
data = new Buffer(hmac.digest('hex')).toString('base64')
你知道什么是JS代码相匹配原始问题中的PHP行为? – karellm