Javascriptでランダムなパスワードを生成する

2017-01-15

会員登録等でパスワードを設定する機会が多いと思いますが、最近は英字の大文字・小文字+数字といったように、より安全性の高いパスワード入力を求めるサービスが増えています。

パスワードの入力を自分で行う場合は入力文字列を確認し、期待した文字列が含まれない場合はエラーを返す事になりますが、今回はパスワード自体をプログラム側で自動生成する場合のコードサンプルとなります。

サンプル

乱数を生成する

/*
 * 乱数を生成
 */
var ransu = function(n){
  var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  + '#$%(){}@';
  str = str.split('');
  var s = '';
  for (var i = 0; i < n; i++) {
    s += str[Math.floor(Math.random() * str.length)];
  }
  return s;
};

n桁の乱数をstrで指定した文字列で生成します。ただ、これだけですと確率によって英小文字だけ選ばれたりといった事が有りますので、含まれているかどうかを確認します。記号はSQLの制御文字と被ると厄介なのであえてこんな感じで。後はご自由に。

 

英数字の大文字・小文字を1文字以上含むパスワードを生成する

/*
 * 英数字の大文字・小文字を1文字以上含む
 */
  $(document).on('click','#btn1',function(){
    var code = '';
    var i=0;
    while ( code=ransu(8) ) {
      if(code.match(/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[a-zA-Z\d]{8,100}$/)){
        $("#passwd1").val(code);
        break;
      }
      i++;
    }
    $("#kausu1").text(i);
  });

英数字の大文字・小文字・記号を1文字以上含むパスワードを生成する

/*
 * 英数字の大文字・小文字・記号を1文字以上含む
 */
  $(document).on('click','#btn2',function(){
    var code = '';
    var i=0;
    while ( code=ransu(8) ) {
      if(code.match(/^(?=.*?[a-z])(?=.*?\d)(?=.*?[!-\/:-@[-`{-~])[!-~]{8,100}$/i)){
        $("#passwd2").val(code);
        break;
      }
      i++;
    }
    $("#kausu2").text(i);
  });

慣れもあるのでjQuery使っていますが、要は正規表現で期待した文字列が含まれているかを確認出来たらwhileから抜けるだけですね。

私は自分の慣れた文字列(もちろんサービス毎に変化を付けますが)を使いたいので自動生成されるのは嫌いなのですが、意外とそれすら入力が面倒だという方が一定数居る事と、パスワードはこれですよと与えられる事に嫌いが無い方もいらっしゃるので。

あと、誕生日っぽい文字列とかも拒否される事が有りますが、そこまで厳密にせず何か良い手は無いものでしょうかねパスワード・・・過去に使ったパスワードを使えないといったサービスもあるので、あまり使わない文字列で設定する事になりますが、そうなると忘れてしまい毎回パスワード再発行をしていたりします。まぁAppleですが。