Wi-FiアクセスポイントにWPA2/WPA3-PersonalのSSIDを設定する必要が生じたので、Wi-Fiの暗号化キー(パスワード、事前共有キー、セキュリティキー)は何文字あれば安全かを試算してみることにしました。
毛流麦花は、Wi-FiのアクセスポイントではWPA2/WPA3-Enterprise(EAP-TLS)のみを使っており、WPA2/WPA3-Personalは使っていません。これは、WPA2/WPA3-Personalだと、どんなに複雑な暗号化キー(パスワード)を設定したとしても、SSIDの暗号化キーに対してブルートフォース攻撃(総当たり攻撃)で暗号化キーを解読され得るから、という理由です。ブルートフォース攻撃に対して対策が取られていないWPA2-Personal(WPA2-PSK)に対して、WPA3-Personal(WPA3-SAE)は対策が取られるようになったというものの、根本的に安全とは言えません。
ところが、WPA2/WPA3-PersonalのSSIDを設定する必要が生じてきました。Chromebookです。
ChromebookでWPA2-Enterprise(EAP-TLS)を使うべくルート証明書とクライアント証明書をインストールしようとしたところ、以下のような問題が生じました。
(1)ルート証明書はインストールできるものの、クライアント証明書をインストールできない。詳細な文書を見つけられなかったので推測になるが、TPM他の関係で、デバイス毎に発行したキーを使って証明書を発行する必要があるらしい。
(2)ルート証明書だけはインストールできるので、EAP-PEAPなら設定可能であるが、インストールしたルート証明書をエクスポートできてしまうので、EAP-PEAPでの設定は避けたい。
こうした経緯から、Wi-FiアクセスポイントにWPA2/WPA3-PersonalのSSIDを設定することになりました。
とは言っても、安全性を評価しないままで使うわけにもいかないので、SSIDの暗号化キー(パスワード)のブルートフォース攻撃(総当たり攻撃)に対する耐性・安全性を試算して評価することにしました。最新・最高速のコンピューターを使ってブルートフォース攻撃されたと想定して天文学的な時間がかかるようであれば、事実上安全と考えます。
試算にあたっての前提条件は以下の通りとします。
(1)GPUを使ったブルートフォース攻撃を想定して、ブルートフォース攻撃に要する時間を計算する。
(2)SSIDの暗号化キーには、英大文字・英小文字・数字のみを使うものとする。
(3)SSIDの暗号化キーには、十分にランダムな文字列を使うものとする。
(4)ブルートフォース攻撃の速度(PMK/sec、1秒間あたりのパスワード試行数)については、GPUのFP16のベンチマーク値を使う。
(5)Wi-Fi接続に関するプロトコル・ソフトウェア・ファームウェア等に脆弱性はないものとする。
(1)ですが、処理速度進化の著しいコンピューターであるGPUを使うものと想定します。AI、ディープラーニング、自動運転他といった分野での活用が見込まれることから、GPUは今後も目覚ましい進化を遂げていくものと思われます。
(2)ですが、英大文字・英小文字・数字(合計62種類の文字)のみを使うものとし、記号は使わないものとします。
(3)ですが、例えば辞書に載っているような単語や単純な文字列(password、qwertyなど)だと、ブルートフォース攻撃するまでもなく辞書攻撃で短時間に解読されてしまいますので、十分にランダムな文字列を使うものとします。
(4)について、ブルートフォース攻撃の速度としてFP16(半精度浮動小数点演算)のベンチマーク値を使いますが、コンピューターの処理速度、1秒間にどれだけの演算を行う能力があるかの指標としてFP16のベンチマーク値を使うだけであり、浮動小数点演算のベンチマーク値を使うこと自体には特に意味はありません。INT4やINT8といったベンチマーク値でもいいのですが、FP16/FP32のベンチマーク値が最も入手しやすかったので、FP16のベンチマーク値を使っています。あくまでも試算であり、実際にFP16のベンチマーク速度でブルートフォース攻撃するのは困難と考えられます。(アクセスポイント側のCPUはGPUに比べたら桁違いに遅いはずであり、GPUのフルスピードでブルートフォース攻撃しようとしても、アクセスポイント側はその速度に追随できないはずなので。)
現実にはあり得ない速度でブルートフォース攻撃されると仮定して計算することで、計算結果は安全側の値、すなわち現実的に可能なブルートフォース攻撃速度で計算した場合よりも小さい値(より短い時間)となります。その値(ブルートフォース攻撃に要する時間)が天文学的な時間であれば、現実的に可能なブルートフォース攻撃速度の場合の所要時間はより長い時間となり、結果として現実的に可能なブルートフォース攻撃速度に要する時間も同様に天文学的な時間となります。
GPUのFP16のベンチマーク値をいくつか列挙します。FP16と直接の比較はできないものの、比較用としてスパコン「富岳」のベンチマーク値も調べたので併せて列挙します。
NVIDIA T4: 65TFLOPS(テラフロップ、FP16)
NVIDIA A100: 312TFLOPS(テラフロップ、FP16、Tensorコア)
NVIDIA A2: 18TFLOPS(テラフロップ、FP16)
スパコン「富岳」: 2.004EFLOPS(エクサフロップ、HPL-AI)
NVIDIA A100で312*(10^12)FLOPS、スパコン「富岳」で2.004*(10^18)FLOPSとなります。GPUで10の12乗オーダー、スパコン「富岳」で10の18乗オーダーのベンチマーク(処理速度)となります。
(5)ですが、なんらかの脆弱性があれば、その脆弱性を突いた攻撃をされることが想定されますので、脆弱性はないものとします。
早速、SSIDの暗号化キーに対するブルートフォース攻撃、すなわち暗号化キーの組み合わせをすべて試行する(総当たり攻撃する)のに要する時間を計算してみましょう。暗号化キーの長さ(桁数)が5文字・10文字・15文字・20文字の4通りについて計算します。
(1)暗号化キーが5文字の場合
暗号化キーの組み合わせ:
(26+26+10)^5≒9.16*(10^8)通り
NVIDIA A100を使った場合でブルートフォース攻撃するのに必要な時間(秒):
(9.16*(10^8))/(312*(10^12))≒2.9*(10^(-6))≒1秒未満
スパコン「富岳」を使った場合でブルートフォース攻撃するのに必要な時間(秒):
(9.16*(10^8))/(2.004*(10^18))≒4.6*(10^(-10))≒1秒未満
(2)暗号化キーが10文字の場合
暗号化キーの組み合わせ:
(26+26+10)^10≒8.39*(10^17)通り
NVIDIA A100を使った場合でブルートフォース攻撃するのに必要な時間(秒):
(8.39*(10^17))/(312*(10^12))≒2700≒約45分
スパコン「富岳」を使った場合でブルートフォース攻撃するのに必要な時間(秒):
(8.39*(10^17))/(2.004*(10^18))≒0.4≒1秒未満
(3)暗号化キーが15文字の場合
暗号化キーの組み合わせ:
(26+26+10)^15≒7.68*(10^26)通り
NVIDIA A100を使った場合でブルートフォース攻撃するのに必要な時間(年):
(7.68*(10^26))/(312*(10^12)*3600*24*365)≒約78000年
スパコン「富岳」を使った場合でブルートフォース攻撃するのに必要な時間(年):
(7.68*(10^26))/(2.004*(10^18)*3600*24*365)≒約12年
(4)暗号化キーが20文字の場合
暗号化キーの組み合わせ:
(26+26+10)^20≒7.04*(10^35)通り
NVIDIA A100を使った場合でブルートフォース攻撃するのに必要な時間(年):
(7.04*(10^35))/(312*(10^12)*3600*24*365)≒約7.15*(10^13)年
スパコン「富岳」を使った場合でブルートフォース攻撃するのに必要な時間(年):
(7.04*(10^35))/(2.004*(10^18)*3600*24*365)≒約1.11*(10^10)年
(1)ですが、暗号化キーの長さが5文字というのは明らかに短すぎであることがわかります。
(2)ですが、暗号化キーの長さが10文字だと、短時間で総当たりされてしまうので、10文字も暗号化キーの長さとして十分とは言えません。
(3)ですが、NVIDIA A100で約78000年、スパコン「富岳」で約12年という試算結果なので、それなりに時間がかかると言えばかかる試算結果であるものの、並列処理・クラスタリングすれば、10の2乗オーダーから3乗オーダーでの並列処理で処理速度を上げられそうであり、もう少し長めの暗号化キーにしたいところです。
(4)ですが、NVIDIA A100で10の13乗オーダー年、スパコン「富岳」で10の10乗オーダー年という試算結果です。宇宙の年齢が約138億年、10の10乗オーダー年ですので、宇宙の年齢と比べても、また前述の並列処理・クラスタリングした場合のことを考えても十分な長さの暗号化キーであると言えそうです。
まとめると、本稿を執筆している2022年時点のGPU・スパコンの処理速度でSSIDの暗号化キーに対してブルートフォース攻撃されたと仮定して試算すると、暗号化キーには英大文字・英小文字・数字から構成される十分にランダムな文字列を設定するとして、暗号化キーは少なくとも20文字程度あれば事実上安全そうだ、という結論になります。
暗号化キーに英大文字・英小文字・数字だけでなく記号も使ったり、20文字よりも長い暗号化キーを使ったり、定期的に暗号化キーを変更して、より安全性を高めるのも有効ですし、根本的なセキュリティ対策になるわけではないものの、SSIDを非公開にしたり、MACアドレスでフィルタリングすることも、第三者がうっかり誤って接続しようとするといったことを防止する観点からは有効だと思います。
ただ「究極の安全性」を求めて、SSIDの暗号化キーの長さを60文字超にするのはやり過ぎというか、そこまでするのならWPA2/WPA3-Enterpriseを導入した方が運用がラクです。(と言いながら、毛流麦花はWPA2/WPA3-Enterpriseを導入する前、WPA2-Personalで60文字超の暗号化キーを設定していました。iPhone/iPadみたいなWi-Fi設定をプロファイルで配布できる端末は問題なかったものの、Kindle PaperwhiteやAndroid等、1台毎にWi-Fi設定の必要な端末は設定が非常に面倒だった。)