質問: お世話になります。 現在セキュリティの勉強をしているのですが、 レインボーテーブル対策によくソルトの使用が推奨されていますが、 ソルトの有用性が完全に理解できていません。 ### 質問1 ソルトは基本的に1つのパスワードに紐付き、ソルト自体は秘匿性のあるデータではなく、 例えばユーザーテーブルなどがあったらそこにID、PASS,ソルトなどが1つのレコードとして、登録して運用してることが多いと思うのですが、 世界中のシステムの内情を知っている訳ではないので、実際にどのように管理することが多いのか教えてください。 ファイル?別DBで管理? ### 質問2 ユーザーテーブルにパスワードとソルトが1つのレコードで保存されているとき、 SQLインジェクションなどでパスワードが流出したの場合、パスワードと一緒にソルトも流出すると思います。 ネットの記事を読むとソルトの要件として十分の長さがある推測困難な文字列であるべきというような記述をよく見ますが、 上記のようなテーブル構成の場合、推測困難であるかどうかは問題ではないと思いますが、この認識で間違いないでしょうか。 または質問1でしたようにパスワードとソルトを同じDBで管理していないことを前提にした話なのでしょうか。 ### 質問3 ユーザーテーブルにパスワードとソルトが1つのレコードで保存されていて、パスワード、ソルトが流出した場合でも レインボーテーブル対策に有効であり、これは事前に用意してあるレインボーテーブルが使用できないからであるという記事をよく見ます。 例えば100万件のユーザー情報が流出した場合、すべてのユーザーのパスワードを解析するのに100万パターンのレインボーテーブルを作成する必要があり、 これはほとんど不可能であるという事らしいですが、全てのパターンのレインボーテーブルを作成しなくても数件分でも作成すれば解析自体はできると思うのですが、 いかがでしょうか。そもそも1レインボーテーブル作成時間がどれくらいかかるか分からないのですが、どの程度かかるものなのでしょうか。 よろしくお願いいたします。
回答: > > 質問1 実際にどのように管理することが多いのか教えてください。 > > > たとえば、PHPの`password_hash()`でハッシュ化すると、**ソルトとハッシュ値をつないだ文字列**が生成します(PHPマニュアル)。これをそのままデータベースに入れることが多いです。 > > 質問2 上記のようなテーブル構成の場合、推測困難であるかどうかは問題ではないと思いますが、この認識で間違いないでしょうか。 > > > 各ユーザーごとに**バラバラ**であれば、予測不能かどうかは問題となりません。全員に同じソルトだった場合、同じパスワードが同じハッシュ値となってしまいます。 > > 質問3 そもそも1レインボーテーブル作成時間がどれくらいかかるか分からないのですが、どの程度かかるものなのでしょうか。 > > > パスワードの長さに大きく依存しますが、ものによっては**年単位**でかかることもあります。