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