久々に大学のポータルサイトにログインしようとしたら、
パスワードの変更を促された。
半年に一回のパスワードの強制変更の時期かと思ったら、
(パスワードの定期強制変更は却って危険らしいが、とにかくうちの大学では採用されている。)
パスワードのルールが変わったかららしい。
こんなメッセージが出た。
ルール変更前は「8文字以上」だったはず(たぶん)なのに、
「12文字以上16文字以下」になってた。
ふと思ったが、
「12文字以上」はパスワードの強度のためなのは分かるが、
「16文字以下」という制限にはなんの意味があるんだろうか。
たとえ100桁のパスワードを設定されたって、今日日別に通信のパケット代が爆発するわけでもないだろう。
よく使われる不可逆な暗号化だと、たとえ1000桁の文字列でも1桁の文字列でも同じ桁に変換されるし、
データベースに平文のパスワードは保存されないので、
超長いパスワードを設定されたってデータベースがパンクすることはない。
もしかして暗号化する際のソルトをパスワードの桁数に応じて変えているのかと思ったが、
桁数を増やすごとに指数関数的に解析の手間が増えるのに対して、
5種類のソルトを使い分けたって大して解析を遅らせることにはならない。
ソルトとは・・・
パスワードをハッシュ化する際に頭やケツにつける文字列。
パスワードをそのままハッシュ化するより解析しにくくなる。
衝突攻撃を想定したものかもしれないとも考えたが、
パスワードのハッシュが衝突したところでどんな攻撃に利用できるのだろうか。
平たく言うと、パスワードが"aiueo"でも"aqwsedrftgyhujikolp"でもログインが可能だったとして、なにがいけないの?ということ。
衝突攻撃とは・・・
文字列は無限に作ることができるが、ハッシュは桁数が固定なので有限で、
したがって、同じハッシュの異なる文字列のペアが存在することになる。
と、いうことを利用した攻撃。
SQLインジェクションを回避するためだったら記号をNGにするだけでよいはず。
(厳密な話は知らない)
パスワードを考える時の制約としても文字数上限はやっかい。
自動生成した完全にランダムなパスワードを使え?うるせーバカ。
リソース的にもセキュリティ的にも意味のある制限には思えないんですが、
パスワードの桁数上限がなぜあるのか詳しい人おしえてください。
あとみなさんどうやってパスワード作ってるか(問題のない範囲で)教えてください。