真のパスワード強度を測定する5つのアルゴリズム

password_strength_image

 

Webサービスでアカウントを登録する際、パスワードを入力する度にその安全度を表してくれる強度メーター。皆様もおそらく目にしたことがあるのではないでしょうか。GoogleやFacebook、Twitterのような大規模なサービスでも、サインアップ画面等に設置されています。

このUIの要素は、MSR(Microsoft Research)の論文によると類推されづらいパスワードを促してサービスの安全性を高めることに効果的だということが証明されています。

お客様自身の大事な情報を守る上でとても重要なパスワード。ヌーラボアカウントでも、類推されにくいより強度の高い設定を促すためにパスワード強度メーターを設置しました。

この記事では、パスワード強度メーターを設置するに当って得た知見をもとに、その裏側の仕組みをご紹介させていただきます。

パスワード強度ってなに ?

そもそもパスワード強度とはなんなのか。要約すると、対象のパスワードの長さや複雑さ等を考慮して、類推されにくい安全性の高さを数値化したものです。ヌーラボアカウントでは、1から5の数値で評価しています。

英数記号8桁は安全なの ?

それでは、長さや複雑さ等を考慮して測定するとなると一般的に推奨される、

8文字以上、数字、記号、大文字、小文字を併用する。

といった規則を満たすだけで本当に安全なのでしょうか?

確かに、アルファベットがAからZ、数字が0から9、記号の96通り文字が8桁あれば、96の8乗で7200兆を超える気の遠くなるようなパターンが生成されます。コンピューターが単純に総当り攻撃をしかけても、簡単に到達する数値ではありません。

一見、測定の際に考慮する要点としてはこれだけでよさそうですね。

がしかし、我々は人間です。どうしても自分が覚えやすい単純なもの、なにかしら意味付けられたものを設定しがちです。そのような類推されやすい単語を優先的に組み合わせて検証していく辞書を使った攻撃の前では、7200兆の膨大なパターンもある程度絞られて、類推される可能性も高くなります。

以下の引用を御覧ください。

一部ハッカーなどは「良く的中する効率が良い辞書」の育成の為に、「過去の流出したパスワードからの傾向性分析」などに血道をあげる者もおり、あるいはどちらの辞書が優秀か、ハッカー同士で競い合うケースもある。[Wikipedia]

恐ろしい事この上なしですね。どうやら、そのような意味付けられたパスワードも考慮して強度を測定する必要があるようです。

強度測定はブラックボックス ?

強度測定を実装する上で、他のサービスはどのような基準で測定を行っているのか調査しましたが、その基準は各サービスによって異なり、さらにほとんどがブラックボックスな状態でした。

あるサービスで強いと測定されたものが、他のサービスでは弱いと測定されることが十分にあり得るのです。

これでは、ユーザが混乱してしまいますね。

zxcvbnという選択肢

パスワード強度を測定するには、文字の種類や長さ等の一般的な規則だけではなく、様々な角度からパスワード強度を検証するアルゴリズムを持たせる必要があることは解りました。しかし具体的な検証ポイントを0から考えるとなると、それこそサービス特有のブラックボックス化したものになりやすくユーザーを混乱させてしまうのではないかといった懸念が生まれます。それを踏まえた上で、オープンな資料やライブラリを調査していたところ、前述した要件を満たす素晴らしいものと出会いました。

その名も、

zxcvbn

です。

Dropbox社が提供するパスワード強度を測定するためのライブラリです。JavaScriptで実装されています。

しかし、ヌーラボアカウントとしては測定用のAPIを設けてサーバーサイドで処理したいといった願望がありました。

さらに、ヌーラボアカウント自体Javaで構築されているという背景や、zxcvbn自体Javaアプリケーションで利用したいといった声もIssuesに上がっていたこともあり、思い切ってJavaへのポーティングとJava版ライブラリとしての公開に踏み切りました。

そして出来上がったのが、

zxcvbn4j

です。

真のパスワード強度アルゴリズム

実際にzxcvbnをJavaへポートする過程で、そのアルゴリズムを学びました。これは、ただ利用するだけでは得られない大きな知見です。大変興味深い内容であるため、以下にその5つのアルゴリズムご紹介させていただきます。

1. Dictionary ~人気のワードマッチング ~

zxcvbnは10万個に渡るパスワードとして利用されやすい単語で構成された辞書を持ち、対象のパスワードと総当りでマッチングしています。

一般的なパスワード

“password” や “admin”、”root” 等、パスワードとしてよく利用されているであろう文字列です。
補足ですが、米国のSplashData社が2014年に発表した “Worst Passwords of 2014” によると、世界で一番使われてるパスワードは、”123456″ のようです。これには驚きですね。

一般的な名前と姓

“mary”、”peter” 等の 一般的な名前や、”smith”、”yamada” といった一般的な姓です。
前述の通り姓には日本の姓も含まれています。

よく使われる英単語

“story”、”social”、”together” 等、米国のテレビや映画、Wikipediaでよく使われる英単語です。

反転

例えば、”drwossap” ならば “passowrd” といった形で、対象のパスワードを反転させて、辞書の単語とマッチしないか確認しています。

L33T(Leet, リート)

L33Tを考慮した置き換え文字です。

L33Tは、Wikipediaでは以下のように紹介されています。

leet(リート、1337、l33t)は、主に英語圏のパソコン通信や、インターネットの電子掲示板などで使われるラテン文字の表記法である。leet speak(リート・スピーク)とも呼ばれる。たとえば、「Warez」という語を leet で表記するのなら、「W@rez」や「W4r3z」などとなるように、一部のアルファベットを形の似た数字や記号などに変化させる。ほかにも、「for」や「to」をそれぞれ似た発音の「4」や「2」で代用したり、同様に「you」を「u」と置き換えたり、複数形の「s」を「z」に変えたり、「cks」「ks」で終わる単語を「x」に差し替えたり、故意にスペルミスで表記したり、大文字と小文字を混在させたりするなど、多様に存在する。[Wikipedia]

具体的には以下のように置き換えられます。

一般 L33T
password P@$$w0rd
admin @dmin
orenge 0r3n93

このブログの見出し画像にも使っている「P@$$w0rd」という単語は、「8文字以上、数字、記号、大文字、小文字を併用する」といった推奨される条件を満たしています。しかし、L33Tで置き換えると非常に危険な「password」という文字列とマッチングします。

2. Spatial ~ 隣のキーマッチング ~

“qwertyuiop” や “asdfghjkl”、”zxcvbn” ような、キーボードやキーパッドの隣接したキーに沿って構成された文字列です。

  • qwerty配列
  • dvorak配列
  • 一般的なkeypad
  • mac keypad

に対応しています。

さらに、

Javaへのポートである zxcvbn4j では日本国内でよく利用される「jis配列」にも対応させました。

zxcvbnというライブラリの名前は、この隣接したキー配列と同じで、とても粋なネーミングですね。

3. Repeat ~ 繰り返しマッチング ~

“aaaaaaaa” や “11111111” といった同じ文字の繰り返しや、”abcabcabc”のような同じ文字列の規則的な繰り返しにも対応しています。

4. Sequence ~ 順番通りマッチング ~

“abcdefghij” “fghijklmno” のようなアルファベット順や “0123456789”、”6789012345″ のような数の順序の文字列です。

前述した “Worst Passwords of 2014” にも記載されていますが、特に数の順序でパスワードを作る人はとても多いようです。

5. Date ~ 年月日マッチング ~

“20151101” や “20151224” のような、日付として認識される文字列です。

まとめ

今回採用したzxcvbnの他にも素晴らしいパスワード測定用ツールはありましたが、〇〇文字以上、数字、記号、大文字、小文字といった規則のみで測定しているものほとんどでした。その点をくらべると、zxcvbnは一つ抜きん出ているのではないでしょうか。個人的には、L33Tの置き換えや、隣接したキー配列のマッチングは大きなポイントだと思います。また、各々で特有の辞書を追加したい場合も、外部から文字列のリストを受け取れるような設計になっているので簡単にカスタマイズできます。

最近はパスワード以外の認証方法なども普及してきています。現在、ヌーラボアカウントでも2段階認証をサポートする作業を進めています。
技術の発展とともに、パスワードが活用されることも少しづつ減っていく傾向にあるとは思いますが、まだまだパスワードはセキュリティの要です。よりお客様が安心して利用できるサービスへと成長させるためにも、今後ともパスワードとうまく付き合っていきたいと考えております。

最後に、ポーティングしたzxcvbn4jはGithubに公開しております。パスワード強度測定用APIをJavaで実装したい、またはAndroidアプリ内で測定処理を行いたいといった方は、是非導入をご検討下さい。

nulab/zxcvbn4j

さらに、Dropbox社のzxcvbnについてもっと詳しく知りたい!といった方は、公式の文書であるzxcvbn: realistic password strength estimationをご一読ください。


ヌーラボではOSSに明るく関わっていきたい! というエンジニアを募集しています

 

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる