【发布时间】:2016-11-03 19:32:52
【问题描述】:
我使用 MD5 算法用盐对密码进行哈希处理。注册用户后,我将散列密码和盐值都存储在我的 SQL 数据库中。不幸的是,当我稍后检索它们时,为了将它们与用户的输入进行比较,我解决了盐编码的问题。我将盐存储为 VARCHAR(16),当我尝试从我的数据库中检索它时,它会以不同的形式转换。这是我的代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
String DB_salt1 = rs.getString("Salt");
byte [] DB_salt = DB_salt1.getBytes();
我使用了一些System.out.println(); 函数来定位问题,我发现byte [] DB_salt = DB_salt1.getBytes(); 输出了错误的盐,而String DB_salt1 = rs.getString("Salt"); 输出了正确的盐。我的猜测是它会发生字节丢失。
编辑:为了澄清,正确的盐和存储在我的数据库中的盐,假设是 [B@4e25154。 String DB_salt1 = rs.getString("Salt"); 存储此盐;正确的。但是当byte [] DB_salt = DB_salt1.getBytes();被执行时,它会输出一个不同的盐,从而破坏了整个过程。
【问题讨论】:
-
不要使用 MD5 作为密码,这不是它的设计目的。其他算法(例如 bcrypt)要好得多,并且实际上可以为您处理存储盐。
-
如果你执行 .getBytes() 你得到字节,如果你执行 getString() 你得到一个字符串。它们都有不同的外观,因为它们是不同的数据类型@stuXnet 不是 MD5 哈希密码的标准和最常用的方法吗?
-
@KJaeg 我不会说它是“标准”™,但是是的,恐怕它是最常用的密码哈希方法,即使它真的应该不是。
-
@stuXnet 好的,感谢您提供的信息。回到大学,我们的 IT 安全教授告诉我们,我们应该使用最常用的算法,因为使用它们的原因是直到现在还没有人想出破解它们。那时,MD5 是顶级算法。
标签: java database hash md5 salt