ぱすわーどじぇねれーたー

随分前に d:id:RobinEgg:20111217:p1 で書いたパスワードジェネレーターですが、奇を衒いすぎて意味不明なコードになっていたことと、大元の Crypt-JS が更新されていたのでシンプルに書き直し、ついでに使用するハッシュアルゴリズムも SHA3 に変更して最大で64文字まで算出できるようにしました。

今時の web サービスでパスワードに記号使用不可とか64文字未満で文字数制限とかちょっとあり得ないんですが、往々にしてそういうサービスが跋扈している現状、適宜コードを書き換えるとかしてください(需要あんのか凄く疑問だけど。

javascript: (function(){
  var salt = prompt('Salt?') || 'ますたーぱすわーど';
  if ( !document.getElementById('cryptojs-sha-hmac') ){
    var s = document.createElement('script');
      s.id = 'cryptojs-sha-hmac';
      s.src = 'https://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha3.js';
      void(document.body.appendChild(s));
  }

  var genPass = function(binArray){
    var Ascii = ''; for(var i=33; i<127; i++){ Ascii += String.fromCharCode(i); }
    var passPhrase = '';
    for( var i = 0; i < binArray.length; i++){
      passPhrase += Ascii.charAt(parseInt(binArray[i], 10) % Ascii.length);
    }
    return passPhrase;
  };

  setTimeout(function(){
    var hmacBytes = CryptoJS.HmacSHA3(document.domain, salt);
    var u = new Uint8Array(hmacBytes.sigBytes);
    for (var i=0; i<hmacBytes.sigBytes; i++) {
      u[i] = (hmacBytes.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
    }
    window.prompt('Pass phrase:', genPass(u));
  }, 1000);

})();

Word 配列から byte 列への変換についてはGoogle グループを参照。