2009-06-01 18 views
5

Upfront、私は暗号とパスワードのセキュリティに関する完全な初心者であることを告白したいと思います。私はデータベースにパスワードを保存しようとしているのは、ルビーのbabysatです。私の理解では、平文パスワードはランダムな「塩」に追加されなければならないということであり、その全体のフレーズのようないくつかのハッシュアルゴリズムによってハッシュ化する必要があります。その文字列は、データベースに格納されるとルビーでハッシュされたパスワードを使って作業する

Digest::SHA1.hexdigest(salt_plus_plainpassword) 

、どのように一つは、それを取得しません再び未知のランダムな塩が付加されていた場合、ユーザーが入力した内容が正しいことを確認するためにもう一度表示しますか?

答えて

6

塩を保存する最善の方法は、各ユーザーのためのものであり、実行した時点での時間に基づいて生成されます。

データベースにアクセスしたユーザーは、ユーザーのために塩分を見ることができますが、これが起こった場合はさらに大きな問題があります。

ユーザーのパスワードを確認する方法は、クリアテキスト入力を受けて塩で暗号化し、crypted_pa​​sswordsと比較して、認証されている場合は比較します。私はあなたがそれを必要とするので、塩を格納することが問題であるとは思わない。 SQLインジェクション攻撃が心配な場合は、必要な情報(この場合は各ユーザーのsalt)を保存するのではなく、アプリケーションに対してセキュリティを確保する方がよいでしょう。

+0

よく言われています。 –

+2

これについて詳しく説明します:塩を保管することは、虹のテーブルへの攻撃からあなたを救うことだけが目的であるため、問題ではありません。ハッシュは不可逆的だが予測可能であるため、攻撃者は事前に計算された共通パスワードのハッシュを見るだけで、無制限ハッシュからパスワードを見つけることができます。 sha1( "hello")[1]の結果を推測してリストするのは簡単ですが、sha1( "hello" + salt())の結果は本当に難しいと推測します。 [1]それは:aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434dなので、私はそれが無制限のデータベースで見つかるたびに、私はパスワードを知っています。 – Skade

1

理論的には、塩は2つの主目的を果たす。 1つは、重複したパスワードがデータベース上の同じハッシュ値で終わるのを防ぐことです。 2番目はパスワードの長さを増やすことで、攻撃者がパスワードを推測するのが難しくなります。

しかし、あなたがデータベースにそれを挿入すると、誰かがそのデータを取得した場合、2番目の目的は多少なりとも敗北しますが、理想的には別の場所に保存する必要があります。あなたのアプリケーションは非常に敏感です!

アプリケーションのコードが公開されていない場合は、作成日やユーザー名などの各ユーザーの静的な値に基づいて塩を生成することがこの問題を回避する可能性がありますデータベースそれはあなたが塩を使用するかどうかは不明です...

関連する問題