2009-09-04 12 views
14

MD5ハッシュを使ってデータベースにユーザーパスワードを格納している古いアプリケーションがあります。私はこれをSHA-2ファミリーのものに置き換えたいと思っています。パスワードハッシュをMD5からSHAに変換するにはどうすればよいですか?

私はこれを達成する2つの方法を考えていましたが、どちらもやっかいなようです。

1)ブール値「フラグ」フィールドを追加します。この後、ユーザーが初めて認証するときは、MD5パスワードハッシュをSHAパスワードハッシュに置き換え、フラグを設定します。私はその後、パスワードのハッシュが変換されているかどうかを確認するフラグを確認することができます。

2)SHAハッシュを格納するための2番目のパスワードフィールドを追加します。ユーザーがこれ以降に初めて認証するときは、SHAでパスワードをハッシュし、新しいフィールドに格納します(おそらく、同時にMD5ハッシュを削除します)。次に、SHAフィールドに値があるかどうかを調べることができます。これは本質的に私の旗になります。

どちらの場合でも、ログイン頻度の低いユーザーが頻繁にMD5認証を実行しなければなりません。もはやアクティブではないユーザーは、SHAに切り替わることはありません。

これを行うより良い方法はありますか?

+3

あなたの2を試すことができますソリューションは私には大丈夫です。 – wtaniguchi

+0

そして、私はネッドの答えを上げています。彼はそこで良い点を持っています。 – wtaniguchi

+5

切り替えられていないユーザーについては、特定の割合のユーザーが切り替えられ、MD5ハッシュを取り除くだけの時間が経過した後に検討したいと思います。その期間中にログオンしていない人は、再度ログインしたときにパスワードをリセットする必要があります。それが受け入れられるかどうかは、ビジネス上の決定です。 –

答えて

11

基本的に同じですが、余分なフィールドを追加するよりも、おそらくよりエレガント:Djangoのデフォルトの認証framworkでは、パスワードハッシュは、このように構築された文字列として格納されます。

hashtype$salt$hash 

HashtypeはSHA1またはMD5のいずれかです、 saltは、生のパスワードを暗号化するために使用されるランダムな文字列であり、最後はハッシュ自体になります。値の例:あなたが最初にそれらをMD5ingことにより、あなたの将来のパスワードを作成する場合

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 
+0

これは最高の答えです。 –

+0

唯一の問題は、ユーザーに別の一意の値または派生した値を使用するのではなく、塩を明らかに塩にするような方法で塩を保存することです(アカウント作成のタイムスタンプの変更バージョン、 - ユーザー名の公開など)。これは、現在の実現可能な相違が、どれくらいの期間、クラックにかかってしまうのかどうかは疑う余地があります。 – defines

+0

@ダスティン:ここで余分な強さは、ユーザーがパスワードを変更するたびに塩を変更できることです。 – Joshua

3

私はあなたがすでに最高の可能性を持っていると思います。私はシャーが設定されたら、md5のための使用がないので、#1以上の#2が好きです。

MD5を元に戻す方法はないので、ユーザーが新しいハッシュを作成するためにもう一度認証するまで待つ必要があります。

0

あなたの2番目の提案は私にとって最高の音です。そうすれば、頻繁に利用されるユーザーは、将来的にはより安全な体験を得ることができます。

最初の効果的な「quirks-mode」はコードベースであり、新しいユーザーがより良いSHAエクスペリエンスを持つことを保証します。

+0

私には2つの解決策が同じで、わずかに異なる実装しかないようです。どちらの方法でも、次のログイン時にパスワードが再ハッシュされます。 –

+0

どちらのオプションでも、次回のログイン時に既存のユーザーのパスワードを置き換えます。それは、後でどのハッシュを使用するかをアプリに知らせる方法です。 –

2

いいえ - 基本的には、関心のあるすべてのユーザーが変換されるまで、MD5をそのまま使用する必要があります。これはハッシングの性質に過ぎず、変換を再実行するのに十分な情報がありません。

もう1つのオプションは、パスワードフィールドを事実上自己記述的にすることです。

MD5:(md5 hash) 
SHA:(sha hash) 

比較するために使用するアルゴリズムを簡単に検出し、2つのフィールドがないようにすることができます。再度、MD5をSHAで上書きします。

現在のすべてのパスワードをMD5として宣言するには、初期更新を行いたいと思うでしょう。

+4

ハッシュのサイズは自己記述的になります。MD5は常に小さくなります。 –

+2

長さを唯一の指標として使用しないでください。同じハッシュアルゴリズムを使用してすべてを切り詰めながら、ハッシュに含まれるもの(ノンス計算、他のシードデータなど)を変更することができます。別の識別子を持つことはあなたのパスワードハッシングスキームのどれが使用中であるかをあなたに示します。 – Rob

+1

あなたの唯一の2つの方法の長さが異なる場合は、必ず長さを指標として使用できます。 –

-1

MD5が塩漬けされていない場合は、いつでもパスワードを取得するためにhttp://passcracking.com/index.phpのような解読サイト/虹のテーブルを使用することができます。おそらく、再エンコード方法を使用するほうが簡単でしょう。

+5

可能であれば、これは非常に倫理的ではありません。 –

+3

@Vinko - 何らかの理由でパスワードが保存/漏洩されないように注意しても倫理に反すると感じます。 –

6

あなたのDBでそれらを焼き直しでSHA1にすべてのあなたのMD5文字列を変換することができます。パスワードを確認するには、最初にMD5を実行する必要がありますが、大したことだとは思いません。

のPHPコード(ログイン):

前: $ログイン=(MD5($パスワード)== $ storedMd5PasswordHash)。

後: $ login =(sha1(md5($ password))== $ storedSha1PasswordHash);

塩漬けでも動作し、最初のアイデアはhereです。

-4

あなたはSHA-1に変換する前に、はい、あなたが最初の本当のパスワードを知っている必要があります。..

あなたは、MD5暗号化された文字列から実際のパスワードを検索したい場合は、md5pass.com

+3

これは決してうまく設計されたシステムでは不可能です。すべてのパスワードは塩漬けで保存する必要があります。 –

関連する問題