在数据库中存储盐 - 字符还是二进制?

时间:2014-02-01 16:50:38

标签: java mysql cryptography salt

我已经设置了一个相当基本的密码哈希和盐析系统,用于在我的数据库中保存密码。它工作正常,但我不太确定如何储存盐。

目前我正在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();
    }
}

1 个答案:

答案 0 :(得分:3)

您没有将字节转换为字符串。您在toString()上调用byte[],它返回数组的类型([B),后跟@符号和数组的hashCode。

使用base 64或Hex编码将字节转换为可打印的字符串。