2013-11-10 47 views
3

我已经花了近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,仍然是相同的结果(不同的密钥)。

回答

2

hash_hmac有四个参数,最后一个指定输出,默认hash_hmac返回十六进制字符串,而不是原始数据。所以base64_encode在PHP代码片段中编码十六进制字符串。

这人会工作得很好:如果您希望复制在JS的PHP行为

$payload = "thisisanapple"; 
$signature = hash_hmac("sha1", $payload, "thisisarandomkey", true); 
$data = base64_encode($signature); 
// wR7f2bJDVseOan5/AXgsbBLI6eE= 
+1

你知道什么是JS代码相匹配原始问题中的PHP行为? – karellm

0

,这里是代码:

hmac = crypto.createHmac('sha1', 'thisisarandomkey') 
signature = hmac.update('thisisanapple') 
data = new Buffer(hmac.digest('hex')).toString('base64')