web-dev-qa-db-fra.com

Nodejs createCipher vs createCipheriv

J'essaie actuellement de crypter les données au repos avec NodeJS, j'ai lu dans les documents Node API que createCipher n'est pas recommandé .

L'implémentation de crypto.createCipher () dérive des clés à l'aide de la fonction OpenSSL EVP_BytesToKey avec l'algorithme de résumé défini sur MD5, une itération et sans sel. Le manque de sel permet des attaques par dictionnaire car le même mot de passe crée toujours la même clé. Le faible nombre d'itérations et l'algorithme de hachage non cryptographiquement sécurisé permettent de tester les mots de passe très rapidement.

Conformément à la recommandation d'OpenSSL d'utiliser pbkdf2 au lieu de EVP_BytesToKey, il est recommandé aux développeurs de dériver eux-mêmes une clé et un IV à l'aide de crypto.pbkdf2 () et d'utiliser crypto.createCipheriv () pour créer l'objet Cipher.

createCipher est-il toujours un moyen viable et sécurisé de crypter les données au repos? Cette méthode doit-elle être considérée comme obsolète? Est-il possible pour un attaquant bien informé de déchiffrer potentiellement des données?

Une solution utilisant createCipheriv doit-elle toujours être préférée à createCipher?

Tous autres détails ou recommandations appréciés.

14
andrsnn

CreateCipher est-il toujours un moyen viable et sécurisé de crypter les données au repos?

Bien qu'il ne soit bien sûr jamais recommandé d'utiliser des appels d'API dépréciés, il est possible de créer un système sécurisé en utilisant createCipher. Pour cela, le "mot de passe" donné doit être suffisamment solide pour résister aux attaques hors ligne et éventuellement parallèles. Pour cela, le mot de passe donné doit avoir suffisamment d'entropie (doit être suffisamment aléatoire) pour ne pas être deviné. Par exemple, vous pouvez créer des mots de passe d'environ 80 bits ou plus à l'aide d'un gestionnaire de mots de passe et les utiliser.

Une solution utilisant createCipheriv doit-elle toujours être préférée à createCipher?

Oui, ne serait-ce que parce que l'auteur vous a déjà prévenu et que toute révision de votre code devra reconsidérer si createCipher est toujours viable. Si la méthode est jamais supprimée du CryptoJS (peu probable, mais elle est finalement obsolète), votre code ne fonctionnera plus.

Néanmoins, l'utilisation de createCipheriv sera moins sûre que createCipher si vous utilisez un mot de passe directement comme clé. Vous devez toujours utiliser une fonction de dérivation de clé basée sur un mot de passe correcte telle que PBKDF2 pour dériver le matériau de la clé de sortie - comme indiqué dans la documentation mise à jour.

Tous autres détails ou recommandations appréciés.

Dans la plupart des cas, vous souhaitez utiliser une méthode de chiffrement/déchiffrement haut de gamme telle que la syntaxe de message cryptographique (CMS, spécifié dans PKCS # 7), PGP ou des protocoles/formats de conteneur haut de gamme similaires.

Si vous avez vraiment besoin d'utiliser directement un chiffrement, vous devriez essayer de voir si chiffrement authentifié tel que proposé par GCM est une option.

2
Maarten Bodewes

La fonction createCipher désormais dépréciée ne permettait pas une iv unique, c'est pourquoi createCipheriv est préféré.

Tout en dérivant une clé à l'aide d'une fonctionnalité de dérivation de clé, il n'aide pas à protéger le texte chiffré contre les attaques de dictionnaire qu'un iv empêche.

0
jas-