SHA1でハッシュ化したパスワードは危険になった

(Last Updated On: 2018年4月3日)

パスワードを平文で保存するのは論外で、MD5やSHA1でハッシュ化するのは当たり前です。しかし、SHA1を2000倍早くクラックする方法などが発見され「SHA1は脆弱だ」(ちなみにMD5はもっと危険)とされてからしばらく経ちます。アメリカ政府や大手企業はSHA1は使わない、としています。

Slashdot.orgにまた載っているので更に高速化できた、ということか?

参考:

前のエントリ PostgreSQLでSHA1 でPostgreSQLでSHA1を使う方法の一つを紹介していますが可能であればSHA512など、より強いハッシュ関数を利用したり、Saltを利用する、等の方法を採用した方が良いと思います。

備考:良いハッシュ関数の性質として不可逆性があります。例えば、パスワードを「abcd789oiuy」に設定した場合、SHA1ハッシュは「8bd7c6d4024410b312a89a9e13a9b0e8826cce31」になります。良いハッシュ関数はハッシュ値からパスワードが「abcd789ouiy」である事を推測できない性質を持っていなければなりません。そうでないとハッシュ値からパスワードを解析できる事になります。

Saltを利用した場合、仮にパスワードデータが漏洩しても、Saltも知っていないと認証を行えるパスワードを推測・解析できないのでより安全になります。つまり、

$hashed_password = sha512($_POST['password'].'固定の秘密文字列');

等としてハッシュ化したパスワードデータの方がより安全です。当然ですがパスワードデータだけでは辞書攻撃もできなくなります。

追記:
2007/01/25に書いた物ですが、このエントリは比較的よく読まれているようなので追記します。

パスワードのハッシュ化はパスワードデータベースがSQLインジェクションやバックアップの盗難などによって盗まれた場合に、攻撃者がパスワードの解析ができないようにする為に行います。

SHA1でハッシュ化しただけでは、ブルートフォースによるパスワード解析を十分防げないため「安全ではない」という意味です。SHA1でもセキュリティやハッシュ衝突が重要ではない用途なら使う選択肢もありえます。

現在ではパスワードをハッシュ化するだけでは安全性が保たれているとは考えられていません。パスワードをハッシュ化する場合、予測不可能なsaltと一緒にハッシュ化するだけでなく、複数回ハッシュ化する事が必要だと考えられています。安全とされる再ハッシュの回数はハッシュ関数によって数千回から数万回と変わります。パスワード管理アプリの場合、数十万回ハッシュ関数を適用させる物もあります。

SHA1は既に古いハッシュ関数です。コリージョン(衝突)が問題となる場合、セキュリティ用途に用いる場合はSHA2以上(SHA256/SHA512など)を利用するべきです。

PHPユーザの場合、password_hash関数を利用すると良いと思います。この関数を用いDEFAULTのハッシュでハッシュ化すれば、実装されているハッシュ関数の中で最も安全と考えられるハッシュ関数を用い、salt付きで複数回ハッシュ化されます。DEFAULTのハッシュ関数が更新された場合、後方互換性を維持しつつ新しいハッシュ関数とハッシュ回数が利用されます。古いパスワードはパスワードが再設定された場合に自動的に更新されます。

password_hash関数を利用した場合でも簡単なパスワード(例えば、Pa$$w0rdなど)を使っている場合、簡単に解析できてしまいます。password_hash関数はcrypt関数のラッパーなのでsaltはパスワードハッシュと一緒にデータベースに保存されます。このブログに書いたアプリ側独自のsaltを付けた場合、アプリ独自のsaltが漏れない限り解析できません。

2要素認証はパスワードが盗まれた場合の対策として効果があります。今は2要素認証も簡単に導入できるので検討すると良いです。

参考:

投稿者: yohgaki

コメントは受け付けていません。