web-dev-qa-db-fra.com

Module cryptographique Python recommandé?

J'ai exploré quels modules cryptographiques sont disponibles pour Python et j'ai trouvé 3: ezPyCrypt, yawPyCrypt et KeyCzar (qui prend en charge quelques langues, mais Python est inclus parmi elles). Les deux premiers reposent sur le module PyCrypto.

Y a-t-il des choix qui me manquent? Y a-t-il un favori pour la facilité et les fonctionnalités ou est-ce simplement une question de confort?

Je suis actuellement penché vers KeyCzar, derrière ezPyCrypt.

J'utiliserais la bibliothèque pour la signature et la vérification de signature numérique, et éventuellement pour la création de clés (bien que je ne pleure pas si je dois faire appel à autre chose pour cette fonctionnalité).

J'utilise Python 3.x et j'ai accès à GPG.

30
hewhocutsdown

Si vous vous trouvez dans un environnement incluant GnuPG et Python> = 2.4, vous pouvez également envisager un outil tel que python-gnupg . (Avertissement: je suis le responsable de ce projet.) Il laisse le gros du travail à gpg et fournit une API assez simple.

Vue d'ensemble de l'API:

 >>> importer gnupg 
 >>> gpg = gnupg.GPG (gnupghome = '/ chemin/vers/répertoire/répertoire') 
 >>> gpg.list_keys () 
 
 [{
 ... 
 'empreinte digitale': 'F819EE7705497D73E3CCEE65197D5DAC68F1AAB2', 
 'keyid': '197D5DAC68F1AAB2', 
 'longueur': '1024', 
 'type': 'pub', 
 'uids': ['', 'Gary Gross (un utilisateur test)']}, 
 {
 ... 
 'empreinte digitale': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A', 
 'keyid': '0C5FEFA7A921FC4A', 
 'longueur': '1024'. 
 ... 
 'uids': ['', 'Danny Davis (un utilisateur test)']}] 
 >>> crypté = gpg.encrypt ("Bonjour, world! ", ['0C5FEFA7A921FC4A']) 
 >>> str (crypté) 
 
 '----- COMMENCER LE MESSAGE PGP -----\nVersion: GnuPG v1.4.9 (GNU/Linux)\n 
\nhQIOA/6NHMDTXUwcEAf 
 ... 
 ----- FIN DU MESSAGE PGP -----\n '
 >>> decrypted = gpg.decrypt (str (crypté), passphrase = 'secret') 
 >>> str (décrypté) 
 'Bonjour, le monde!' 
 >>> signed = gpg.sign ("Au revoir, world! ", passphrase = 'secret') 
 >>> vérifié = vérifié = gpg.verify (str (signé)) 
 >>> print" Vérifié "si vérifié sinon" Non vérifié " 
 
 'Vérifié' 
13
Vinay Sajip

Une nouvelle bibliothèque de cryptographie pour Python est en développement rapide depuis quelques mois maintenant. La version 0.2.1 est arrivée il y a quelques jours.

https://cryptography.io/en/latest/

Il s’agit principalement d’une enveloppe CFFI entourant les bibliothèques C existantes telles que OpenSSL. Il est distribué sous forme de module pur Python et prend en charge les versions 2.6 à 3.3 de CPython ainsi que PyPy. C'est également l'amont du package pyOpenSSL refactoré.

Il vise à exposer des "recettes" de haut niveau qui rendent la cryptographie aussi résistante aux idiots que possible, ainsi que des primitives qui ne doivent être utilisées qu'avec la prudence appropriée. Les algorithmes symétriques (y compris AES-GCM) sont très bien supportés et des algorithmes asymétriques tels que RSA et DSA devraient apparaître dans les prochaines versions. PBKDF2, HKDF, HOTP et TOTP sont d’autres algorithmes remarquables pris en charge.

20
Ayrx

Une autre bibliothèque de chiffrement à considérer est PyCryptodome , un fork de PyCrypto avec support PyPy et quelques autres primitives (SHA-3, Salsa20, scrypt, etc.).

9

pycrypt est en fait un simple module de chiffrement/déchiffrement AES construit sur pycrypto comme les autres modules que vous mentionnez - notez que ce dernier est en train de passer à l'URL pycrypto.org alors qu'il change de responsable. , et les versions stables et la documentation sont toujours sur le site de l'auteur original. En plus des wrappers plus faciles à utiliser dont vous parlez, pycrypto a pour avantage qu'un sous-ensemble pur-python est fourni avec Google App Engine. Il serait donc utile de vous familiariser avec ce moteur. vouloir déployer n'importe quel code là-bas.

L’alternative majeure (un autre projet puissant et complexe, comme pycrypto) est le pyopenssl , qui est un wrapping assez régulier (un «cache-cache», comme le décrit l’auteur) de OpenSSL ( cela peut être un avantage si vous avez l'habitude de coder en C avec des appels à OpenSSL). Un emballage alternatif complet (fourni avec les bibliothèques nécessaires) et éventuellement plus sûr sur le plan juridique (à l'exclusion des parties sur lesquelles des litiges en matière de brevets ou des doutes sont soulevés) est distribué par egenix .

Les deux projets principaux (pycrypto et pyopenssl) ont connu de longues périodes d'inactivité plus ou moins différente de celles des auteurs d'origine, mais ils sont tous deux activement développés et entretenus, ce qui est toujours bon signe.

Je ne suis pas au courant de l'existence d'emballages faciles à utiliser sur pyopenssl (il y en a fort probablement, mais ils n'ont pas été annoncés comme ceux sur pycrypto) et donc, si, apparemment, vous vous souciez de la facilité d'utilisation et ne cherchez pas à écrire vous-même des enveloppes, celles qui se trouvent au-dessus de pycrypto semblent être un meilleur choix.

8
Alex Martelli

PyCrypto est mon choix atm (la dernière mise à jour de pypi le 2012-05-24) et le code source est hébergé sur GitHub: https://github.com/dlitz/pycrypto . Il peut exécuter des mathématiques Python pures ou utiliser libgmp _ (vous aurez besoin de Sudo apt-get install libgmp-dev sur Debian pour activer la dernière version).

M2Crypto est un wrapper pour OpenSSL (dernière mise à jour de pypi le 2011-01-15), le code source à l'adresse http://svn.osafoundation.org/m2crypto/ .

gnupg (mis à jour le 05/06/2013), voir réponse de Vinay Sajip . Il y a un patched fork (mis à jour le 31/07/2013) hébergé à l'adresse https://github.com/isislovecruft/python-gnupg

D'autres alternatives sont mentionnées par Alex Martelli

EDIT: critiques des paquets de chiffrement existants et références à de nouveaux nouveaux https://news.ycombinator.com/item?id=6194102

3
Andrei

Je viens juste de faire un sondage de ce type la semaine dernière et d’adopter M2Crypto, qui semble être l’encapsuleur le plus avancé au-dessus de openssl (trouvé dans plusieurs listes de recommandations sous Google). J'ai aussi essayé pycrypto, mais il manque la gestion des certificats et la gestion des formats de fichiers de clés standard de M2Crypto (avec pycrypto, vous devez conserver/décaper vos clés ou écrire votre propre gestionnaire de clés pour les formats courants).

J'ai trouvé que M2Crypto était assez facile à utiliser et était tout à fait capable de développer ce dont j'avais besoin (un format de package signé et crypté).

Cependant, je vous recommande de télécharger le package complet, pas seulement son installation, car vous y trouverez également des exemples de Nice (voir le répertoire de démonstration).

Voici le lien http://pypi.python.org/pypi/M2Crypto/0.20.1

Un inconvénient pourrait être que vous utilisez python 3.0, je suis bloqué avec 2.5 au travail (espérons bientôt 2.6) et je ne sais pas si M2Crypto fonctionne avec python 3.0

Je ne me suis pas beaucoup exercé pour le moment, si vous avez des problèmes spécifiques, posez-le ici. Quelqu'un peut répondre.

3
kriss

Que diriez-vous de PyCrypto (anciennement http://www.amk.ca/python/code/crypto.html ) ??

2
0x6adb015

Keyczar est cool, mais il manque le rembourrage OAEP | PKCS qui n’est disponible qu’en version Java. https://code.google.com/p/keyczar/wiki/KeyczarTool

En outre, pour le moment, il manque un cryptage basé sur mot de passe, disponible en C++. https://code.google.com/p/keyczar/issues/detail?id=149&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Implementation%20Summary

0
Marko Benko