J'ai une application JavaScript et une application Python qui communiquent en utilisant une clé dérivée d'un mot de passe en utilisant pbdkf2. Le problème est que les clés générées ne correspondent pas. J'ai produit un cas de test minimal pour chacun.Comment faire SJCL et Python hashlib générer une sortie identique pdkdf2
Python
import hashlib, binascii
bytes = hashlib.pbkdf2_hmac('sha256', "password".encode(), b'', 100000)
print(binascii.hexlify(bytes).decode())
distingue: 64a868d4b23af696d3734d0b814d04cdd1ac280128e97653a05f32b49c13a29a
JavaScript
<script src="lib/sjcl.js"></script>
<script>
var hmacSHA256 = function (key) {
var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha256);
this.encrypt = function() {
return hasher.encrypt.apply(hasher, arguments);
};
};
hash = sjcl.misc.pbkdf2("password", [0], 100000, 256, hmacSHA256);
console.log(sjcl.codec.hex.fromBits(hash));
</script>
Génère: 41c04f824d843d5be0ae66b3f621d3f05db7d47e7c46ee0e9171b5cbff7f3631
Je me gratte beaucoup la tête maintenant. Je pense que b''
et [0]
sont des sels équivalents, mais je ne suis pas sûr. Je pense qu'ils utilisent tous les deux utf-8 pour encoder le mot de passe, mais je ne suis pas sûr. Et je ne suis pas convaincu que la fonction JavaScript hmacSHA256 correspond exactement à ce que fait Python. Ou ça pourrait être autre chose encore.