0

我目前正在尝试实现密码哈希生成器。但首先,我试图像这样对随机生成的盐进行编码:

public static byte[] generateSalt()
        throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[8];
    random.nextBytes(salt);
    return salt;
}

我如何将其编码为十六进制,然后将其解码为原始状态?我只想向用户显示生成的盐的十六进制值,以便他可以在身份验证部分对其进行解码。当然,这是为了学习目的。

我目前拥有的

我试过这个:

    try {
        byte[] new_salt;
        String salt_str;
        new_salt = PasswordHash.generateSalt();
        for(int i = 0; i < 8; i++) {
            salt_str += new_salt[i];
        }
        out_new_salt.setText(salt_str);
    }
    catch (Exception e) {
        System.out.print(e.getStackTrace() + "Something failed");
    }

输出如下所示:67-55-352712114-12035 好吧,我可以得到每个字节的内容。我尝试使用 Base 64 编码器,但它打印未知字符,我认为这是因为字节数组的内容具有 2exp8 的值范围。我尝试使用:

System.out.println(new String(new_salt));

但它也会打印未知值。使用 Charset.forName("ISO-8859-1") 和 Charset.forName("UTF-8") 但它不起作用。UTF-8 打印未知字符,而 ISO-8859-1 奇怪地工作,但打印的数字不如字节数组的大小( 8 )我认为 hexa 最适合我想做的事情。

4

1 回答 1

-1

我终于找到了我想要的东西。这是我在这里找到的一个简单功能:

如何在 Java 中将字节数组转换为十六进制字符串? 这在我的情况下非常有效。

这是功能:

private final static char[] hexArray = "0123456789ABCDEF".toCharArray();

public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

这看起来像这样: 在此处输入图像描述

于 2018-02-04T19:21:36.327 回答