0

データベースにパスワードを保存するためにハッシュメカニズムを使用するように言っている (そしてフォローしている) 人をいつも見てきました。私は本当に心配していますそれは安全ですか?

例を見てみましょう。

私がハッカーで、あなたのデータベース名、ID、パスワードを入手したとしましょう。これで、あなたのデータベースに完全にアクセスできます。

誰かがハッキングした場合、ハッカーに見られるため、パスワードはハッシュ化する必要があると言われています。

したがって、次のようにクエリを実行するとselect id, password FROM userDetails、次のようにデータが取得されます

オプション 1: ハッシュなし

++++++++++++++++++++++++++++
+   id    +    password    +
++++++++++++++++++++++++++++
+  id01    +  password01   +
+  id02    +  password02   +
++++++++++++++++++++++++++++

オプション 2 : ハッシュあり

++++++++++++++++++++++++++++
+   id    +    password    +
++++++++++++++++++++++++++++
+  id01    +  hasValue01   +
+  id02    +  hasValue02   +
++++++++++++++++++++++++++++

まあ、それでも私は言いますが、ハッシュは安全ではありません。以下でJavaコードを使用して説明する理由。

PreparedStatement pst = conn.prepareStatement("SELECT id, password FROM userDetails");
ResultSet rs = pst.executeQuery();
String randomPassword = "";
StringBuffer sb;
boolean myPassCheck = true;
while (rs.next()) {
    myPassCheck = true;
    while (myPassCheck) {
        // this will generate random password
        randomPassword = generateRandomPassword();
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] array = md.digest(randomPassword.getBytes());
        sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
        }
        if (sb.toString().equals(rs.getString(2))) {
            // this is password
            myPassCheck = false;
            System.out.print("id=" + rs.getString(1) + ", password=" + sb.toString());
        }
    }
}

このようにして、ユーザー名とパスワードを印刷できます。(パスワードが見つからなくなるまで、ランダムなパスワードを生成する必要があることはわかっています)。ただし、この方法では、パスワードのハッシュ メカニズムも失敗します。

また、この世界には、ハッシュデータを実際のデータに変換するデクリプターが存在すると思います。

したがって、私は考えています

ハッシュメカニズムは安全ですか?


編集 1

私はMD5だけについて話しているのではありません。MD5 を選択したのは、例としてのみです。安全なパスワードのメカニズムについて話している

4

4 に答える 4

4

いいえ、特にパスワードに MD5 を適用するだけでは、ハッシュを使用するだけでは安全ではありません。

  • パスワード (ほとんど一般的な単語であることが多い) を変換するだけであれば、一般的なパスワードのデータベースを使用して簡単にテストできます。そのため、常にソルトを使用し、できればユーザー レコードの他の定数部分を組み合わせて使用​​してください。Google でハッシュを入力することで、ハッシュの起源を見つけることさえあるかもしれません...
  • MD5 は衝突しやすいため、ハッシュを使用する場合でも、SHA 256 以上を優先します
  • MD5 は計算が高速で、ブルート フォース攻撃でのテストも高速です

ハッシュ メカニズムを使用しますが、次の点に注意してください。

  • SHA-256 や SHA-512 など、より優れたハッシュ関数を使用する
  • 構築された文字列をハッシュします。たとえば、ユーザー名 +ソルト+ パスワード (他のプログラムで使用されていない限り、一定のソルトを使用できます。ほとんどの用途には十分です)

誰かを登録する(または誰かがパスワードを変更する)ときのプロセスは次のとおりです。

1) 文字列 s を s=username+salt+password (または同様の関数) として構築する

2) ハッシュを SHA256(s) として構築する

3) ユーザー名、salt (定数でない場合)、およびハッシュをデータベースに格納する

ユーザーを認証するときは、同じ方法でハッシュを作成し (ユーザーによって指定されたユーザー名とパスワード、およびデータベースにあるソルトを使用)、ユーザー名とハッシュをデータベースにあるものと比較します。実現不可能なため、ハッシュ関数を逆にしません。


コードに関して:あなたのアプローチは、推測しようとしているパスワードと同じMD5になるまで、可能なすべてのパスワードを生成するようです。15 文字のすべての組み合わせをテストするには十分な時間がないため、妥当なパスワードではこれは機能しません。

于 2012-11-10T15:07:16.180 に答える
3

パスワードが平文で保存されることはありません。世界で最も素朴なプログラマーを使用して世界で最も安全でないシステムを構築している場合を除き、少なくともそうすべきではありません。

代わりに、パスワードはハッシュ関数の出力として保存されます。攻撃者がパスワードのハッシュ バージョンにアクセスしたとしても、ハッシュ値だけからパスワードを再構成することはできません。

しかし、レインボー テーブルを使用してパスワードのハッシュ値を攻撃することは可能です。これは、考えられるすべての文字の組み合わせに対して事前に計算された膨大なハッシュ値です。攻撃側の PC は、これらすべてのハッシュをオンザフライで確実に計算できますが、事前に計算されたハッシュ値の膨大なテーブルを利用することで、攻撃を数桁速く進めることができます。 (または少なくともそのほとんど)メモリ内。このようなテーブルは、rainbow table

これは古典的な時間と記憶のトレードオフであり、まさにブラック ハットの攻撃者が取ると予想される不正行為の近道です。

次の文字セットのデータベース:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~[]{}|\:;"'<>,.?/ パスワードの最大長が 14 の場合、サイズは 64GB になります。

rainbow tableパスワード ハッシュをソルトした場合、攻撃者は「password」と「deliciously-salty-password」からのハッシュ結果が一致しない一般的な攻撃を使用できません。あなたのハッカーがあなたのすべてのハッシュが「おいしい-塩辛い」ものであることをどういうわけか知っていない限り.

それでも、彼または彼女はあなたのために特別にカスタムレインボーテーブルを生成する必要があります.

このトピックに関するThomas Ptacek の優れた有益な記事をお読みください。パスワードハッシュの基本事項について、さらに詳しく説明します。

そして最後にあなたの質問への答え:

いいえ、安全ではありませんが、可能な限り安全にするために最善を尽くすことができます。

于 2012-11-10T15:08:53.067 に答える
1

いいえ。パスワードのハッシュは安全ではありませんが、そうしないよりは安全です。ご覧のとおり、十分な時間とハードウェア リソースがあれば、このようなハッシュ化されたパスワードは簡単に解読できる可能性があります。これが、ソルトを使用してパスワードをより安全にする理由です。ソルトは、実際のパスワードと何らかの形でマージされたものであり、そのような文字列のハッシュコードを保存します. 攻撃者は暗号化を破ることができるかもしれませんが、ソルトが混ざったパスワードを受け取ります。これは、いわゆる「レインボー テーブル」を使用してパスワードを解読する人々にとって非常に優れた保護機能です。残念ながらまだ壊れやすいです。詳細については、こちらを参照してください: http://arstechnica.com/security/2012/08/passwords-under-assault/

于 2012-11-10T15:07:29.237 に答える
1

いいえ、特に攻撃者がハッシュ データベースを持っている場合は、100% 安全ではありません。より良いアプローチは、ソルト化されたパスワードを使用することです。これにより、ハッシュ データベースがまったく役に立たなくなります。

パスワードをもう少し安全にするもう 1 つの方法は、パスワードを数回ハッシュすることです。これも、ハッシュ データベースの有効性を低下させます。

他の投稿で言及されているように、sha-512 のようなより安全で高価なアルゴリズムを選択してください。

于 2012-11-10T15:09:03.553 に答える