节点与节点之间的Sha1结果不同;python

节点与节点之间的Sha1结果不同;python,python,node.js,sha,Python,Node.js,Sha,我目前正在尝试使用nodejs和SOAP实现对皇家邮政API的调用;我很难按照示例python脚本重新创建安全标头实现 python脚本如下所示 #!/usr/local/bin/python2.7 import os import sha import binascii import base64 password = 'test' CREATIONDATE = '2016-03-29T14:03:46Z' nonce = '7715776714' HASH = sha.new(pass

我目前正在尝试使用nodejs和SOAP实现对皇家邮政API的调用;我很难按照示例python脚本重新创建安全标头实现

python脚本如下所示

#!/usr/local/bin/python2.7
import os
import sha
import binascii
import base64

password = 'test'
CREATIONDATE =  '2016-03-29T14:03:46Z'
nonce =  '7715776714'
HASH = sha.new(password).digest()
BASE64PASSWORD = base64.b64encode(HASH)

digest = sha.new(nonce + CREATIONDATE + HASH).digest()


PASSWORDDIGEST = base64.b64encode(digest)
ENCODEDNONCE = base64.b64encode(nonce)

print 'NONCE = ', nonce
print 'BASE64PASSWORD', BASE64PASSWORD
print 'PASSWORDDIGEST ', PASSWORDDIGEST
print 'ENCODEDNONCE ', ENCODEDNONCE
print 'CREATIONDATE ', CREATIONDATE
哪些产出:

NONCE  7715776714  
BASE64PASSWORD qUqP5cyxm6YcTAhz05Hph5gvu9M=  
PASSWORDDIGEST  coDzcnSZObFfrM0FY33GcfxjOj4=  
ENCODEDNONCE NzcxNTc3NjcxNA==  
CREATIONDATE 2016-03-29T14:03:46Z  
我使用NodeJs重新创建了它,但我似乎得到了不同的输出-在python版本中输入正确的密码并使用结果数据允许我对API进行有效调用,使用NodeJs的输出会导致授权失败

节点Js代码

var createdDate, password = 'test', nonce;
createdDate = '2016-03-29T14:03:46Z';
nonce = '7715776714';

var crypto = require("crypto"),
passHash = crypto.createHash('sha1'),
digestHash = crypto.createHash('sha1');

passHash.update(password);

var HASH = passHash.digest();
console.log('NONCE ' + nonce)
console.log('BASE64PASSWORD ' + base64_encode_string(HASH))

digestHash.update(nonce + createdDate + HASH);
var digest = digestHash.digest();

var PASSWORDDIGEST = base64_encode_string(digest);
console.log('PASSWORDDIGEST ' + PASSWORDDIGEST);
var ENCODEDNONCE = base64_encode_string(nonce.toString());

console.log('ENCODEDNONCE ' + ENCODEDNONCE);
console.log('CREATIONDATE ' + createdDate);
哪个输出

NONCE 7715776714  
BASE64PASSWORD qUqP5cyxm6YcTAhz05Hph5gvu9M=  
PASSWORDDIGEST FRMDpkDOi1j9KB/sDHg1b7BYQgA=  
ENCODEDNONCE NzcxNTc3NjcxNA==  
CREATIONDATE 2016-03-29T14:03:46Z 
看起来散列的Sha是相同的,但是第二个Sha(摘要)在NodeJs版本中给出了不同的结果。有没有指向我错在哪里的指示


作为参考,我在python中使用sha库,在NodeJs中使用crypto。一个问题是,您隐式地将
散列
缓冲区转换为UTF-8字符串,这在将二进制文件转换为UTF-8时容易导致输出损坏。相反,您可以多次调用
.update()
,并将二进制数据保存在
散列中:

digestHash.update(nonce + createdDate);
digestHash.update(HASH);
var digest = digestHash.digest();

另一个不相关的注意事项是,缓冲区不需要
base64\u encode\u string()
,而只需要
buffer.toString('base64')
(例如
HASH.toString('base64')
)。

sha
模块不推荐使用,使用
hashlib
可能是明智的