尝试在NodeJS中复制Python DIGEST-MD5散列函数的问题

我试图将各种原因移植到NodeJS的Python模块,我碰到了一个绊脚石。 我在获取适当的MD5摘要方面遇到了困难(是的,我知道MD5的安全问题,但是它是要连接到的应用程序的明文或纯文本)。

这是一个简化的Python 工作版本:

from hashlib import md5 username = 'username' password = 'password' nonce = '241d4105fe8f60cef84524f6' cnonce = '7db4c8275fb38f94774c1fe7' secret = '%s:my realm:%s' % (username, password) digest = md5(secret).digest() fullsecret = ':'.join([digest, nonce, cnonce]) hexdigest = md5(fullsecret).hexdigest() print 'digest: %s' % digest print 'digest char codes: ' + str([ord(c) for c in digest]) print 'fullsecret: %s' % fullsecret print 'fullsecret char codes:\n ' + str([ord(c) for c in fullsecret]) print 'hexdigest: %s' % hexdigest 

其中输出以下内容:

 digest: ȣ P  r l       digest char codes: [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198] fullsecret: ȣ P  r l      :241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7 fullsecret char codes: [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55] hexdigest: 6f9d2b47bd232495c2f765ce5a5d8ba7 

现在,对于我最近能够访问的JavaScript代码是这样的代码:

 var crypto = require('crypto'); var username = 'username'; var password = 'password'; var nonce = '241d4105fe8f60cef84524f6'; var cnonce = '7db4c8275fb38f94774c1fe7'; var secret = username + ':my realm:' + password; var digest = crypto.createHash('md5').update(secret).digest('binary'); var fullsecret = [digest, nonce, cnonce].join(':'); var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex'); console.log('digest: ' + digest); // console.log('digest char codes: [' + digest.map((x) => { return x; }).join(', ') + ']'); console.log('fullsecret: ' + fullsecret); console.log('fullsecret char codes:\n [' + fullsecret.split('').map((x) => { return x.charCodeAt() }).join(', ') + ']'); console.log('hexdigest: ' + hexdigest); 

该代码输出以下内容:

 digest: ȣ P  r l       fullsecret: È£øP¶r¼l¸¨Æ:241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7 fullsecret char codes: [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55] hexdigest: 5deef0b84014693b745ea40b047f4ae8 

我在想,问题是从缓冲区(摘要variables)的string转换,但我还没有find一种方法来纠正这一点。 我甚至试过从这里拉开相关的代码(起始行178),但是这给了我另外一个hex(并且从我所读到的“二进制”编码被弃用)使用下面的代码:

 function md5(str, encoding){ return crypto .createHash('md5') .update(str) .digest(encoding || 'hex'); } var hexdigest = md5(md5(secret, 'binary') + ':' + nonce + ':' + cnonce); console.log('hexdigest: ' + hexdigest); 

这打印出来:

 hexdigest: 5deef0b84014693b745ea40b047f4ae8 

第一个问题:有谁知道这是为什么发生和/或知道如何让它工作?

第二个问题:有没有更好的方法将Python代码移植到NodeJS?

我目前正在使用NodeJS 7.6.0。 感谢任何能够帮助我解决这个问题的人,我已经花了很长时间在键盘上敲打我的头。

更新:2017/04/05

在睡觉之后…原来,我确实需要使用.digest('binary')来获取正确的摘要。 当比较完整的秘密字符代码时,如果我不使用.digest('binary'),则Python和JS之间的代码是不同的。 然而,现在全密码string包含来自Python和JS的相同字符代码,JS中最后一个hex部分是错误的…上面的代码和输出已被修改以反映这些变化。

最好避免将字节表示为string。 节点的Buffertypes为:

 var crypto = require('crypto'); var username = 'username'; var password = 'password'; var nonce = Buffer.from('241d4105fe8f60cef84524f6'); var cnonce = Buffer.from('7db4c8275fb38f94774c1fe7'); var secret = username + ':my realm:' + password; var digest = crypto.createHash('md5').update(secret).digest(); var fullsecret = Buffer.concat([digest, Buffer.from(':'), nonce, Buffer.from(':'), cnonce]); var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex'); console.log('digest: ' + digest); console.log('digest char codes: [' + digest.join(', ') + ']'); console.log('fullsecret: ' + fullsecret); console.log('fullsecret char codes:\n [' + fullsecret.join(', ') + ']'); console.log('hexdigest: ' + hexdigest); 

请注意Buffer.from()将ASCIIstring编码为字节,将Buffer.concat编码为连接缓冲区,将.digest()编码为无编码参数以生成缓冲区而不是string。