【发布时间】:2012-10-30 15:56:00
【问题描述】:
嗯,我一直看到(和关注)人们说要使用散列机制将密码存储在数据库中。我真的很担心它是否安全?
举个例子吧。
假设我是黑客,我得到了您的数据库名称、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 仅用于示例目的。我说的是任何安全密码机制
【问题讨论】:
-
如果不是MD5,那我还应该用什么?
-
@dystroy :如果我能问谷歌先生,我就不会在这里问这个问题了。
-
安全性不是二进制的。散列更安全。加盐散列更加安全。使用加盐哈希的隔离数据库更加安全......
-
3 反对票?我很惊讶......哇哇哇!!!
标签: java passwords md5 password-hash