好吧,我一直看到(和关注)人们说使用散列机制将密码存储在数据库中。我真的很担心它安全吗?
让我们举个例子。
假设我是黑客,我得到了你的数据库名称、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 仅用于示例目的。我说的是任何安全密码机制