Pythonの標準ライブラリ hashlib モジュールを使用すると、文字列やファイルから**ハッシュ値(メッセージダイジェスト)**を簡単に生成できます。
ハッシュ値は、パスワードの保存やファイルの改ざん検知など、セキュリティやデータ整合性の確認に広く利用されます。
目次
1. 主なハッシュ生成関数
hashlib モジュールには、各アルゴリズムに対応したコンストラクタ関数が用意されています。これらは引数としてバイト列を受け取り、ハッシュオブジェクトを返します。
| 関数名 | アルゴリズム | 戻り値 | 備考 |
hashlib.sha256(data) | SHA-256 | ハッシュオブジェクト | 現在の標準的なアルゴリズム(推奨) |
hashlib.sha1(data) | SHA-1 | ハッシュオブジェクト | 脆弱性があるため、互換性維持以外では非推奨 |
hashlib.md5(data) | MD5 | ハッシュオブジェクト | 高速だが衝突耐性が低いため、セキュリティ用途では非推奨 |
※ data は bytes型(バイト列) である必要があります。
2. ハッシュオブジェクトのメソッド
生成されたオブジェクトから実際のハッシュ値を取り出すために、以下のメソッドを使用します。通常は扱いやすい hexdigest() がよく使われます。
| メソッド名 | 戻り値の型 | 説明 |
hexdigest() | str (文字列) | ハッシュ値を16進数の文字列で返します(例: 5e884...)。 |
digest() | bytes (バイト列) | ハッシュ値を生のバイナリデータで返します。 |
実装例:パスワードのハッシュ化
ここでは、ユーザーが入力したパスワードをSHA-256アルゴリズムでハッシュ化し、データベース保存用の16進数文字列を取得する処理を実装します。
ソースコード
import hashlib
# 1. ハッシュ化したい文字列(例: ユーザーのパスワード)
raw_password = "my_secret_p@ssw0rd"
# 2. ハッシュオブジェクトの生成
# 文字列(str)は必ず .encode() でバイト列(bytes)に変換してから渡します
# ここでは SHA-256 アルゴリズムを使用
hash_obj = hashlib.sha256(raw_password.encode('utf-8'))
# 3. ハッシュ値の取得
# hexdigest() で16進数文字列として取り出します
password_hash = hash_obj.hexdigest()
print(f"元の文字列 : {raw_password}")
print("-" * 50)
print(f"アルゴリズム: {hash_obj.name}")
print(f"ハッシュ値 : {password_hash}")
print(f"文字数 : {len(password_hash)} 文字") # SHA-256は64文字(256bit)
実行結果
元の文字列 : my_secret_p@ssw0rd
--------------------------------------------------
アルゴリズム: sha256
ハッシュ値 : 34b1593979848773950f5803964952554625f5431668c6870c26569260c5a396
文字数 : 64 文字
解説
ハッシュ化の手順
- エンコード: ハッシュ関数は「バイト列」しか受け付けません。文字列の場合は必ず
.encode("utf-8")などでバイト列に変換する必要があります。 - アルゴリズム選択: セキュリティが重要な用途(パスワード保存など)では、SHA-256 以上の強度のアルゴリズムが推奨されます。MD5やSHA-1は衝突(同じハッシュ値になる別データが見つかること)のリスクがあるため、現在は主にチェックサム(破損検知)などの用途に限られます。
ハッシュの特性
ハッシュ化は「不可逆変換」です。生成された 34b15... という文字列から、元の my_secret_p@ssw0rd を逆算することは(極めて困難で)できません。
