
パスワード強度をPythonで測る|"エントロピー"で見る本当の強さ
2026-09-19 ・ 実践
「このパスワード、強い?」を感覚でなく数値で答えるのが エントロピー(bit) です。総当たりに何回かかるかの指標。この記事ではPythonでパスワード強度を計算し、「長さが最強の武器」であることを数字で確かめます。パスワードの基礎の実装編です。
エントロピーとは
パスワードの強さは、次の式で概算できます。
エントロピー(bit) = 長さ × log2(使える文字種の数)
bit が大きいほど、総当たりの手数が指数的に増えます。72bit以上あればおおむね安心とされます。
準備
標準ライブラリのmathだけ。
① 文字種と長さから強度を計算
import math
def entropy_bits(password):
pool = 0
if any(c.islower() for c in password): pool += 26
if any(c.isupper() for c in password): pool += 26
if any(c.isdigit() for c in password): pool += 10
if any(not c.isalnum() for c in password): pool += 32 # 記号
if pool == 0:
return 0.0
return len(password) * math.log2(pool)
for pw in ["password", "P@ssw0rd", "correct-horse-battery-staple", "aB3$"]:
print(f"{pw:<32} {entropy_bits(pw):5.1f} bit")
出力:
password 37.6 bit
P@ssw0rd 52.4 bit
correct-horse-battery-staple 164.0 bit
aB3$ 26.2 bit
記号を混ぜた短い P@ssw0rd(52bit)より、長い合言葉 correct-horse-battery-staple(164bit)の方が桁違いに強い。長さの効果がはっきり出ました。
② 総当たり時間に換算
エントロピーを「1秒に10億回試せる攻撃者」の所要時間に直します。
def crack_time(bits, guesses_per_sec=1e9):
seconds = 2 ** bits / guesses_per_sec / 2 # 平均は半分
years = seconds / (60 * 60 * 24 * 365)
return years
for pw in ["P@ssw0rd", "correct-horse-battery-staple"]:
print(f"{pw:<32} 約 {crack_time(entropy_bits(pw)):.2e} 年")
P@ssw0rd は現実的な時間で破られうる一方、長い合言葉は天文学的な年数に。**「複雑さより長さ」**が数字で証明されます。
エントロピーは『上限』に過ぎない
この計算は「完全ランダム」を仮定した理論値です。実際の P@ssw0rd のような"よくある変換"は、攻撃者の辞書に載っていて計算より遥かに速く破られます。だから「長く」かつ「使い回さず」「推測されにくい」ことが大事。強度判定は目安として使い、パスワードマネージャでの自動生成が最善です。
まとめ
- エントロピー = 長さ × log2(文字種)。総当たり耐性の指標
- 記号入りの短いパスワードより、長い合言葉の方が桁違いに強い
- 「複雑さより長さ」が数字で裏付けられる
- ただし理論値。よくある変換は辞書攻撃で速く破られる
もう少し詳しく(背景と理論)
パスワードの強さはエントロピー(bit)で測ります。取りうる文字種の数を N、長さを L とすると、組み合わせは Nᴸ、エントロピーは log₂(Nᴸ) = L·log₂(N) ビットです1。ここで効くのは文字種より長さ——1文字増やすと組み合わせが N 倍になるため、長いパスフレーズが有利です。NIST SP 800-63B は方針を刷新し、定期変更の強制や複雑な文字種ルールを推奨しない一方、長さの確保と漏洩パスワードのブロックを重視しています2。ただし理論上のエントロピーは「ランダムに選んだ場合」の上限で、人間が選ぶパスワードは辞書・パターンに偏るため、zxcvbn のような実際の推測しやすさを評価するツールが実務では有効です3。
次の一歩 🌸
土台のパスワードの基礎、安全な保存のパスワードハッシュ、次の防御層のMFAへどうぞ。