データベースにパスワードを保存するためにハッシュメカニズムを使用するように言っている (そしてフォローしている) 人をいつも見てきました。私は本当に心配していますそれは安全ですか?
例を見てみましょう。
私がハッカーで、あなたのデータベース名、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 を選択したのは、例としてのみです。安全なパスワードのメカニズムについて話している