PythonでMD5ハッシュを生成する方法|hashlibモジュールの使い方を徹底解説
データセキュリティは、あらゆるIT企業にとって最重要課題の一つです。データを保護し、その完全性を検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonを使ってMD5ハッシュを生成・エンコードする方法を、具体的なコード例とともにわかりやすく解説します。
ハッシュとは何か
ハッシュとは、可変長のバイト列を入力として受け取り、それを固定長のバイト列へと変換する関数のことです。重要な特徴として、元のデータ(入力されたバイト列)を復元することが極めて困難である点が挙げられます。例えば、入力を x、ハッシュ関数を f とした場合、f(x) の計算は高速かつ簡単に行えますが、そこから x を逆算して取り出すことは非常に時間のかかる、事実上不可能な作業です。
ハッシュ関数の戻り値は、「ハッシュ」「チェックサム」「ハッシュ値」「メッセージダイジェスト」などと呼ばれます。
これらを整理すると、ハッシュ関数には以下のような性質があります。
- 任意の長さのデータを受け取れる
- 常に固定長の出力を返す
- 同じ入力に対しては必ず同じ出力になる(決定性)
- 出力から入力を復元することが困難である(一方向性)
例えば、「Hello World」というメッセージをMD5ハッシュ関数に通すと、32桁の16進数文字列が結果として得られます。
ハッシュ関数の実用的な用途
実際の開発現場では、ハッシュ関数は暗号アルゴリズム、デジタル署名、指紋認証、パスワードの保存など、幅広い分野で活用されています。Pythonプログラマーにとっても、以下のような場面でハッシュ関数は欠かせません。
- データやファイルの重複チェック
- 公衆ネットワーク経由でデータを送信する際の整合性(改ざんされていないか)の確認
- データベースへのパスワード保存時の暗号化
代表的な2つのハッシュアルゴリズム:MD5とSHA
- MD5 … MD5(Message Digest Algorithm)は128ビットのハッシュ値を生成するアルゴリズムです。ただし、いくつかのセキュリティ上の脆弱性が判明しているため、現在では主にデータの整合性チェック用途に限って使用されるのが一般的です。
- SHA … SHAグループには複数のアルゴリズムが含まれており、米国連邦情報処理標準(FIPS)のもとで開発されました。MD5よりもはるかに安全性が高いため、暗号アプリケーションをはじめとする多くの分野で広く採用されています。生成されるメッセージダイジェストの長さは160ビットから512ビットの範囲です。
PythonのhashlibモジュールでMD5を使う
Pythonの標準ライブラリには hashlib というモジュールが含まれており、主要なハッシュアルゴリズムのほとんどが収録されています。多くのアルゴリズムはhashlib内に直接実装されていますが、OpenSSLがインストールされている環境では、OpenSSL経由のアルゴリズムもhashlibから利用できます。
まず、ハッシュアルゴリズムを使用するには、hashlibモジュールをインポートします。
import hashlib
続いて、hashlibモジュールで現在使用可能なアルゴリズムの一覧を確認してみましょう。
>>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}
この algorithms_available の一覧には、OpenSSL経由で利用できるアルゴリズムも含まれています。
一方、どの環境でも必ず利用できることが保証されているアルゴリズムの一覧を確認したい場合は、algorithms_guaranteed を使います。
>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}
MD5ハッシュを生成するサンプルコード
それでは、MD5アルゴリズムを使ったシンプルなプログラムを作成してみましょう。
コード
import hashlib hash_obj = hashlib.md5(b'Hello, Python!') print(hash_obj.hexdigest())
出力
a0af7810eb5fcb84c730f851361de06a
このコードは、「Hello, Python!」という文字列を入力として受け取り、その16進数(HEX)形式のダイジェストを出力します。hexdigest() メソッドは、ハッシュ値を表すHEX文字列を返します。
バイト列としてハッシュ値を取得する場合
もし戻り値をバイト列(bytesオブジェクト)として取得したい場合は、hash_obj.digest() を使用します。
import hashlib hash_obj = hashlib.md5(b'Hello, Python!') # バイト列を生成 print(hash_obj.digest())
出力
b'\xa0\xafx\x10\xeb_\xcb\x84\xc70\xf8Q6\x1d\xe0j'
ここで注目していただきたいのは、文字列リテラルの前に「b」を付けている点です。これは文字列をバイト列に変換するための指定で、ハッシュ関数はパラメータとしてバイト列のみを受け付けるため必要になります。
ユーザー入力した文字列をハッシュ化する場合
コンソールから入力された文字列をハッシュ化したい場合は、encode() メソッドで文字列をバイト列にエンコードすることを忘れないようにしましょう。
import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.md5(mystring.encode())
print(hash_obj.hexdigest())
出力
Enter string to hash: Hello, TutorialsPoint 9a5d3fad65690dcf44adaec67226abe7
まとめ
Pythonでは、標準ライブラリのhashlibモジュールを使うことで、MD5をはじめとする各種ハッシュアルゴリズムを簡単に利用できます。ポイントは以下の3つです。
- ハッシュ関数にはバイト列を渡す必要がある(文字列は
b''やencode()で変換) - 16進数文字列が欲しい場合は
hexdigest()、バイト列が欲しい場合はdigest()を使用 - MD5には脆弱性があるため、パスワード保存などセキュリティが重要な用途にはSHA-256以上の強度を持つアルゴリズムを推奨
用途に応じて適切なハッシュアルゴリズムを選択し、安全なデータ管理に役立ててください。
-
PythonでSHAハッシュを生成する方法|hashlibモジュールの使い方を徹底解説
セキュリティは、あらゆるIT企業にとって最重要課題の一つです。大切なデータを保護し、検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonのhashlibモジュールを使ったSHAハッシュ化の基本について、サンプルコード付きでわかりやすく解説します。ハッシュとは何かハッシュとは、可変長のバイト列を入力として受け取り、固定長のバイト列へ変換する関数のことです。ただし、一度ハッシュ化したデータから元のデータ(入力バイト列)を復元することは極めて困難です。たとえば、入力をx、ハッシュ関数をfとすると、f(x)の計算は高速かつ簡単に行えますが、その結果からxを逆算することは非
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c