今どきの安全なパスワードについて

2008年にサーヴィスごとに異なるパスワードの生成法と言う記事を書いていたのですが、この内容が (当時から、あるいは現在の基準だと) 間違っている為、内容を更新します

結論: サーヴィスごとに十分な長さのパスワード (パスフレーズ)を使う、漏洩の疑いがある時は迅速に変更し、定期的な変更は不要

パスワード (単語レベル) ではなく、パスフレーズ (単語の集まり) を使い、長い文字列を使うべきです

例えば英数字と記号をランダムに組み合わせた '2v9s!nQ%' よりも 'petbottlecrystalfacility' (PET bottle, Crystal, Facility) の方が安全です

また、サーヴィスごとに異なるパスワード (パスフレーズ) を使うべきです

パスワード (パスフレーズ) が漏れた疑いがある時は迅速に変更する必要がありますが、定期的な変更をするよりも長いパスワード (パスフレーズ) を使った方が安全です

(以降、この記事ではパスワードとパスフレーズを統一してパスワード書きますが、推奨するのはパスフレーズです)

サーヴィスごとに異なるパスワードを使う

サーヴィスごとに異なるパスワードを使うべきなのは今も変わりません

十分複雑なパスワードを使っていても全てのサーヴィスで同じパスワードを使っていれば何かの拍子に漏れた時にあらゆるサーヴィスのパスワードが漏れたのと同じことになってしまいます

サーヴィスごとに別なパスワードにした場合に問題になるのは管理方法ですがサーヴィスからパスフレーズを生成するか、OSやブラウザのパスワード管理機能やパスワード管理ツールを使うのがお勧めです

管理が面倒だからと簡単なパスワードを設定したり、同じパスワードを使いまわすより、普段はOSやブラウザのパスワード管理機能やパスワード管理ツールに任せ、何かの拍子に必要になったが思い出せない時はパスワードの再設定をした方が良いでしょう

長いパスワードを使えば定期的なパスワードの変更は要らない

仮にアルファベット小文字のみ8桁のパスワードが30日で突破される恐れがあるとします

ならばそのパスワードを1桁増やして9桁にすれば26倍の複雑さになり、突破されるまでの期間は 26×30日 = 780日となり、5桁増やせば265×30日 = 3億5644万1280 日、つまり約97万5910年となります

突破されれる恐れがある短いパスワードを定期的に変更するより、突破されにくい長いパスワードを使うべきです

使用する文字の種類を増やすよりも長いパスワードにする

パスワードの組み合わせは使用する文字種のパスワード桁数乗になります

パスワードの桁数の上限が8桁程度と少なかった場合、使用する文字種を増やすとパスワードの組み合わせが増えるため良いことでした

アルファベット小文字のみ8桁の場合の組み合わせ
268 = 2088億2706万4576通り
アルファベット大文字小文字、数字、記号10種の (計72) の8桁の場合の組み合わせ
728 = 722兆2041億3630万8736通り

しかし、パスワードの桁数を増やせば使用する文字種が少なくても十分複雑なパスワードを作ることが出来ます

アルファベット小文字のみ11桁の場合の組み合わせ
2611 = 3670兆3444億8698万7776通り

アルファベット小文字のみ文字26種類のパスワードでも11桁あれば文字72種8桁のパスワードの約5倍複雑なパスワードを作ることが出来ます

ですので8文字のパスワード、例えば 'babymaze' を8文字のまま 'a' を '@' に 'e' を '3' にして 'b@bym@z3' と言うもパスワードを作るよりも、覚えやすい単語、例えば "fish" を足して "babymazefish" にした方が、より複雑で人間にも覚えやすいものになります

なお、前述の 'a' を '@' に変えるような変換や、キィボードを隣にずらすようなノウハウは攻撃者側も十分の承知しているため、安全性を高めることになりません

ありがちなパスワードは駄目

一般的にパスワードは入力を受ける側はハッシュ値で保存しています

ハッシュ値とはある値を別の値に不可逆的に変換した値で、例えば 'cat' が 'WNS'、'dog' が 'HYB' になったりします (あくまで例です)

暗号化と違ってハッシュ値は変換後の値から変換前の値に復号するのが非常に困難ですが (基本的に総当たりで計算することになる)、予め 'cat' が 'WNS'、'dog' が 'HYB' になることが分かっていれば逆引き辞書を作り、'WNS' なら 'cat'、'dog' なら 'HYB' と知ることが出来ます

このような攻撃者の逆引き辞書でパスワードが突破されないために「辞書に載っている文字をパスワードにしてはいけない」と言われています

この場合の「辞書」とは攻撃者が用意する逆引き用の辞書の事なので、一般の辞書には乗っていなくても 'aaaaaaaa' や 'p@ssw0rd '、'abcd1234 '、'qwertyui' あるいは日付になる様な8桁の数字などありがちなパスワードは使ってはいけません

そして前述のように 'Password' のようなありがちな単語を 'a' を '@' に変えて 'P@ssword' にしてもパスワードとしてやはりありがちな単語のままであり、安全性を高めることになりません

部分的に辞書に載っている単語でも問題ない (全体はだめ)

前述のように一般的にパスワードは入力を受ける側はハッシュ値で保存しています

しかし、先の例のように 'cat' が 'WNS'、'dog' が 'HYB' になる場合でも 'cat' と 'dog' を連結した 'catdog' は 'WNS' と 'HYB' を連結した 'WNSHYB' にはならず、全く別な値になります

このため、パスワードの一部分が辞書に載っている単語でも全体として辞書には載っておらず十分複雑なパスワードなら問題ありません

(パスワードの一部が予め攻撃者に知られてしまっているのは話が別です、念のため)