Python での MD5 ハッシュ
この記事では、Python の hashlib
モジュールを使用して MD5 ハッシュを使用する方法を示します。
ハッシュとは何ですか
ハッシュは、可変長のデータを取得して固定長に変換する関数です。ハッシュ関数から返される値は、ハッシュ値、ハッシュコード、またはダイジェストと呼ばれます。ハッシュ値は通常、ハッシュテーブルと呼ばれる固定サイズのテーブルにインデックスを付けるために使用されます。
MD5 とは何ですか
MD5 メッセージダイジェストアルゴリズムは、128 ビットのハッシュ値を生成する一般的なハッシュ関数です。当初は暗号化ハッシュ関数として設計されていましたが、現在では、複数のセキュリティ問題と脆弱性のために、データの整合性を検証するために一般的に使用されています。
Python hashlib
モジュール
Python 標準ライブラリは、hashlib
と呼ばれるさまざまなセキュアハッシュおよびメッセージダイジェストアルゴリズムを実装するモジュールで構成されています。また、Python がプラットフォームで使用する OpenSSL ライブラリに応じて、利用可能な追加のアルゴリズムが含まれる場合があります。
ハッシュアルゴリズムを使用するには、hashlib
モジュールをインポートします。
import hashlib
これで、このモジュールでサポートされているハッシュアルゴリズムを使用できます。実行中の Python インタープリターで使用可能なハッシュアルゴリズムを確認するには、定数属性 algorithms_available
を使用します。
import hashlib
print(hashlib.algorithms_available)
出力:
{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}
上記のリストは、OpenSSL の利用可能なアルゴリズムを含む、hashlib
で利用可能なアルゴリズムです。
このモジュールによってすべてのプラットフォームでサポートされることが保証されているハッシュアルゴリズムを確認するには、定数属性 algorithms_guaranteed
を使用します。
import hashlib
print(hashlib.algorithms_guaranteed)
出力:
{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
md5
は algorithms_guaranteed
のリストに含まれていますが、一部の FIPS 準拠のアップストリームベンダーは、それを除外する Python ビルドを提供しています。Python で MD5 アルゴリズムを使用する
md5 アルゴリズムを使用するには、md5()
コンストラクターを使用し、update()
メソッドを使用してハッシュオブジェクトにバイトのようなオブジェクトをフィードするか、コンストラクターのパラメーターとしてデータを渡します。
ハッシュ値を取得するには、digest()
メソッドを使用します。このメソッドは、ハッシュオブジェクトに供給されたデータの bytes
オブジェクトダイジェストを返します。
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.digest())
出力:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
データをパラメーターとしてコンストラクターに渡し、ハッシュ値を取得することもできます
import hashlib
print(hashlib.md5(b"Hello World").digest())
出力:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
digest()
メソッドと同様に、hexdigest()
を使用することもできます。これは、16 進数のみを含むダイジェストの文字列オブジェクトを返します。
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.hexdigest())
出力:
b10a8db164e0754105b7a99be72e3fe5
文字列リテラルが update()
メソッドに渡される前に b
があることに注意してください。これは、タイプ str
の代わりにタイプ bytes
のインスタンスを作成するために使用されます。ハッシュ関数は一連のバイトのみをパラメーターとして受け入れるためです。文字列オブジェクトを update()
メソッドに渡すことはサポートされていません。
update()
メソッドを複数回呼び出すこともできます。これは、すべての引数が連結された 1 回の呼び出しに相当します。
import hashlib
first_hash = hashlib.md5()
first_hash.update(b"Hello World, Hello Python")
print(first_hash.hexdigest())
second_hash = hashlib.md5()
second_hash.update(b"Hello World,")
second_hash.update(b" Hello Python")
print(second_hash.hexdigest())
出力:
b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a
要約すると、md5()
コンストラクターのパラメーターとしてデータを渡すか、update()
メソッドを使用することで、データを供給することができる hashlib
モジュールを介して md5
ハッシュアルゴリズムを使用できます。ハッシュ値は、digest()
メソッドの bytes
オブジェクトを返す digest()
メソッドまたは 16 進数のみを含むダイジェストの文字列オブジェクトを返す hexdigest()
メソッドを使用して取得できます。