2017-03-12 3 views
3

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.

Répondre

4

Du haut de ma tête, avez-vous vérifié si

hash = sjcl.misc.pbkdf2("password", "", 100000, 256); 

donne le bon résultat? Dans la mesure où je peux dire à partir de docs, l'implémentation PBKDF2 de SJCL par défaut à HMAC-SHA256 si vous ne lui donnez pas explicitement une PRF. Si cette modification corrige le bug, il y a probablement un problème avec votre wrapper hmacSHA256.

Aussi, je ne sais pas si la spécification d'un sel vide comme [0] fonctionne vraiment (ou est garanti pour fonctionner dans les futures versions, étant donné que le format des bitArrays de SJCL est explicitly subject to change), mais "" devrait certainement travailler.