【发布时间】:2014-02-25 08:53:11
【问题描述】:
我已经建立了一个相当基本的密码散列和加盐系统,用于在我的数据库中保存密码。它工作正常,但我不太确定盐是如何储存的。
目前我在 byte[] 数组中创建它,然后将其转换为字符串,然后将其存储在数据库中。
我唯一担心的是每个盐都以[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();
}
}
【问题讨论】:
标签: java mysql cryptography salt