J'utilise deux bibliothèques différentes pour générer un hachage SHA-1 à utiliser dans la validation de fichier - une ancienne version de la bibliothèque Crypto++ et la classe Digest :: SHA1 implémentée par Ruby. Alors que j'ai vu d'autres instances de hachage incompatibles causées par des différences de codage, les deux bibliothèques produisent des hachages presque identiques identiques.Pourquoi Crypto ++ et Ruby génèrent des hachages SHA-1 légèrement différents?
Par exemple, le passage d'un fichier à travers chaque processus produit les résultats suivants:
Crypto ++ 01c15e4f46d8181b984fa2a2c740f8f67130acac
Ruby: eac15e4f46d8181b984fa2a2c740f8f67130acac
Comme vous pouvez le voir, seuls les deux premiers caractères du hachage chaîne sont différentes et ce comportement se répète sur plusieurs fichiers. J'ai jeté un coup d'œil sur le code source de chaque implémentation, et la seule différence que j'ai trouvée à première vue était dans l'hex de données utilisé pour le hachage 160 bits. Je n'ai aucune idée de la façon dont cet hexagone est utilisé dans l'algorithme, et j'ai pensé qu'il serait probablement plus rapide pour moi de poser la question au cas où quelqu'un aurait déjà rencontré ce problème.
J'ai inclus les données des bibliothèques respectives ci-dessous. J'ai également inclus les valeurs d'OpenSSL, car chacune des trois bibliothèques avait des valeurs légèrement différentes.
Crypto ++:
digest[0] = 0x67452301L;
digest[1] = 0xEFCDAB89L;
digest[2] = 0x98BADCFEL;
digest[3] = 0x10325476L;
digest[4] = 0xC3D2E1F0L;
Ruby:
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
OpenSSL:
#define INIT_DATA_h0 0x67452301UL
#define INIT_DATA_h1 0xefcdab89UL
#define INIT_DATA_h2 0x98badcfeUL
#define INIT_DATA_h3 0x10325476UL
#define INIT_DATA_h4 0xc3d2e1f0UL
Soit dit en passant, voici le code utilisé pour générer le hachage en Ruby. Je n'ai pas accès au code source de l'implémentation de Crypto ++.
File.class_eval do
def self.hash_digest filename, options = {}
opts = {:buffer_length => 1024, :method => :sha1}.update(options)
hash_func = (opts[:method].to_s == 'sha1') ? Digest::SHA1.new : Digest::MD5.new
open(filename, "r") do |f|
while !f.eof
b = f.read
hash_func.update(b)
end
end
hash_func.hexdigest
end
end
Toutes les valeurs sont identiques. –
Ces ensembles de nombres sont exactement les mêmes. Je ne sais pas d'où vient la différence, mais ce ne sont pas ces ensembles de nombres. –
Ouais, j'avais exclu essentiellement que cela ait quelque chose à voir avec la différence. Considérant que les trois bibliothèques sont largement utilisées, il ne serait pas logique pour chacune de générer un hachage différent basé sur des différences explicites dans les algorithmes. C'est principalement pourquoi je suis perdu. –