Python での MD5 ハッシュ

TJ Lerias 2023年1月30日
  1. ハッシュとは何ですか
  2. MD5 とは何ですか
  3. Python hashlib モジュール
  4. Python で MD5 アルゴリズムを使用する
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'}
md5algorithms_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() メソッドを使用して取得できます。