2009-07-16 13 views
29

Ho esplorato quali moduli crittografici sono disponibili per Python, e ho trovato 3: ezPyCrypt, yawPyCrypt e KeyCzar (che in realtà supporta alcune lingue, ma Python è incluso tra di loro). I primi due si basano sul modulo PyCrypto.Modulo di crittografia Python consigliato?

Ci sono delle scelte che mi mancano? C'è un chiaro front runner per la facilità e le caratteristiche o semplicemente si riduce a un livello di comfort?

Attualmente mi sto appoggiando a KeyCzar, con ezPyCrypt molto vicino.

Utilizzerei la libreria per la firma e la verifica delle firme digitali e potenzialmente per la creazione delle chiavi (anche se non piangerò se devo fare una chiamata a qualcos'altro per quella funzionalità).

Sto usando Python 3.x e ho accesso a GPG.

+0

aggiornato la mia risposta con panoramica delle API per python-gnupg –

+0

Versione 0.2 di python-GnuPG è ora disponibile - testato con Python 3.0 –

+0

A partire dalla versione Python 2.6 esiste una libreria standard ssl "wrapper TLS/SSL per oggetti socket" (riferimento http://docs.python.org/2/library/ssl.html). –

risposta

13

Se ci si trova in un ambiente che include GnuPG e Python> = 2.4, è possibile prendere in considerazione anche uno strumento come python-gnupg. (Disclaimer: Sono il manutentore di questo progetto.) Lascia il pesante sollevamento a gpg e fornisce un'API abbastanza semplice.

Panoramica delle API:

 
>>> import gnupg 
>>> gpg = gnupg.GPG(gnupghome='/path/to/keyring/directory') 
>>> gpg.list_keys() 

[{ 
    ... 
    'fingerprint': 'F819EE7705497D73E3CCEE65197D5DAC68F1AAB2', 
    'keyid': '197D5DAC68F1AAB2', 
    'length': '1024', 
    'type': 'pub', 
    'uids': ['', 'Gary Gross (A test user) ']}, 
{ 
    ... 
    'fingerprint': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A', 
    'keyid': '0C5FEFA7A921FC4A', 
    'length': '1024', 
    ... 
    'uids': ['', 'Danny Davis (A test user) ']}] 
>>> encrypted = gpg.encrypt("Hello, world!", ['0C5FEFA7A921FC4A']) 
>>> str(encrypted) 

'-----BEGIN PGP MESSAGE-----\nVersion: GnuPG v1.4.9 (GNU/Linux)\n 
\nhQIOA/6NHMDTXUwcEAf 
... 
-----END PGP MESSAGE-----\n' 
>>> decrypted = gpg.decrypt(str(encrypted), passphrase='secret') 
>>> str(decrypted) 
'Hello, world!' 
>>> signed = gpg.sign("Goodbye, world!", passphrase='secret') 
>>> verified = verified = gpg.verify(str(signed)) 
>>> print "Verified" if verified else "Not verified" 

'Verified' 
+0

Sono incuriosito ... ti dispiacerebbe dare una breve spiegazione sul motivo per cui si dovrebbe usare py-gpg su PyCrypt? – hewhocutsdown

+0

Per un'interoperabilità più semplice con altri sistemi e se l'API soddisfa le vostre esigenze più da vicino. Ad esempio, ho recentemente lavorato a un progetto con una grande banca internazionale che ha utilizzato GnuPG per inviare dati crittografati al mio cliente. Con GnuPG che ha svolto il lavoro alla nostra fine, non ci sono stati problemi di compatibilità e interoperabilità di cui preoccuparsi. –

+1

N.B. Non ho provato Python-gnupg con Python 3.x - tienilo a mente. –

8

pycrypt è in realtà un semplice crittografare AES/decifrare modulo costruito in cima ad pycrypto come gli altri moduli, si fa riferimento - notare che quest'ultima è la transizione all'URL pycrypto.org come sta cambiando manutentori, e le versioni stabili e documenti sono ancora all'autore originale site. Oltre ai wrapper più facili da usare che hai menzionato, uno in più di pycrypto è che un puro python subset viene fornito con App Engine di Google, quindi prendere confidenza con esso sarebbe utile se desideri distribuire qualsiasi codice lì .

La principale alternativa (un altro progetto potente e complesso, come pycrypto) è pyopenssl, che è un involucro abbastanza regolare (un "involucro sottile", come l'autore descrive) di OpenSSL (che può essere un vantaggio se' riusato a codificare in C con le chiamate a OpenSSL). Un imballaggio alternativo che è completo (fornito con le librerie necessarie) e possibilmente legalmente più sicuro (esclude le parti su cui ci sono dispute o dubbi sui brevetti) è distribuito da egenix.

Entrambi i progetti principali (pycrypto e pyopenssl) hanno attraversato lunghi periodi di maggiore o minore inattività mentre gli autori originali passavano ad altro, ma entrambi sono attivamente sviluppati e mantenuti di nuovo, il che è sempre un buon segno.

Non sono a conoscenza di wrapper facili da usare in cima a pyopenssl (probabilmente lo sono, ma non sono stati pubblicizzati come quelli su pycrypto) e quindi, se come sembra che ti interessi Facilità d'uso e non stai cercando di scrivere involucri tu stesso, quelli su pycrypto sembrano essere una scelta migliore.

+0

a un certo punto questo potrebbe cambiare, ma al momento non sono affatto in grado di scrivere quel tipo di wrapper. :) Quindi probabilmente mi attaccherò a quelli di pycrypto, a meno che questa idea di py-gpg sia migliore. Grazie per aver segnalato pyopenssl! – hewhocutsdown

3

La settimana scorsa ho appena effettuato un sondaggio e ho adottato M2Crypto che sembra essere il wrapper più avanzato oggi sopra openssl (lo ho trovato in diversi elenchi di raccomandazioni mentre si cercava su google). Ho anche provato Pythonto ma manca la gestione dei certificati e la gestione del formato dei file chiave standard che M2Crypto ha (con pycrypto devi mettere sottosopra/sbloccare le tue chiavi o scrivere il tuo gestore di chiavi per i formati comuni).

Ho trovato che M2Crypto era abbastanza facile da usare ed era perfettamente in grado di sviluppare ciò di cui avevo bisogno (un formato di pacchetto firmato e crittografato).

Tuttavia consiglio di scaricare il pacchetto completo, non solo di installarlo facilmente, perché nel pacchetto si ottengono anche degli esempi (guarda la directory demo).

Ecco il link http://pypi.python.org/pypi/M2Crypto/0.20.1

Un inconveniente potrebbe essere che si sta utilizzando Python 3.0, mi sono bloccato con 2,5 al lavoro (si spera 2.6 presto) e non so se M2Crypto lavora con Python 3.0

Non ho ancora molta pratica con esso, metti se hai problemi specifici con esso basta chiedere qui. Qualcuno potrebbe rispondere.

3

PyCrypto è la mia scelta atm (ultimo aggiornamento pypi 2012-05-24) e il codice sorgente è ospitato su GitHub: https://github.com/dlitz/pycrypto. Può eseguire pura matematica Python o usare libgmp (è necessario sudo apt-get install libgmp-dev su Debian per abilitare l'ultima).

M2Crypto è un wrapper per OpenSSL (ultimo aggiornamento pypi 2011-01-15), codice sorgente http://svn.osafoundation.org/m2crypto/.

gnupg (aggiornato il 2013-06-05), vedere Vinay Sajip's answer. C'è un patched fork (aggiornato 2013/07/31) ospitato presso https://github.com/isislovecruft/python-gnupg

Altre alternative sono menzionate da Alex Martelli

EDIT: i critici di pacchetti cripto esistenti e riferimenti ad alcuni nuovi https://news.ycombinator.com/item?id=6194102

16

Una nuova crittografia libreria per Python è in rapido sviluppo da alcuni mesi. La versione 0.2.1 è appena successo qualche giorno fa.

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

E 'principalmente un wrapper CFFI librerie C come ad esempio OpenSSL intorno esistente. È distribuito come un modulo Python puro e supporta le versioni CPython 2.6 - 3.3 e PyPy. È anche l'upstream del pacchetto pyOpenSSL refactored.

Ha lo scopo di esporre "ricette" di alto livello che rendono la crittografia il più possibile a prova di idiota e primitive che dovrebbero essere utilizzate con la dovuta cautela. Gli algoritmi simmetrici (incluso AES-GCM) sono molto ben supportati e algoritmi asimmetrici come RSA e DSA dovrebbero essere disponibili nelle prossime versioni. Altri algoritmi noti supportati includono PBKDF2, HKDF, HOTP e TOTP.

8

Un'altra libreria di crittografia da considerare è PyCryptodome, un fork di PyCrypto con supporto PyPy e alcuni altri primitivi (SHA-3, Salsa20, scrypt, ecc.).