为什么getBytes []和insert bytes []给出不同的结果?
CREATE TABLE users (
`username` VARCHAR(15),
`password` VARCHAR(32),
`salt` VARCHAR(32)
);
每当我想创建一个新用户时,我会生成一个随机salt(类型:bytes []),然后将其与其他列一起存储在数据库中。
但是,当我尝试使用rs.getBytes("Salt")
从数据库中检索salt时,我不会得到相同的结果。
我知道我可以使用rs.getString("Salt")
检索盐但是我需要将其设为byte[]
类型。
我试图将String
转换为Bytes[]
,但结果却不一样.. !!
String username = "admin";
String password = request.getParameter("password");
byte[] salt = SaltedMD5.getSalt();
password = SaltedMD5.getSecurePassword(password, salt);
stmt.executeUpdate(String.format("INSERT INTO users VALUES('%s', '%s', '%s')", username, password, salt));
byte[] DB_salt = rs.getBytes("Salt");
答案 0 :(得分:4)
帮自己一个忙,转而使用安全的算法。您的密码不仅可以得到正确的保护,还不必关心盐的生成和储存。
大多数BCrypt实现都会将生成的salt包含在生成的哈希中,因此您只需要一个字段用于密码哈希,最小长度为varchar(60)
。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
String hashToStoreInDb = BCrypt.hashpw(password, BCrypt.gensalt());
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from existingHashFromDb.
Boolean isPasswordCorrect = BCrypt.checkpw(password, existingHashFromDb);