AES - Chiffrement avec Crypto (node-js) / décryptage avec Pycrypto (python)
Je suis en train d'écrire cette question + réponse parce que j'ai eu beaucoup de mal (peut-être en raison d'un manque d'expérience), s'est perdu dans de nombreux différents moyens de cryptage/décryptage des choses avec nœud ou python.
J'ai pensé que peut-être que mon cas peut aider les gens dans le futur.
Ce que je devais faire:
- Obtenir les données à partir d'un formulaire, les chiffrer à l'aide de la Cryptographie (node-js)
- Transmettre les données chiffrées en Python et la décrypter à l'aide de PyCrypto.
J'ai choisi d'utiliser le chiffrement AES.
Voici comment j'ai commencé (je ne vais pas aller par le biais de tout ce que j'ai essayé):
- J'ai suivi l'exemple à la fin de cette page
Qui donne dans mon cas:
(cela pourrait être un très mauvais mélange entre javascript et coffeescript)
crypto = require "crypto" [...] key = "mykeywhatever" cipher = crypto.createCipher('aes192', key) cipher.update('string i want to encode', 'binary', 'hex') encoded_string = cipher.final('hex') [...]
Cela a fonctionné assez bien pour encoder ma chaîne.
- Ensuite, j'ai écrit mon script python pour déchiffrer cette chaîne, en utilisant le fichier lisez-moi sur PyCrypto de la page github:
from Crypto.Cipher import AES [...] my_string = data_coming_from_rabbitmq obj = AES.new('mykeywhatever', AES.MODE_CBC) obj.decrypt(ciphertext) [...]
De toute évidence, cela n'a pas fonctionné: dans le readme il y a un IV, mais depuis je n'ai pas donné une dans le nœud de script, pourquoi devrais-je donner un dans le python?
Après plusieurs recherches sur google, j'ai appris que le nœud de la Crypto utilise OpenSSL, tandis que PyCrypto apparemment ne l'est pas. Alors j'ai regardé dans que et ont trouvé que ces pages:
- Comment décrypter quelque chose avec PyCrypto qui a été chiffré à l'aide d'OpenSSL?
- Est AES même dans les bibliothèques PyCrypto & Node.JS Crypto
- et beaucoup plus...
Donc les choses se sont compliquées, personne n'est en train de faire la même chose pour déchiffrer les données, je me suis perdu, et demandé de l'aide.
La réponse est ce que mon collègue de travail et je suis venu avec (enfin surtout mon corworker).
source d'informationauteur nnaelle
Vous devez vous connecter pour publier un commentaire.
Nous avons donc commencé à partir de l' "Comment décrypter... OpenSSL" 's réponse.
Nous avons besoin de modifier le script de cryptage ce qui a donné:
iv doit être 16bytes de long, clé est 32bytes. Et nous avons changé la
createCipher
àcreateCipheriv
.Retour à l'python déchiffrement script:
Processus était tout simplement la lecture de PyCrypto de la documentation, et de comparer avec le code que nous avons commencé à partir de.
Alors nous avons décidé de tout tenir à l'APIet commencer à partir de zéro. Et il a donné:
Et c'était aussi simple que ça...
Espérons que ça aidera certains d'entre vous!
Mise à jour:
Que les Perséides a écrit dans les commentaires de sa réponse, le IV doit être aléatoire et différent pour chaque message
Le système de construction est probablement l'insécurité
À l'exception pour le stockage en gros, vous ne voulez jamais juste de crypter vos données, mais aussi authentifier. L'authentification dans ce contexte signifie qu'un message valide ne peut être généré que par quelqu'un qui connaît la clé. Largement utilisé de schéma d'authentification est HMAC.
Si vous n'avez pas à s'authentifier vos messages n'importe qui peut alimenter les données dans votre service. Un attaquant pourrait ne pas être en mesure de contrôler entièrement le résultat après déchiffrement, mais il/elle peut encore être très dangereux. Par exemple, si vous utilisez de la SRC (vous faire) et les plus communs des remplissages des régimes (AES est un algorithme de chiffrement par bloc et ne peut crypter 128 bits des Blocs de données) et un attaquant peut différencier entre une marge d'erreur et de toute autre erreur alors tous vos messages peuvent être déchiffrées par un attaquant. Ceci est appelé un padding oracle attaque et est loin trop commun.
Pour protéger contre ce type d'attaque, vous pouvez utiliser un authentifié schéma de chiffrementpar exemple le GCM blockcipher mode.
Aussi, vous devez le protéger contre les attaques de relecture. Envisager une application bancaire et les données que vous transmettez est une banque d'un ordre de transfert. En l'absence de toute TAN un attaquant peut enregistrer une transaction précédente et la relecture de cette opération à votre service, encore et encore, donc le transfert d'un multiple de l'argent que le client voulait à l'origine.
Est la forme que vous obtenez les données transmises via le protocole HTTPS? Si non: la clé de eavesdropped par un attaquant? Comment l'utilisateur de savoir qu'il a eu la forme de vous et pas quelqu'un d'autre (SSL/TLS est autant à propos de l'authentification, car il est au sujet de la confidentialité).
J'ai probablement oublié quelques autres vecteurs d'attaque simple CBC-cryptage offre.
Alternatives
Probablement la façon la plus simple pour se protéger contre ces attaques est de transmettre les données du formulaire sur HTTPS. SSL/TLS a été conçu pour éviter toutes ces attaques et le client et côté serveur implémentations avait du temps à mûrir.