2012-11-20 48 views
2

我想做一个python函数和nodejs函数计算相同的散列。但是,看起来输出的二进制文件在nodejs加密和python hashlib之间是不同的。Nodejs加密与蟒蛇hashlib

我使用Python是:

hash = hashlib.sha512() 
hash.update(salt) 
hash.update(password.encode('utf8')) 
hash.digest() 

节点/ CoffeeScript的是:

crypto.createHash('sha512').update(salt, 'binary').update(password, 'utf8').digest() 

这两根线应产生相同的结果,但出于某种原因,他们没有。帮帮我?

+0

您能否包含通过示例输入运行这两个示例所获得的结果? –

+0

当我运行完全相同的东西时,我得到了相同的结果 - 除了coffeescript返回一个Unicode字符串(显然是Latin-1解码?),而Python(至少3.x)返回一个“字节”值。所以,我为第三个角色提供了''\ u0006''与''\ x06''之类的东西。 – abarnert

+0

经过测试,Python 2.x也是如此。 – abarnert

回答

3

他们似乎产生相同的结果,但由于节点的digest()返回一个Unicode字符串,而Python的回报bytes对象,这可能不会立即明显:

的CoffeeScript 1.4.0在节点0.8.11:

coffee> salt='abc' 
'abc' 
coffee> password='def' 
'def' 
coffee> d = crypto.createHash('sha512').update(salt, 'binary').update(password, 'utf8').digest() 
'ã.ñ#èí&ezK=\u0007­»v\u0018\u0006CWEVNAP §\u0003¾*}¶\u001e=9\f+¹~-L1\u001fÜiÖ±&\u0005õ© ç' 

的Python 3.3.0:

>>> salt, password=b'abc', 'def' 
>>> hash = hashlib.sha512() 
>>> hash.update(salt) 
>>> hash.update(password.encode('utf8')) 
>>> d = hash.digest() 
>>> print(d) 
b'\xe3.\xf1\x96#\xe8\xed\x9d&\x7fez\x81\x94K=\x07\xad\xbbv\x85\x18\x06\x8e\x88CWEVN\x8dAP\xa0\xa7\x03\xbe*}\x88\xb6\x1e=9\x0c+\xb9~-L1\x1f\xdci\xd6\xb1&\x7f\x05\xf5\x9a\xa9 \xe7' 

看起来非常不同的,对不对?但如果仔细观察,可打印的字符是相同的 - CWEVN运行非常明显。你可以看到更多的相似之处,如果你作为Latin-1的解码吧...

>>> print(d.decode('latin1')) 
ã.ñ#èí&ezK=­»vCWEVNAP §¾*}¶=9 
            +¹~-L1ÜiÖ±&õ© ç 

但是很明显,这是完全相同的字符串,它只是节点是逃避非打印字符。

和Python 2.7.2:

>>> salt, password='abc', u'def' 
>>> hash = hashlib.sha512() 
>>> hash.update(salt) 
>>> hash.update(password.encode('utf8')) 
>>> d = hash.digest() 
>>> print(d) 
?.?#??&ez??K=??v???CWEVN?AP???*}??=9 
           +?~-L1?iֱ&? ? 
>>> print(d.decode('latin1')) 
ã.ñ#èí&ezK=­»vCWEVNAP §¾*}¶=9 
            +¹~-L1ÜiÖ±&õ© ç 

同样,相同的字符串。

鉴于我的终端,C语言环境等都是UTF-8(这是OS X),我不知道为什么CoffeeScript会解码为Latin-1。