パスワードを暗号化するときには必ずソルト(Salt)を指定したほうが良い理由
HashToolKit!という、任意の文字列を各アルゴリズムで暗号化してハッシュ値が取得できるサイトがあります。 攻撃者が各パスワードのハッシュ値を辞書リストとして所持していた場合、adminやpasswordなど、頻繁に使われる単語は、ほぼ間違いなく辞書に登録されているでしょう。
そこで、任意の文字列(できるだけ複雑で予測のつきにくいもの)をソルト(Salt)として、パスワードに付与しておくことで、ソルトなしの場合とは全く異なるハッシュ値が生成され、攻撃者の辞書リストと照合してヒットする可能性が限りなく低くなります。
下記はすでに危殆化されている暗号アルゴリズムのmd5で生成したハッシュ値ですが、 平文がpasswordの場合、生成されるハッシュち下記の通り、必ず5f4dcc3b5aa765d61d8327deb882cf99となります。 このように、平文とハッシュ値は1対1になっている為、ハッシュ値より平文を推測することは比較的簡単です。
password(平文)→5f4dcc3b5aa765d61d8327deb882cf99(ハッシュ値)
ソルトなしでハッシュを生成した場合
ソルトなしでハッシュを生成した場合、そのハッシュ値が攻撃者の辞書リストに登録されている可能性が高くなる。 単純なパスワードであればほぼ確実に登録されていると思っておいたほうが良い。
ソルトありでハッシュを生成した場合
サンプルではソルトの文字列が単純だが、実際はもっと推測されにくいソルトを使用するのが望ましい。
ハッシュ化していたら安全という事はありえない
パスワードにソルトを付与することはセキュリティ対策として重要と思われますが、それだけでは安全とは言えず、ハッシュ値が漏洩しないように管理を気をつける必要があります。 (ハッシュ値が漏洩してしまい、復号されてしまったら、ソルトも意味をなさなくなります)
md5やsha1などの危殆化した暗号アルゴリズムを使用し続けるのは論外ですが、sha512などで暗号化したから安全という訳でもないみたいです。
複合的な対策が重要
先程も記載した通り、平文にソルトを付与してからハッシュ値を生成する事はセキュリティ対策として有効だが、やはりそれだけでは安全とは言えずセキュリティ対策を幾重にも重ねることが重要になってきます。
定期的なパスワード変更やパスワードポリシーの強化なども重要で、パスワードポリシーを強化することで、ハッシュ値が漏洩でもしない限り、攻撃者の辞書に登録されている可能性は限りなく低くなると予想されます。
ストレッチングも有用
パスワードにソルトを付与する事の他にハッシュ値から更にハッシュ値を生成するストレッチングもセキュリティ対策に有効です。 ストレッチングによって生成されたハッシュ値は復号されてもまた別のハッシュ値となり、平文にたどり着くまでには何度も複合処理を行う必要があります。 そのため、ソルト付きの暗号アルゴリズムをストレッチングさせて暗号かさせた場合、平文にだどりつく可能性は限りなく低くなると思われます。 ただし、暗号化にストレッチングを行うとそれだけサーバーの方には負荷がかかるので、注意が必要となります。