けんぼーは留年生

Twitterに書ききれないこととか

僕の考えた最強のパスワード

パスワードに欲しい要件を考えた。

  1. 無意味な文字列であること。
  2. 十分長い。
  3. サービスによって違うものを使い分ける。
  4. 特に重要な物については定期的に変更する

これらをすべて満たしたパスワードをサービスの数だけ作り覚えていく……無理だろ。
勿論世の中にはパスワードを保存して管理してくれるソフトなんかもあるようだが、

  • いつでも自分の環境というわけではない。
  • 保存したパスワードが流出、あるいは破損するリスク。

ということを考えるとイマイチ安心して使えない。
パスワードを保存せず、そして沢山覚えなくて良い方法は無いものか。
最初に思いついたのは「同じパスワード+サービス名」という方法だが、
普通に考えてパスワードが流出したら他の物も類推出来てしまうので意味が無い。

そして僕は思いついた。
ハッシュ値をパスワードにすれば良いじゃん。

ハッシュ値とはハッシュ関数によって得られる値だ。
例えばあるハッシュ関数にAという値を入れてBというハッシュ値が得られたとする。
AからBを計算することは容易だが、BからAを逆算することは非常に困難。
これがハッシュの性質だ。
「同じキーワード+サービス名」からハッシュ値を取ってそれをパスワードにすれば

  • 無意味な文字列
  • 長い
  • サービスによって違う

の全てを満たすことが出来る。
ついでに2014とか付加すれば毎年違うパスワードだって可能だ。
そして、もしパソコンのデータが全て吹っ飛ぶみたいな不幸な事故が起こっても
この方法ならキーワードとパスワードの計算方法を覚えている限りいつでもパスワードを復元できる。
ちょっと特異な環境でもちゃちゃっとパスワードを計算するスクリプトを書けば
いつでもどこでもパスワード生成器が作れる。
例えばjavascriptとかで実装すればブラウザでアクセスするだけで実行可能だ。*1

もちろんハッシュ値と言えど完全に逆算が出来ないわけではなくて、
例えば総当りすれば答えは出るし時間をかければ特定することは可能だ。
だが、パッと見はランダムな文字列と変わらないし、
わざわざ一手間かける人はいないと期待したい。
仮にいたとしても同じハッシュ値が得られる候補は複数存在する。
入力するキーワードが長ければ長いほど攻撃者は面倒を強いられる。

というわけで実際にHSPでサクッと作ってみた。*2
http://www.kembo.org/password_generator.zip

ハッシュ関数にはMD5を使ってみた。理由は特に無い。
安全性がどうのと言われるが、それは大体衝突性の問題なので
逆算が困難なのは多分どのハッシュ関数でも同じはず……だよね?

返ってくるハッシュ値は16進数だったので
それを2^n種類ではない記号列に集約するのにすごろくみたいな方式にした。
例えばa1,a2,a3,……という値をn種類の記号列に変換する時は
(a1)%n, (a1+a2)%n, (a1+a2+a3)%n, ……
と言った具合に。
これでまぁ大体の文字の偏りも軽減されてると思う。多分。



で、ここまでやっといて気が付いたんだけど
普通パスワードって平文じゃなくハッシュで保存してるんだよなぁ。
ハッシュがただ二重になっただけだなぁ。
普通に暗号化したパスワードをクラウドに保管してるのでも
大して変わらないんじゃないだろうか……。

もう寝よう。


追記

この方法同じキーワードを何度も入力するから
ショルダーハッキングのリスクは大きいなと思った。

追記2

↑じゃあキーワード入力BOXを複数用意して、
片方の入力値は一度入力したら終了するまで保管するようにすればええやん。
パスワードの作り方の問題とは関係無かった。

*1:尤もその場合はページが改竄されているリスクに注意を払うべきだ。

*2:僕としてはこれをそのまま使うのではなく、各自がこれを参考に適当に実装して使うことを想定している。