2009-06-18 10 views
5

パスワードがハッシュ値として保存されている場合、ユーザーが自分のパスワードを電子メールで送信するように要求できますか?パスワードがハッシュ値として保存されたときにパスワードを取得する

ハッシュ値を適切な情報(平文テキスト値)に変換する方法はありますか(&必要な情報)?

ユーザーが2つのサイトに同じパスワードハッシュ値を格納している場合、そのパスワードは両方のサイトで同じになりますか?

答えて

28

パスワードのハッシュのみを保存している場合は、いいえ。とにかく、適切に塩漬けされたパスワードのハッシュだけを保管するべきです。

パスワードリセットメカニズムは適切な方法です。

+6

塩の使用を思い出させるための+1 ... –

+1

塩の適切な使用のための私の答えを参照してください...塩を格納することはそれを使用する目的を敗北.. – jrista

+11

塩の目的はルックアップテーブルを無効にすることで、多数の可能性のあるパスワードを単純にハッシュし、ハッシュ値を探すことはできません。それは塩の秘密を保つことに頼らない。また、あなたがそれを格納していない場合、あなたはどのようにしてパスワードを確認するのですか? –

7

要するに、ほとんどのハッシュアルゴリズムでは、同じ出力を持つ複数の入力を持つことができます。パスワードリセットオプションを提供する方が良い場合がよくあります。

10

ハッシュされたパスワードは一般には取得できません(これはハッシュ関数によって異なりますが、セキュアハッシュは取得できません)。 2つのサイトで同じハッシュがある場合、同じパスワードを使用できます。これは、サイトで使用されるハッシュソルト、どのような方法などによって異なります。

パスワードが安全なハッシュシステム決してパスワードを電子メールで送信できないようにするには、パスワードを忘れた場合はリセットする必要があります。

3

ハッシュアルゴリズムにはさまざまな種類があります。いくつかは他よりも安全です。 MD5は普及していますが、安全性に欠けるものです。 SHAファミリは、さらに安全なアルゴリズムのセットです。

定義上、ハッシュは一方向性関数です。それは元に戻すことはできません。

http://en.wikipedia.org/wiki/Sha-1

+0

プレーンSHA-1/2は悪い考えです。あなたは塩分が必要で、ハッシングを遅くするものが必要です。 PBKDF2、bcrypt、scryptが標準の選択肢です。 – CodesInChaos

+0

合意された、私は通常これらの日だけbcryptを使用しますが、どちらの方法でも、質問は本当に不可能なハッシュを逆転させることでした。 (既知のハッシュのルックアップテーブルを使用することは、ハッシュを逆にすることと同じではありません)。 –

3

クリアテキストのパスワードを回復するための簡単な方法があった場合は、そもそもパスワードをハッシュにはポイントはないだろう。その時点で、base64またはROT13だけでもよいでしょう。 (そうしないでください)

他にも記載されているように、他のパスワード回復方法を使用してください。クリアテキストのパスワードにアクセスする正当な理由はありません。

2つのサイトのハッシュが同じ場合、ユーザーは両方で同じパスワードを持つ可能性が非常に高いです。しかし、100%保証されているわけではありませんが、ハッシュの衝突があるかもしれませんが、それは非常に難しいでしょう。

+2

そして、どちらのサイトも塩を追加していない可能性があります。 –

-1

パスワードのハッシュを保存する背景にある一般的な考え方は、データベースにアクセスできるユーザーであっても、パスワードが安全であることを保証することです。信頼は決して暗黙ではありません。ハッシュは一方向アルゴリズムなので、ハッシュコードから元のパスワードを派生させる方法はありません。通常、ユーザーがハッシュとして保存されたパスワードを回復する必要がある場合は、秘密の質問をして、一時パスワードを電子メールで送信するか、一時的なリンクを電子メールで送信してパスワードを変更する必要があります。これにより、パスワードは決してクリアテキストで保存されず、信用できると思われる人でさえも、すべての世の中から安全です。

+6

"と塩を保管しておけば、最初に塩をとるという目的を破っています。" - これは間違っています。あなたは塩を保存しなければなりません。そうしなければ、ハッシュを検証できません。塩を保管することにはセキュリティ上の欠点はなく、ルックアップ攻撃を打ち負かすだけです。 – frankodwyer

+2

私はあなたのコメントに同意しなければならないスラットはすぐに破棄する必要があります。あなたのパスワード交換の例では、はい、塩は1回であり、捨てるべきです。 しかし、ユーザー認証では、ユーザーごとの塩を使用する必要があり、パスワードを保存して使用可能にする必要があります。たとえば、ユーザー名でパスワードをソルトすると、ユーザーごとに辞書が必要になるため、事前計算された辞書攻撃が防止されます。 – longneck

+0

ほとんどのプログラマーは、誰かがデータベースにアクセスしてハッシュを持っていれば、塩を持っているので、データベースに塩を入れません。塩はしばしばアプリコードで生きています。別の考え方は、ユーザーが参加したときに基づいて塩分を計算するなど、計算された塩を使用することです。 – marr75

2

一般的に使用されるハッシュを逆にする方法はありません。彼らは強引にすることができます(すべての可能なパスワードを試してみてください)。または単語リスト(一般的に使用されるパスワードのリストを使用して)を併用して速度を上げることもできますが、依然として非常に遅くCPU集中的なプロセスです。

多くのサイトで使用する最も良い方法は、ユーザー名と電子メールを入力する「パスワードリセット」ボタンを作成することです。一致すると、ランダムなパスワードが送信され、ログインページへのリンクが表示されますランダムなパスワードでログインしてパスワードを変更することができます。これを行うには

0

あなたはフィールドを持つモデル持っている必要があります。

Hashed_password 
Salt 

をそして、あなたは、あなたがあなたのコントローラ内で定義することができます パスワードを(ここで私はSHA1を使用)ハッシュする方法をユーザーに知っておく必要があります。

あなたが比較できる
def self.encrypted_password(password, salt) 
    string_to_hash = password + "wibble" + salt 
    Digest::SHA1.hexdigest(string_to_hash) 
end 

次へ:

user.Hashed_password == encrypted_password(password, user.salt) 

真の股関節を意味t "パスワード"は、ユーザー "ユーザー"のパスワードです

関連する問題