前回の記事では、hashlib
を使って文字列やファイルのハッシュを計算する方法を学びました。
今回はもう一歩進んで、**パスワードなどから暗号鍵を安全に作り出す方法(鍵導出)**についてまとめておきます。
鍵導出(Key Derivation)とは?
パスワードなどの人間が覚えられる文字列から、暗号に使える形式の鍵を作り出す処理のことを「鍵導出(Key Derivation)」と言います。
- そのままパスワードを使うのは危険(推測されやすい、桁数が短いなど)
- 強度の高い鍵を作ることで安全性を高める
- 「反復処理(繰り返し計算)」によって総当たり攻撃に耐えられるようにする
このような理由から、KDF(Key Derivation Function) を使って処理します。
Pythonでの鍵導出:hashlib.pbkdf2_hmac()
Pythonでは hashlib.pbkdf2_hmac()
という関数が用意されていて、PBKDF2というアルゴリズムを使った鍵導出ができます。
書式
hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)
引数 | 説明 |
---|---|
hash_name |
使用するハッシュアルゴリズム名(例:"sha256" ) |
password |
パスワード(bytes型 ) |
salt |
ソルト(bytes型 ) |
iterations |
繰り返し回数(多いほど安全) |
dklen |
出力の長さ(省略可) |
実装例:PBKDF2で鍵導出を行う
import hashlib
import os
# パスワード(文字列→バイトに変換)
password = "mypassword123".encode("utf-8")
# ソルト(ランダムなバイト列を生成)
salt = os.urandom(16)
# 鍵導出(SHA-256、10万回反復)
key = hashlib.pbkdf2_hmac("sha256", password, salt, 100000)
# 16進数表示に変換
print("導出された鍵:", key.hex())
print("ソルト:", salt.hex())
実行例:
導出された鍵: 3e8079ccbb93e9a6e01c725d5603ef8a5d...
ソルト: 2f5b09dd0f6a845a7d3723c47d8e3c4f
ソルトとは?
ソルト(salt)とは、同じパスワードでも異なる鍵を生成させるためのランダムな値です。
これにより、同じパスワードが使われていてもハッシュ結果が異なり、辞書攻撃やレインボーテーブル攻撃に強くなります。
- 毎回異なるランダム値を生成するのが基本
- パスワードと一緒に保存しておく(暗号化に必要)
繰り返し回数(iterations)とは?
PBKDF2では、同じ処理を何回も繰り返すことで時間をかけて鍵を導出します。
- 例えば
100000
回繰り返せば、攻撃者が1回試すにも時間がかかる - 実際のシステムでは、20万〜50万回以上を推奨することもあります(処理速度と相談)
注意点まとめ
ポイント | 内容 |
---|---|
pbkdf2_hmac() を使う |
セキュリティの高い鍵導出の標準的手法 |
ソルトを必ず使う | 同じパスワードから異なる鍵を導出できる |
繰り返し回数を多くする | 総当たり攻撃への防御力が上がる |
鍵やソルトは保存時に注意 | 鍵は安全な場所に、ソルトはペアで保存 |
おわりに
今回は、パスワードからセキュアな鍵を作るための鍵導出関数(PBKDF2)について学んだ内容をまとめました。
普段何気なく入力している「パスワード」も、そのままでは弱く、きちんと安全な形に変換して使う必要があることがよく分かりました。
セキュリティは地味だけど大事な分野なので、これからも繰り返し復習していきたいです。