2015-11-17 2 views
1

J'utilise la bibliothèque hashlib dans la bibliothèque Python et Digest :: SHA256.hexdigest en rubisrubis sha 256 valeurs hexidigest sont différentes de ce python génère

code Python Je suis en train,

import hashlib 
hasher = hashlib.sha256() 
hasher.update("xyz") 
hasher.digest() 
hash = hasher.hexdigest() 
print hash 

sortie: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282

code Ruby Je suis en train,

require 'digest' 
hasher = Digest::SHA256.digest "xyz" 
hash = Digest::SHA256.hexdigest(hasher) 

sortie: « 18cefdae0f25ad7bb5f3934634513e54e5ac56d9891eb13ce456d3eb1f3e72e8 »

Quelqu'un peut-il me aider à comprendre pourquoi il y a une différence? comment puis-je obtenir la même valeur que python?

Répondre

0

-je obtenir les mêmes résultats en utilisant le code suivant:

Python 3.5.0:

import hashlib 
>>> hashlib.sha256("xyz".encode()).hexdigest() 
'3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282' 

Ruby 2.2.3

require 'digest' 
irb(main):001:0> Digest::SHA256.hexdigest("xyz") 
=> "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282" 

OR 

irb(main):002:0> H = Digest::SHA256.new() 
=> #<Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855> 
irb(main):003:0> H << "xyz" 
=> #<Digest::SHA256: 3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282> 
irb(main):004:0> H.hexdigest() 
=> "3608bca1e44ea6c4d268eb6db02260269892c0b42b86bbf1e77a6fa16c3c9282" 

La question a menti à l'intérieur (à mon avis) que:

hasher = Digest::SHA256.digest "xyz" 
=> "6\b\xBC\xA1\xE4N\xA6\xC4\xD2h\xEBm\xB0\"`&\x98\x92\xC0\xB4+\x86\xBB\xF1\xE7zo\xA1l<\x92\x82"` 

qui n'est pas "xyz:". (avertissement: j'avais à peine utilisé Ruby dans le passé).

1

Le code rubis que vous voulez est juste

require 'digest' 
hash = Digest::SHA256.hexdigest("xyz") 

hexdigest prend comme argument la chaîne à digérer, donc ce que votre code précédent faisait digérait la chaîne (retour en tant que tableau brut de 32 octets), et puis en calculant le SHA256 de cette mise en forme & sous forme de 64 caractères hexadécimaux.

La bibliothèque digest Ruby ne dispose également d'une api similaire à votre exemple python:

hash = Digest::SHA256.new 
hash.update 'xyz' 
hash.hexdigest 

Pour quand vous voulez calculer un hachage progressivement