ユーザーとしてウェブサービスを使っていると、ユーザー登録時やパスワードリマインダを使ったときに、そのままパスワードが表示されたりして、明らかに「パスワード平文で保存してるだろ」と思われるようなものが多くあります。
1.実情としてユーザーのパスワードは平文で保存されていることが多いのでしょうか(割合としてどれくらいかというデータがあると嬉しいですが、体験談や伝聞でもかまいません
2.自分が見た、PHPでよく使われているオープンソースの認証システムでは「sha1+固定のsalt値」でユーザーのパスワードをハッシュ化しているようですが、sha1を対象とした攻撃が既に見つかっているようですし、固定のsalt値であると同一のパスワードを設定したときにハッシュ値が同じになってしまいます。
そういった問題までは一般的には気にする必要はないということでしょうか。(パスワードをハッシュ化して保存するとなると、ハッシュ化の仕組みを後に置き換えるのは現実的にかなり難しいと思われるので、途中で「やっぱこの仕組みだとやばかったわ」となっても、修正が効かないような気がするのですが)
1.実情としてユーザーのパスワードは平文で保存されていることが多いのでしょうか
少なくとも私が関わっているシステム開発では、パスワードはハッシュ化して保管しています。
しかし、他社システムとWeb連携するとき、平文のパスワードを渡されたことが何度かあり、これには閉口しました。いずれの原因も、第三者が作成したPHPやJavaのフレームワークが原因でした。
フリーにせよ市販にせよ、フレームワークを利用する際は、あらゆる観点からチェックを加えるべきです。
2.sha1を対象とした攻撃が既に見つかっているようですし
「【CRYPTO-GRAM日本語版】解読されたSHA-1」によれば、2の69乗回の演算でSHA-1衝突を発生させる手法が明らかになったとのこと。2005年時点では、
2の69乗回の演算には3年3カ月を要する。開発に2500万~3800万ドルをかけられるならば,56時間に2の69乗回の演算を処理できるシステムも実現できるだろう。
としています。
その後、さらに計算回数を減らせるというレポートも出たようです。
ただ、愉快犯を別にすれば、アタッカーもプロですので、これだけのコストをかけて破るに値するシステムでなければ攻撃してきません。
残念ながら、私が関わっているシステムでは、そこまで重要度の高いものはありません。
固定のsalt値であると同一のパスワードを設定したときにハッシュ値が同じになってしまいます
これは、salt 値を乱数にするかどうかという問題とは関係なく、運用上の問題になります。
SHA-1の出力は160bit、これに対してパスワードは英数8文字程度の56bitですから、実はパスワードを総当たりで解く方が早いんですね(笑)。
SHA-1の衝突を気にするようなシステムは、少なくともパスワードの長さが英数23文字以上であるようなシステムになります。
1.実情としてユーザーのパスワードは平文で保存されていることが多いのでしょうか
少なくとも私が関わっているシステム開発では、パスワードはハッシュ化して保管しています。
しかし、他社システムとWeb連携するとき、平文のパスワードを渡されたことが何度かあり、これには閉口しました。いずれの原因も、第三者が作成したPHPやJavaのフレームワークが原因でした。
フリーにせよ市販にせよ、フレームワークを利用する際は、あらゆる観点からチェックを加えるべきです。
2.sha1を対象とした攻撃が既に見つかっているようですし
「【CRYPTO-GRAM日本語版】解読されたSHA-1」によれば、2の69乗回の演算でSHA-1衝突を発生させる手法が明らかになったとのこと。2005年時点では、
2の69乗回の演算には3年3カ月を要する。開発に2500万~3800万ドルをかけられるならば,56時間に2の69乗回の演算を処理できるシステムも実現できるだろう。
としています。
その後、さらに計算回数を減らせるというレポートも出たようです。
ただ、愉快犯を別にすれば、アタッカーもプロですので、これだけのコストをかけて破るに値するシステムでなければ攻撃してきません。
残念ながら、私が関わっているシステムでは、そこまで重要度の高いものはありません。
固定のsalt値であると同一のパスワードを設定したときにハッシュ値が同じになってしまいます
これは、salt 値を乱数にするかどうかという問題とは関係なく、運用上の問題になります。
SHA-1の出力は160bit、これに対してパスワードは英数8文字程度の56bitですから、実はパスワードを総当たりで解く方が早いんですね(笑)。
SHA-1の衝突を気にするようなシステムは、少なくともパスワードの長さが英数23文字以上であるようなシステムになります。
丁寧な回答ありがとうございます。
やはり、攻撃の効率と保存されているデータの重要度のバランスが肝なのですね。
割合などは知りませんが、大手ベンダーでも平気で平文のパスワードを提案してきたり、暗号化やハッシュの仕組みについてほとんど知らないという経験を複数しています。
実際にパスワードの変更字に平文のままメールで送りつけてくる大手サービスもまだありますよね。
まえに下記のような質問もありました。
http://q.hatena.ne.jp/1207182796
パスワードは単一のシステムとしてみるのではなく、ユーザーが複数のシステムで同じものを使うということも念頭において設計しないといけません。
ここ数年でだいぶ状態は改善されると思うんですけどね。
パスワードとsoltではなく、ユーザーIDとパスワードとsoltにすれば、ハッシュ後の重複は気にしなくてよくなります。
まあいまなら私はsha256で組むかなぁ。
回答ありがとうございます。
>まあいまなら私はsha256で組むかなぁ。
ちょっとここの根拠が知りたかったです。
丁寧な回答ありがとうございます。
やはり、攻撃の効率と保存されているデータの重要度のバランスが肝なのですね。