【问题标题】:salt created by Java SecureRandom has different getBytes() value [duplicate]Java SecureRandom 创建的盐具有不同的 getBytes() 值[重复]
【发布时间】:2023-03-13 18:37:01
【问题描述】:

我使用 java SecureRandom 创建盐来加密用户。但是,当我尝试用盐和密码匹配用户时,他们在不同的机器上失败了。用户是在 Linux 测试机器上创建的,我将数据库复制到我的 OS X 机器上。匹配在测试机器上成功,但在我的 OS X 上失败。

相同的盐使用以下代码得到不同的字节,甚至长度不同:

salt.getBytes()

这是盐的生成过程:

        SecureRandom random = new SecureRandom();
        byte bytes[] = new byte[20];
        random.nextBytes(bytes);
        String salt = new String(bytes);
        user.setSalt(salt);

getBytes() 是否有可能在不同机器上对相同的盐有不同的值?

【问题讨论】:

    标签: java security salt


    【解决方案1】:

    不要那样做:String salt = new String(bytes);

    您正在使用机器的默认编码将一系列字节转换为字符串。您应该将字节数组保留为字节数组。

    如果您将数据存储在数据库中,则可以将其存储在二进制字符串列中(例如 postgresql 中的字节 - 可能是其他数据库中的 blob)。

    【讨论】:

    • 我明白了,所以,如果我不想更改 salt 数据类型,我可以只给一个字符集,比如 'utf-8' 作为 `new String(bytes ,'utf-8') 解决方法?
    • @RyanZhu 并非所有字节序列都可以编码为有效的 UTF_8 字符串,因此这也不起作用。你的盐不是一个字符串,所以没有理由把它放在一个字符串中......试试这个例如:byte[] b = {-128}; byte[] b2 = new String(b, UTF_8).getBytes(UTF_8); System.out.println(Arrays.toString(b2));
    • 另见我刚刚发布的重复问题和这个:stackoverflow.com/questions/16853957/…
    【解决方案2】:

    根据String.getBytes()

    getBytes() 使用 平台的默认字符集,将结果存储到一个新的字节数组中。

    因此,如果您在机器上使用不同的字符集,结果会有所不同。

    【讨论】:

    • 对,我在这里看到了问题..
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2023-04-10
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多