Java 如何从PBKDF2密码生成的字节数组中获取字符串

Java 如何从PBKDF2密码生成的字节数组中获取字符串,java,security,pbkdf2,Java,Security,Pbkdf2,我使用的解决方案来自: 问题是,当我这样做时: System.out.println(new String(getEncryptedPassword(p,s,i,l))); 我得到一个非常奇怪的字符串,类似于���:,但我想要一个可以保存在DB中的普通字符串。我的错误是什么?如果您想将二进制数据(如字节[]转换为字符串,通常将其编码为十六进制或Base64格式。Base64比十六进制小,因此我建议您使用这个 对于Base64,您可以使用java.util.Base64,因为java 8: St

我使用的解决方案来自:

问题是,当我这样做时:

System.out.println(new String(getEncryptedPassword(p,s,i,l)));

我得到一个非常奇怪的字符串,类似于
���:,但我想要一个可以保存在DB中的普通字符串。我的错误是什么?

如果您想将二进制数据(如
字节[]
转换为字符串,通常将其编码为十六进制或Base64格式。Base64比十六进制小,因此我建议您使用这个

对于Base64,您可以使用
java.util.Base64
,因为java 8:

String base64encoded=Base64.getEncoder().encodeToString(getEncryptedPassword(p,s,i,l))

对于
Hex
AFAIR,Java不包含必要的代码。您可以使用,例如,来自:


String hexEncoded=Hex.encodeHexString(getEncryptedPassword(p,s,i,l))

如果要将二进制数据(如
字节[]
转换为字符串,通常将其编码为十六进制或Base64格式。Base64比十六进制小,因此我建议您使用这个

对于Base64,您可以使用
java.util.Base64
,因为java 8:

String base64encoded=Base64.getEncoder().encodeToString(getEncryptedPassword(p,s,i,l))

对于
Hex
AFAIR,Java不包含必要的代码。您可以使用,例如,来自:


String hexEncoded=Hex.encodeHexString(getEncryptedPassword(p,s,i,l))

谢谢您的回答。我在编写时使用Base64,得到的是普通字符串。唯一的问题是我将长度(l)传递为128,但得到长度为172的Base64编码字符串。如何解释?Base64编码的消息总是较长,因为字符串中只能使用可打印字符(以免浪费一些位)。十六进制编码的长度甚至更长:是输入长度的两倍。如果您想将数据保持在最小值,请不要对其进行编码,并将
字节[]
保存为数据库中的
BLOB
VARBINARY
(如果这些类型中的一种支持列类型)。您可以说-我的错误是PBEKeySpec接受(二进制)字节而不是字符串,还返回字节而不是字符串。但是我试着用这些字节中的字符制作
普通的
字符串。我说的对吗?PBEKeySpec的输入完全不相关。它总是输出一个字节[],这正是它的设计目的。是的,您尝试将二进制数据直接解释为字符串的字节[]。对于真正的二进制数据,这是行不通的。非常感谢您的详细解释。对于十六进制编码,我发现请参见printHexBinary。谢谢您的回答。我在编写时使用Base64,得到的是普通字符串。唯一的问题是我将长度(l)传递为128,但得到长度为172的Base64编码字符串。如何解释?Base64编码的消息总是较长,因为字符串中只能使用可打印字符(以免浪费一些位)。十六进制编码的长度甚至更长:是输入长度的两倍。如果您想将数据保持在最小值,请不要对其进行编码,并将
字节[]
保存为数据库中的
BLOB
VARBINARY
(如果这些类型中的一种支持列类型)。您可以说-我的错误是PBEKeySpec接受(二进制)字节而不是字符串,还返回字节而不是字符串。但是我试着用这些字节中的字符制作
普通的
字符串。我说的对吗?PBEKeySpec的输入完全不相关。它总是输出一个字节[],这正是它的设计目的。是的,您尝试将二进制数据直接解释为字符串的字节[]。对于真正的二进制数据,这是行不通的。非常感谢您的详细解释。有关十六进制编码,请参阅printHexBinary。
System.out.println(new String(getEncryptedPassword(p,s,i,l)));