web-dev-qa-db-ja.com

推奨Python暗号化モジュール?

Pythonで使用できる暗号化モジュールを調べてみたところ、3:ezPyCrypt、yawPyCrypt、KeyCzar(実際にはいくつかの言語をサポートしていますが、Pythonが含まれています))が見つかりました。最初の2つは、PyCryptoモジュールに依存しています。

私が見逃している選択肢はありますか?使いやすさと機能のための明確なフロントランナーはありますか、それとも単に自分の快適さのレベルに落ち着きますか?

私は現在KeyCzarに傾倒しており、ezPyCryptがすぐ後ろにあります。

私はこのライブラリをデジタル署名の署名と検証に使用し、場合によってはキーの作成にも使用します(ただし、その機能のために他の何かを呼び出す必要がある場合は泣きません)。

Python 3.xを使用していて、GPGにアクセスできます。

30
hewhocutsdown

GnuPGとPython> = 2.4を含む環境にいる場合は、 python-gnupg などのツールを検討することもできます。(免責事項:私はこのプロジェクトのメンテナーです。)それはgpgに手間をかけ、かなり単純なAPIを提供します。

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(テストユーザー)']}、
 {
 ... 
 'fingerprint': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A'、
 'keyid': '0C5FEFA7A921FC4A'、
 'length': ' 
 ... 
 'uids':[''、 'Danny Davis(テストユーザー)']}] 
 >>>暗号化= gpg.encrypt( "Hello、 world! "、['0C5FEFA7A921FC4A'])
 >>> str(encrypted)
 
 '----- BEGIN PGP MESSAGE -----\nバージョン:GnuPG v1.4.9(GNU/Linux)\ n 
\nhQIOA/6NHMDTXUwcEAf 
 ... 
 ----- END PGP MESSAGE -----\n '
 >>>復号化= gpg.decrypt(str(encrypted)、passphrase = 'secret')
 >>> str(decrypted)
 'こんにちは、世界!' 
 >>>署名済み= gpg.sign( "さようなら、 world! "、passphrase = 'secret')
 >>>検証済み=検証済み= gpg.verify(str(signed))
 >>>検証済みの場合は「検証済み」を出力それ以外の場合は「未検証」 
 
「確認済み」
13
Vinay Sajip

Pythonの新しい暗号化ライブラリは、ここ数か月間急速に開発されています。0.2.1リリースは数日前に発生しました。

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

これは主に、OpenSSLなどの既存のCライブラリのCFFIラッパーです。純粋なpythonモジュールとして配布され、CPythonバージョン2.6〜3.3およびPyPyをサポートします。また、リファクタリングされたpyOpenSSLパッケージのアップストリームでもあります。

これは、暗号化を可能な限りばかげたものにする高レベルの「レシピ」と、適切な注意を払ってのみ使用する必要のあるプリミティブを公開することを目的としています。対称アルゴリズム(AES-GCMを含む)は非常によくサポートされており、RSAやDSAなどの非対称アルゴリズムは次のいくつかのリリースで提供される予定です。サポートされている他の注目すべきアルゴリズムには、PBKDF2、HKDF、HOTP、TOTPが含まれます。

20
Ayrx

考慮すべきもう1つの暗号ライブラリは PyCryptodome 、PyPyサポートといくつかのプリミティブ(SHA-3、Salsa20、scryptなど)を備えたPyCryptoのフォークです。

pycrypt は、実際には、その上に構築された単純なAES暗号化/復号化モジュールです pycrypto あなたが言及した他のモジュールと同様に、後者はpycrypto.orgURLに移行していることに注意してください。メンテナを変更し、安定したバージョンとドキュメントはまだ元の作者の サイト にあります。あなたが言及した使いやすいラッパーに加えて、pycryptoの1つのプラスは、pure-python subset がGoogleのApp Engineに付属していることです。したがって、このラッパーに慣れておくと便利です。そこにコードをデプロイしたいと思ったことはありませんか。

主要な代替案(pycryptoのような別の強力で複雑なプロジェクト)は pyopenssl です。これは、 OpenSSL のかなり規則的なラッピング(作成者が説明する「薄いラッパー」)です。 =(OpenSSLの呼び出しを使用してCでコーディングすることに慣れている場合はプラスになる可能性があります)。完全で(必要なライブラリが付属している)、おそらく法的に安全な(特許紛争や疑いがある部分を除く)代替パッケージは、 egenix によって配布されます。

両方の主要なプロジェクト(pycryptoとpyopenssl)は、元の作者が他のことを続けたため、多かれ少なかれ長期間非アクティブでしたが、両方とも積極的に開発され、再び維持されています。これは常に良い兆候です。

Pyopensslの上にある使いやすいラッパー(おそらくありますが、pycryptoの上にあるもののように公開されていません)を私は知りません。自分でラッパーを作成することを考えていない場合は、pycryptoの上にあるラッパーの方が適しているようです。

8
Alex Martelli

PyCrypto は私の選択したatm(最新のpypiアップデート2012-05-24)であり、ソースコードはGitHubでホストされています: https://github.com/dlitz/pycrypto 。純粋なPython mathを実行するか、 libgmp を使用できます(最新を有効にするには、DebianでSudo apt-get install libgmp-devが必要です)。

M2Crypto はOpenSSL(最新のpypiアップデート2011-01-15)のラッパーであり、ソースコードは http://svn.osafoundation.org/m2crypto/ です。

gnupg (2013-06-05更新)、 Vinay Sajipの回答 を参照してください。 パッチが適用されたフォーク (2013年7月31日更新)が https://github.com/isislovecruft/python-gnupg でホストされています

他の選択肢は Alex Martelli によって言及されています

編集:既存の暗号パッケージの批評家といくつかの新しいものへの参照 https://news.ycombinator.com/item?id=6194102

3
Andrei

私は先週そのような調査を行い、opensslの上で今日最も高度なラッパーのように見えるM2Cryptoを採用しました(グーグル中にいくつかの推奨リストでそれを見つけました)。 pycryptoも試しましたが、M2Cryptoの証明書管理と標準のキーファイル形式管理がありません(pycryptoを使用すると、キーをピクルス/ピクルス解除するか、一般的な形式の独自のキーマネージャーを作成する必要があります)。

M2Cryptoは非常に使いやすく、必要なもの(署名および暗号化されたパッケージ形式)を迅速に開発できることがわかりました。

ただし、パッケージには素敵な例も含まれているため、簡単にインストールするだけでなく、完全なパッケージをダウンロードすることをお勧めします(デモディレクトリを参照)。

ここにリンクがあります http://pypi.python.org/pypi/M2Crypto/0.20.1

欠点は、あなたがpython 3.0を使用していることです。私は仕事で2.5で立ち往生しており(できればすぐに2.6)、M2Cryptoがpython3.0で動作するかどうかわかりません。

私はまだそれをあまり練習していません、あなたがそれに関して特定の問題を抱えているならば、ただここに尋ねてください。誰かが答えるかもしれません。

3
kriss

PyCrypto (以前の http://www.amk.ca/python/code/crypto.html )はどうですか??

2
0x6adb015

Keyczarはかっこいいですが、OAEP | PKCSパディングがなく、Javaバージョンでのみ使用できます。 https://code.google.com/p/keyczar/wiki/KeyczarTool

また、現時点では、C++で使用できるパスワードベースの暗号化がありません。 https://code.google.com/p/keyczar/issues/detail?id=149&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Implementation%20Summary

0
Marko Benko