python 3のmd 5暗号化

8681 ワード

python 3の標準ライブラリではmd 5が削除されているが、hash暗号化アルゴリズムについては、SHA 1、SHA 224、SHA 256、SHA 384、SHA 512、MD 5アルゴリズムなどのhashlibという標準ライブラリに置かれている.
また、pythonに関するmd 5暗号化をネットで探してみると、現在のpyバージョンが適用されていない古い文章や、はっきり言えない文章でなければ、自分で公式ドキュメントを見に行ったほうがいいので、ついでにmd 5の使い方について整理します.
どのプログラム類の知識を学ぶにも、公式文書を読むという学習方式が最も効果的な一つだと思いますが、一般的にはこれらの文書は英語版で、一部の学習者にとっては一定の敷居があるかもしれませんが、英語の文章を読むことに慣れていることは非常に重要です.
python 3のhashlibドキュメントを直接読むことをお勧めします.https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits
hashlibライブラリのhashアルゴリズムには、sha 1()、sha 224()、sha 256()、sha 384()、sha 512()、blake 2 b()、blake 2 s()、md 5()の多くの暗号化アルゴリズムが提供されており、これらの方法は、統合インタフェースを介してオブジェクトを返し、例えばsha 256()を使用してSHA−256のハッシュオブジェクトを作成することができる.
もちろん、md 5暗号化アルゴリズムを行うには、md 5()メソッドを使用します.
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'

#       
>>> hashlib.md5(b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

#      hash.new()      
>>> hashlib.new('md5', b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

以上は英語に対してmd 5暗号化を行い、中国語を暗号化する場合、上記のように書くとエラーが発生することに気づきました.文字トランスコードの問題が原因で、以下のように書きます.
>>> import hashlib
>>> data = '  '
>>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

ここでまずデータをUTF-8形式に変換し、ネット上のツールを使用して暗号化した結果、あるmd 5暗号化ツールはUTF-8形式で暗号化されていないことが分かった.テストの結果、UTF-8、GBK、GB 2312、GB 18030に変更でき、大文字と小文字を区別しないことが分かった(GBK/GB 2312/GB 18030はいずれも漢字の符号化であるため、md 5暗号化後の結果は同じである).これらの符号化フォーマットのほかに、他の符号化もありますが、まだ発見されていません.補足を待っています.次の例を参照してください.
>>> hashlib.md5('  '.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

>>> hashlib.md5('  '.encode(encoding='GBK')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('  '.encode(encoding='GB2312')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('  '.encode(encoding='GB18030')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

md 5の書き方を調べるだけなら、上の例を見れば十分です.python初心者であれば、これらの方法の意味と使い方を知りたいので、次の内容を見続けてください.
解析
1. hashlib.新(name[,data])メソッド
これは一般的な方法です.nameはmd 5のようなハッシュ暗号化アルゴリズムの名前を入力する.dataは暗号化が必要なデータを入力し、無視してupdate()に入力します.
>>> m = hashlib.new('md5')
>>> m.update(b'123456')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
hashlib.algorithms_guaranteedまたはhashlib.algorithms_availableの2つの組み込みプロパティを使用して、hashlibがサポートする暗号化アルゴリズムを表示できます.hashlib.algorithms_guaranteedは、hashlibモジュールによってサポートされるhashアルゴリズム名を保証するすべてのプラットフォームの集合である.hashlib.algorithms_availableは、現在実行されているpythonコンパイラで使用可能なhashアルゴリズム名の集合であり、OpenSSLのため、その中に重複するhashアルゴリズム名が現れる可能性がある.hashlib.algorithms_guaranteedhashlib.algorithms_availableのサブセットです.次の出力を見てください.
>>> hashlib.algorithms_guaranteed
{'sha3_384', 'md5', 'blake2s', 'sha3_512', 'blake2b', 'shake_128', 'sha384', 'sha3_256', 'sha1', 'shake_256', 'sha3_224', 'sha512', 'sha256', 'sha224'}
>>> hashlib.algorithms_available
{'whirlpool', 'ripemd160', 'dsaEncryption', 'sha1', 'SHA224', 'sha512', 'sha256', 'SHA512', 'blake2s', 'blake2b', 'SHA256', 'sha384', 'sha3_256', 'SHA384', 'sha', 'sha224', 'RIPEMD160', 'shake_128', 'sha3_512', 'SHA', 'MD5', 'shake_256', 'DSA', 'sha3_384', 'DSA-SHA', 'ecdsa-with-SHA1', 'md5', 'SHA1', 'dsaWithSHA', 'md4', 'MD4', 'sha3_224'}

2. hash.update(arg)
argオブジェクトを転送してhashのオブジェクトを更新します.この方法はbyteタイプのみを受け入れます.そうしないと、エラーが発生します.これが、パラメータの前にbを追加してタイプを変換する理由です.
>>> m = hashlib.md5()
>>> m.update('123456')
TypeError: Unicode-objects must be encoded before hashing

また、update(arg)メソッドを繰り返し呼び出すことは、上書きではなく、受信したargパラメータをつなぎ合わせることに注意してください.この点に注意しなければなりません.update()の原理に慣れていないと、穴が開く可能性が高いからです.すなわち、m.update(a); m.update(b)m.update(a+b)に等価であり、以下の例を参照する.
>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
>>> m.update(b'456')
>>> m.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

>>> hashlib.md5(b'123456').hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

3. hash.hexdigest()
英語ではhexは16進数の意味があることはよく知られているので、hashのデータをデータに変換し、16進数しか含まれていない.他にもdigest()メソッド.