パスワード強度評価ツールzxcvbnをC#で使う

年始から始まったデジタルのアカウントの処分ですが、日本の金融系(銀行、証券会社、クレジットカードなど)のウェブアプリのパスワードの弱さが気になります。

特に、ニッセイ確定拠出年金などは「半角数字4~7桁」とのこと。ニッセイ確定拠出年金は出来れば付き合いをやめたいです。

mrgchr.hatenablog.com

「最大長が7文字」などは今の時代にはそぐわないパスワードの制限ですが、一方でSBI証券のように「記号を2種類入れなければならない」などというのも好きになれないものです*1

パスワード設定時にパスワード強度評価ツールで計算したパスワードの強度を示して、ある一定以上のパスワード強度であればパスワードとして受け入れる、などしてほしいものです。

(あるいは、弱いパスワードを入力したユーザーにリスクがあることを促す、など)

パスワード強度評価ツール zxcvbn

パスワード強度評価ツールはDropboxにより開発されたパスワード強度評価ツールです。

github.com

roboformやbitwardenのパスワード強度評価にも利用されているそうです。

www.roboform.com

bitwarden.com

C#での実装で遊ぶ

zxcvbnのオリジナルの実装はJS(CoffeeScript )で書かれていますが、ありがたいことにC#での実装があったので、これで遊んでみます。

github.com

使い方も非常に簡単です。パスワードの強度に応じて Score が0~4の5段階で計算されます。

      int CalcPasswordZxcvbnScore(string password) => Zxcvbn.Core.EvaluatePassword(password).Score;

      CalcPasswordZxcvbnScore("password");
      //=>0

      CalcPasswordZxcvbnScore("password123");
      //=>0

      CalcPasswordZxcvbnScore("p@ssw0rd123");
      //=>1

      CalcPasswordZxcvbnScore("9vpwBRVg");
      //=>2

      CalcPasswordZxcvbnScore("btn!EsT7");
      //=>2

      CalcPasswordZxcvbnScore("TiEpmAQk3y");
      //=>3

      CalcPasswordZxcvbnScore("4iHMaCmBp72Q");
      //=>4

      CalcPasswordZxcvbnScore("B5X2McQGcMj2P$x5$5#y");
      //=>4

興味深いことにRoboformでは「良い(上から2番目の評価)」だったパスワードが zxcvbn-cs では4(最高評価)となることもありました。

この辺りは各社独自の工夫がなされているのでしょうか。それとも実装依存の部分なのでしょうか。

ともあれ、非常に簡単に使えるので、パスワードを設定するUIではこういうものでユーザー側にフィードバックするのはとても良いものだと思います。

*1:そんなルールを強いられたユーザーはどう行動するかというと、紙に書いて保存するでしょう