2016-03-26 2 views
1

J'utilise la bibliothèque et je l'aime vraiment, mais d'après ce que j'ai lu, PBKDF2 est un peu plus vulnérable aux attaques par force brute que bcrypt ou scrypt. Je suis tombé sur cette question à propos de adding scrypt support, mais il ne semble pas y avoir de réponse claire.Est-il possible d'utiliser bcrypt ou scrypt comme alternative à PBKDF2 dans SJCL?

Idéalement, je voudrais simplement remplacer la fonctionnalité PBKDF2, mais je ne connais pas suffisamment le fonctionnement interne de SJCL pour savoir si cela est possible.

Si c'était possible, vous pouvez utiliser quelque chose comme cette implémentation pure JS bcrypt assez facilement j'imagine.

Répondre

2

Oui c'est possible mais nécessite plus de travail manuel. D'abord, vous devez compiler sjcl avec scrypt:

./configure --with-scrypt 
make 

Ensuite, vous devrez utiliser scrypt pour générer une paire de clés:

var salt = sjcl.random.randomWords(2,0); 
var key = sjcl.misc.scrypt(password, salt); 
var encrypted = sjcl.json.encrypt(key, original); 
var decrypted = sjcl.json.decrypt(key, encrypted); 
+0

Merci pour la réponse très utile. Je vais essayer ça plus tard. Y at-il un moyen de définir le nombre de tours ou le facteur de travail pour scrypt? –

+0

Juste pour quelqu'un d'autre qui trouve cela. Apparemment, passer le deuxième argument '0' à' sjcl.random.randomWords' est uniquement à des fins de test et [gravement] (https://github.com/bitwiseshiftleft/sjcl/issues/77) la sécurité des résultats clé. Je ne sais pas à quel point cela compte dans ce contexte, étant donné qu'il est utilisé pour le sel, mais je laisserai cela à des gens plus compétents que moi. –

+2

Un sel, comme un IV doit être non-répétitif et pas aussi aléatoire qu'une clé, donc 'sjcl.random.randomWords' avec le deuxième argument 0 devrait être bon. C'est aussi ce que sjcl utilise en interne pour pbkdf2. – Nils