パスワードを勝手に暗号化するぐりもん

パスワードをハッシュ化(暗号化)保存することを法律で義務化するくらいのことが必要だと思う

一番最初に「パスワードを第三者に漏らしてはいけない」という厳守すべき一般常識を破ったのはユーザー自身に他ならないのだから、ここはきちんと認識しておくべきだろう。 「言いすぎじゃないか?かわいそうだ。実際のところパスワードの使いまわしはしょうがないでしょ?」という気持ちはわかるが、「しょうがない」なんていう台詞は通用しないのがビジネスであり世間の冷たさであり社会というものだ。

なるほどなー


引用文だけ見ると誤解を招きそうなのですが、上記エントリは利用者が多数のサイトで同じパスワードを使うことを非難しているわけではなくて、「ユーザーのパスワードを預かるサービスは、預かったパスワードを平文のまま保存したらダメだよ」ということでした。

とはいえ、クライアント側でも何かできることがありそう。「利用者」じゃなくて「Webブラウザ」の方ね。
例えばサーバーにパスワードを送信する際に、Webブラウザが自動的にパスワードを暗号化してくれたら、サービス側がパスワードを平文で保存していても、利用者は自分の身を守ることができるわけですね。
さらに、サービス毎に異なる鍵で暗号化できたら、引用元エントリで指摘されている「利用者自身によるパスワードの流出」も防ぐことができるんじゃないかしら。

作ってみた

というわけでuserscriptで作ってみました。


パスワードを勝手に暗号化するぐりもん
http://syttru.0web.cjb.net/password_crypt/


暗号化には以下のサイトで公開されているmd5.jsというのを使わせてもらいました。
Paj's Home: Cryptography: JavaScript MD5: md5.js

思ったこと

実際に使ってみたらパスワードの文字数制限にひっかかったりとか、パスワードにスラッシュが使えなかったりとか、他にも色々と問題が見つかって、とても実用に耐え得るものではありませんでした。なんてこったい。
誰かが改善策を授けてくれるかもしれないのでソースを貼っておきます。

(function(){
  observe( window, 'load', function() {
    var inputs = document.getElementsByTagName('input');
    var passwords = select( inputs, function( input ) {
      return input.type == 'password';
    });
    each( passwords, function( password ) {
      var shadow = document.createElement( 'input' );
      shadow.type = 'hidden';
      shadow.name = password.getAttribute( 'name' );
      password.removeAttribute( 'name' );
      password.parentNode.insertBefore( shadow, password );
      observe( password, 'change', function() {
        shadow.value = b64_hmac_md5( location.hostname, this.value );
      });
    });
  });
  function $( id ){ return document.getElementById( id ); }
  function observe(target, type, listener) {
    if   (target.addEventListener) target.addEventListener(type, listener, false);
    else target.attachEvent('on' + type, function() { listener.call(target, window.event); });
  }
  function select( list, func ) {
    var results = [];
    for( var i=0; i<list.length; i++ ) {
      if( func( list[i] ) ) {
        results.push( list[i] );
      }
    }
    return results;
  }
  function each( list, func ) {
    for( var i=0; i<list.length; i++ ){
      func( list[i] );
    }
  }

・・・ ここにmd5.jsを貼り付ける ・・・

})();