【问题标题】:Storing salt in database - Char or Binary?在数据库中存储盐 - 字符还是二进制?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 啊,我明白了。我目前正在做的不是坏习惯吗?我需要将其存储为 base64 还是 hex,还是可以按原样存储?
    • 这不是坏习惯。这是完全错误的。重新阅读我的答案。该字符串不代表数组中包含的字节。如果数组中有 100 万字节,您仍然会得到 [B@5367478。当然也没有办法将[B@5367478 转回原来的一百万长度数组,因为[B@5367478 justs 说:这个对象是字节数组类型,并且有一个 hashCode(即内存中的地址,过于简化),其值为 5367478。
    • 最好的选择可能是将字节直接存储在二进制数据类型中。与 base64 或 hex 相比,这节省了一些空间(尽管节省的空间可能很小)。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2011-11-18
    • 2011-04-26
    相关资源
    最近更新 更多