ハッシュは、データの整合性チェックやパスワードの保存、署名の作成など、セキュリティの分野でとても重要な技術です。この記事では、Pythonの hashlib
モジュールを使ってハッシュ関数を扱う基本的な方法を、自分なりに整理しておきます。
ハッシュとは?
ハッシュとは、任意の長さのデータから、一定の長さの「要約(ダイジェスト)」を計算する仕組みです。
データが一文字でも変わると、ハッシュ値も大きく変化します。
ハッシュの主な特徴は以下の通りです:
- 元のデータには戻せない(不可逆)
- 同じデータからは常に同じハッシュ値が得られる
- 違うデータから同じハッシュ値が得られる可能性は極めて低い(衝突しにくい)
hashlibモジュールの基本
Pythonの標準モジュール hashlib
では、SHA-256やMD5などのハッシュ関数が使えます。
よく使われる関数:
-
hashlib.sha256()
:強度の高いSHA-256(おすすめ) -
hashlib.md5()
:昔からあるが、セキュリティには向かない(衝突が多い)
SHA-256の基本的な使い方
import hashlib
data = "hello world".encode("utf-8") # 文字列をバイト型に変換
hash_obj = hashlib.sha256(data) # ハッシュオブジェクトを作成
hash_hex = hash_obj.hexdigest() # 16進数文字列で取得
print(hash_hex)
実行例:
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
-
encode()
は、ハッシュ関数がバイト列を受け取るために必要です。 -
hexdigest()
で、人が読める形式の文字列に変換できます。
他のハッシュ関数との比較
アルゴリズム | 出力長さ | セキュリティ | 特徴 |
---|---|---|---|
MD5 | 128ビット | 弱い | 非推奨。古いシステム向け。速い。 |
SHA-1 | 160ビット | 弱い | 一部で使用されていたが、現在は非推奨。 |
SHA-256 | 256ビット | 強い | 現在主流。セキュリティ用途で一般的。 |
SHA-512 | 512ビット | 非常に強い | 出力が長い。高セキュリティが必要な場面で。 |
ハッシュの活用例①:ファイルの改ざん検出
ダウンロードしたファイルが正しいかどうか確認するために、ハッシュを使うことがあります。
import hashlib
with open("example.txt", "rb") as f:
file_data = f.read()
hash_value = hashlib.sha256(file_data).hexdigest()
print("ファイルのSHA-256ハッシュ:", hash_value)
ファイルの内容が1文字でも違えば、ハッシュ値もまったく異なるものになります。
ハッシュの活用例②:パスワードの保存(簡易版)
パスワードをそのまま保存するのは危険なので、ハッシュ化して保存する例です。
import hashlib
password = "mypassword123"
password_bytes = password.encode("utf-8")
hashed_pw = hashlib.sha256(password_bytes).hexdigest()
print("保存用パスワードハッシュ:", hashed_pw)
ただし、実際には「ソルト」というランダムな値を加えて保存するのが基本です(次の記事で紹介予定)。
おわりに
この記事では、hashlib
を使ってハッシュ値を計算する方法をまとめました。
ハッシュは単に変換するだけでなく、データの改ざん検出や認証の安全性の確保などにも使われます。
今後さらに、ソルトや鍵導出関数(KDF)と組み合わせることで、より実用的な使い方を学んでいきたいと思います