我已经设置了一个相当基本的密码哈希和盐析系统,用于在我的数据库中保存密码。它工作正常,但我不太确定如何储存盐。
目前我正在byte[]
数组中创建它,然后将其转换为String,然后存储在数据库中。
我唯一担心的是,每个盐都以[B@
开头,例如:[B@b24f11
或[B@1e71a51
可以像这样存储它,还是应该将它作为byte[]
数组保存并将其作为二进制数据存储在数据库中?甚至做其他事情?
public class PasswordHasher {
// calculates a hash, given a password and a salt
public static String getHash(String pass, String salt) {
String hashedPassword = null;
try{
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(salt.getBytes()); //update digest to include salt
byte[] hashedBytes = md.digest(pass.getBytes());
// convert byte array to hex
StringBuilder sb = new StringBuilder();
for (int i=0;i<hashedBytes.length;i++) {
sb.append(Integer.toHexString((int) hashedBytes[i] & 0xFF));
}
hashedPassword = sb.toString();
}catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
return hashedPassword;
}
// calculates a hash, then returns both hash and salt to store in DB
public static String[] registerHashAndSalt(String pass){
String salt = getSalt();
String hashedPassword = getHash(pass, salt);
String[] hashAndSalt = {hashedPassword, salt};
return hashAndSalt;
}
// creates a random salt
private static String getSalt(){
SecureRandom sr = new SecureRandom();
byte[] salt = new byte[16];
sr.nextBytes(salt);
return salt.toString();
}
}
答案 0 :(得分:3)
您没有将字节转换为字符串。您在toString()
上调用byte[]
,它返回数组的类型([B
),后跟@
符号和数组的hashCode。
使用base 64或Hex编码将字节转换为可打印的字符串。