B3S
menu close

JQuery

パスワードジェネレーターで生成したパスワードってどうなん?


イブリン

公開日:2023/02/28


お久しぶりです。イブリンです。

開発中でパスワード生成機能を作ることがあり、

乱数の生成にはいくつがメソッドがあるが、パスワードをつくるのには暗号的に強いメソッドを使ってくださいと読み、

それぞれで作ったパスワードはどれぐらいすぐに再生成されるのか興味があり検証することとなりました。

 

まずはパスワード生成の関数を書きます。

今回はMath.randomとcrypto.getRandomValuesの2メソッドで、

0-9の数字10桁とアルファベット小文字26桁で検証します。

// Not Crypto
      function createPasswordNonCrypto(passwordLength) {
        const Char = '0123456789abcdefghijklmnopqrstuvwxyz';
        let password = '';
        for (var i = 0; i < passwordLength; i++) {
          var randomNumber = Math.floor(Math.random() * Char.length);
          password += Char.substring(randomNumber, randomNumber + 1);
        }
        return password;
      }

//Crypto
      function createPasswordCrypto(passwordLength) {
        const Char = '0123456789abcdefghijklmnopqrstuvwxyz';
        let array = new Uint8Array(passwordLength);
        window.crypto.getRandomValues(array);
        let password= '';
        for (let i = 0; i < passwordLength; i++) {
          rnd += Char .charAt(Math.floor((array[i] / 256) * Char .length));
        }

        return password;
      }

 

次は簡単なhtmlページを作ってボタンとかを入れる

 <body>
    <button id="button_noncrypto">math.random method</button>
    <button id="button_crypto">crypto method</button>

    <div style="display: flex">
      <p style="color: red" id="noncrypto-output"></p>
      <p style="color: slateblue; margin-left: 50px" id="crypto-output"></p>
    </div>
</body>

 

ここからは本題です

ボタンを押し、指定回数のパスワードを生成し、同じパスワードがた場合はその回数のカウント数を吐き出す関数を書く。

      $('#button_noncrypto').click(function () {
        let Currentpassword = '';
        let Allpassword = [];
        let counter = 0;
        for (let i = 0; i < 1000; i++) {
          Currentpassword = createPasswordNonCryp(4);
          counter++;
          if ($.inArray(Currentpassword, Allpassword) !== -1) {
            $('#noncryp-output').append(counter).append('<br/>');
            $('#noncryp-output').append(Currentpassword).append('<br/><br/>');
          } else {
            Allpassword.push(Currentpassword);
          }
        }
      });

何を書いているかというと、

今まで生成されたパスワード(Allpassword )と現ループで生成されているパスワード(Currentpassword)を比べ、

同様のものが出てきたときにカウンターの数字とそのパスワードを表示するということです。

 

4桁*1万回だとどのメソッドでもすぐ重複が出てしまいますが、

8桁*1万回はどれでも重複なし、10万回を試したところで自分の環境がフリーズしてしまうということが起きていました。笑

なので、今回の結論としては桁数がいちばん大事なポイントかもしれません。

 

検証の精度が足りないかもしれませんが、

コーディング練習を兼ねての一つの実験となりました。

 

つづきたいと思います・・