パスワード
2024年1月の共通テスト「情報関係基礎」の最初の問題(第1問、問1a)です:
個人のアカウントで情報端末にログインするためのパスワードは,ア にするのがよい。
正解は①のようですが、本当にパスワードは英字,数字,記号を組み合わせるべきでしょうか? 確かにパスワードが8文字しか設定できないといったときには、少しでも複雑にするために数字・記号を混ぜるほうがいいでしょうけれども、文字数の制限がなければ、文字数を増やすほうが簡単です。
具体的に計算してみましょう。英字(大文字・小文字)、数字、10通りの記号を使った8文字のパスワードは (26 + 26 + 10 + 10)8 = 722204136308736 通りです。一方、英字だけの9文字のパスワードは (26 + 26)9 = 2779905883635712 通りです。後者のほうが大きいのです。つまり、この場合、数字・記号を混ぜるより1文字長くするほうが強いパスワードになります。
このようなわけで、今は、パスワードの長さを8文字とかに制限せず、数字・記号を混ぜる必要がない、というのが正しいところです。この問題は、今のベストプラクティスを反映していないといえるでしょう。
NIST Special Publication 800-63B: Digital Identity Guidelines にも次のように書かれています[800-63 は改訂中ですが、新版の案にも同様の内容が含まれます]:
Verifiers SHOULD NOT impose other composition rules (e.g., requiring mixtures of different character types or prohibiting consecutively repeated characters) for memorized secrets. Verifiers SHOULD NOT require memorized secrets to be changed arbitrarily (e.g., periodically). However, verifiers SHALL force a change if there is evidence of compromise of the authenticator.
Verifiers SHOULD permit claimants to use “paste” functionality when entering a memorized secret. This facilitates the use of password managers, which are widely used and in many cases increase the likelihood that users will choose stronger memorized secrets.
異なる文字種を混ぜることを要求しない、定期的変更を要求しない、パスワードの「ペースト」を禁止しない(つまりパスワードマネージャの邪魔をしない)、というわけです。
ちなみに、「特別な理由がない限り,与えられた初期パスワードのまま」は本来は好ましくないのですが、経験上、乱数で生成した複雑な初期パスワードを配って、自由にパスワードを変更させると、簡単に破られるようなパスワードに変更してしまう人がけっこういます。このような人にとっては、初期パスワードのほうが安全です。初期パスワードは生成した管理者が知ることができるのでまずいと思われるかもしれませんが、管理者はユーザのパスワードがわからなくてもすべての情報にアクセスできてしまうので、どっちみち同じことだ、とも考えられます。だからといって③を正解にするのもまずいですが。
[追記] 令和6年度 大学入学共通テスト問題評価・分析委員会報告書の本試験の情報関係基礎の関係団体評価(PDF)の情報処理学会の評価に
なお,aは①が正解となっているが,③の初期パスワードが辞書攻撃に強く十分に長い場合,文字数の説明がない①の方が妥当だとは言い切れない点で説明不足を感じる。むしろ昨今では初期パスワードはそのような妥当性を十分に備えており,パスワード強度に十分な理解のないユーザがかえって弱いものに変更するリスクが指摘されることがある。
と書かれていました。
パスワードはユーザIDと組み合わせて使うものです。ユーザIDは秘匿する必要がないものですが、パスワードは秘匿すべきものです。
パスワードは、長くてランダムなものにしましょう。サイトごとに別のパスワードを使いましょう。パスワードを人に教えないようにしましょう。
ランダムなパスワードは、OSやブラウザのパスワードマネージャに生成してもらうのが簡単です。あるいは、パスワード生成のページや、Pythonのプログラムでも作成できます。
パスワードを定期的(たとえば数ヶ月ごと)に変更することを強制するシステムがありますが、面倒なのでかえって安易なパスワードにしてしまうユーザもいるということで、今は推奨されていません(上記NISTの推奨参照)。一方、盗み見などでパスワードが漏れたら、すぐに悪用されてしまうでしょうから、数ヶ月ごとの変更ではほとんど役に立ちません。パスワードを打ち込んでいるところを見られたように感じたら、すぐに変更しましょう。ちなみに、パスワードマネージャによる自動入力を使えば、パスワード入力を盗み見られる心配がありません。
推測不可能なパスワードを、利用するサイトの数だけ作れば、覚えることは不可能です。「複雑な文字列(固定)+サイトの省略名(YHOとかGGLとか)」を薦める人もいるようですが、それでは推測できてしまいます。
サイトのURLとパスワードとの対応表を、安全な方法で記録しておくには、パスワードマネージャを使うのが簡単です。
メールなどのリンクをクリックして現れたサイトが本物サイトとそっくりだったとしても、そこにパスワードを打ち込んではいけません。たいていは詐欺(フィッシング)です。
まずhttpsでないサイトにパスワードを打ち込んではいけません。httpsであることとURLとを確認してパスワードを打ち込めばいいのですが、一般の人が正しいURLを覚えられるかは疑問です。例えば「三菱UFJ」が mufg.jp か mufj.jp かを覚えている人はどれくらいいるでしょうか?
パスワードマネージャを使えば、複雑なパスワードがサイトごとに自動生成でき、httpsの正しいURLのサイトだけで自動入力されます。URLを目視で確認して、記憶したパスワードを手で打ち込むより、ずっと安全です。私はmacOS/iOSに組み込まれているパスワードマネージャ(Keychain)を使っています。
なお、ここで述べたことは、個人が自分のパソコン・スマホを使う場合の話です。企業等のパソコンを仕事で使う際には、そのセキュリティポリシーに従いましょう。
他人のパスワードを使うと、不正アクセス禁止法の違反になります(この法律ではID・パスワードを「識別符号」と呼んでいます)。
m 通りの文字を使った n 桁のパスワードは mn 通りあります。例えば英字(大小文字)・数字・記号2通りを使うなら、m = 26×2 + 10 + 2 = 64 です。8桁にすれば、例えば Utz-VQ4i
のようなパスワードになります。これは 648 = 281474976710656 通り(約281兆通り)あります。これだけあれば、オンラインのサービスのパスワードなら、しらみつぶしの方法で破られることは、まずなさそうです。
一方、例えば暗号化したファイルが流出した場合、何度でも試行できますので、超高速のコンピュータを使っても何年もかかるくらいの複雑なパスワードにしておく必要があります。私のコンピュータでは、十分安全な暗号化方式なら毎秒10〜35パスワードしか試せませんでした(パスワードをクラックする参照)が、敵はどんな強力なコンピュータを持っているかわからないので、十分長いパスワードを使いましょう。
2022年に尼崎市の委託業者が全市民の個人情報が入ったUSBメモリを紛失した事件がありましたが、その記者会見で市職員がUSBメモリのパスワードは13桁英数字と漏らしてしまいました。ネットでは Amagasaki2022
だろうとの予想が流れました。その後、USBメモリは無事発見されました。
13桁と漏らしてしまったことにより、どれくらいパスワードの試行回数が減ったでしょうか。ということで、問題です。
練習問題:m 通りの文字を使ったパスワードを、1桁、2桁、3桁、・・・と試していき、n 桁まで試し終わるための試行回数と、最初から n 桁だとわかっていて n 桁だけ試す場合の試行回数とでは、どれくらい違うでしょうか。
ヒント:1桁、2桁、3桁、・・・と試す場合、m + m2 + m3 + m4 + … + mn のような等比数列の和になります。
ではパスワードは何文字あれば安全でしょうか。
これは、想定するのがオンライン攻撃かオフライン攻撃かによります。
暗号化したファイルが盗まれた場合は、オフライン攻撃といって、ネット越しではなく攻撃者のパソコンの中で何度でも高速に試行できます。この場合はできるだけ長いパスワードが必要です。少なくとも十数桁にしましょう。
一方、ネット越しのオンライン攻撃であれば、高速な試行が無理な上に、数回失敗しただけで何らかの対処をされる可能性があるので、ランダムなパスワードであれば、長さはそれほど必要ありません(もっとも、パスワードマネージャが前提なら、わざわざ短くする意味はありませんが)。なお、この場合、攻撃者はパスワードを固定してユーザIDをいろいろ変えて攻撃するのが一般的です。1000人に一人でも安易なパスワードを使っていれば攻撃は成功します。
サーバに侵入され、パスワードのデータが盗まれた場合、パスワードは漏れるのでしょうか? 「十分複雑なパスワードなら、漏れない」が正解です。今どきのシステムはパスワードにランダムな文字列(ソルト)を追加した上でハッシュして、ソルトとともに保存しています。パスワードを復元するには、あらゆるパスワードを試してみるしかありません。それでも、オンライン攻撃と違って、何度でも試すことができますので、簡単なパスワードなら復元できてしまいます。
冒頭の問題のように、ネットサービスではなく情報端末にログインする際には、英数字のパスワードではなく、数字だけの暗証番号(PIN、ピン、Personal Identification Number)を使うことがあります。
例えばWindowsパソコンにログインする際に、Microsoftアカウントのパスワードを打ち込むのと、数桁のPINを打ち込むのとで、どちらが安全でしょうか。パスワードのほうが長いから安全だと思われるかもしれませんが、必ずしもそうではありません。もしどこかから覗かれていてパスワードが漏れた場合、別のパソコンから自分のアカウントにログインされる可能性があります。PINは仮に漏れても、パソコンが盗まれない限り、安全です。
・・・と書いてきましたが、パスワードはそろそろ時代遅れです。もうすぐパスキーの時代が来るでしょう。そのための準備として、パスワードマネージャに慣れておくのはよいことだと思います。
参考リンク: