以什么形式存储salt以及如何在以后检索密码验证

时间:2016-07-01 11:40:16

标签: java database hash md5 salt

我使用MD5算法来使用salt散列密码。注册用户后,我在我的SQL数据库中存储了哈希密码和salt。不幸的是,当我稍后检索它们时,为了将它们与用户的输入进行比较,我解决了salt编码的问题。我将salt存储为VARCHAR(16),当我尝试从我的DataBase中检索它时,它会以不同的形式进行转换。这是我的代码:

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();时,它会输出不同的盐,这会破坏整个过程。

1 个答案:

答案 0 :(得分:-1)

将密码存储在数据库中的最佳方法是使用Bcrypt。有了这个,你就不需要储存盐了。

以下是使用Bcrypt的示例代码。

1)String pw_hash = BCrypt.hashpw(" PLAIN PASSWORD",BCrypt.gensalt());

2)将pw_hash存储在DB

3)if(BCrypt.checkpw(" PLAIN PASSWORD",pw_hash)){System.out.println(" Success Login"); } else {System.out.println(" Failure Login"); }

用户首次注册密码时将执行步骤1和2。如果给定的密码与加密密码匹配,则使用步骤3.