Java 字节数组到字符串返回null
我正在写一个加密数据的程序。 我以这种方式创建了一个随机IV:Java 字节数组到字符串返回null,java,string,encryption,byte,Java,String,Encryption,Byte,我正在写一个加密数据的程序。 我以这种方式创建了一个随机IV: byte[] ivBytes = new byte[16]; IvParameterSpec iv = new IvParameterSpec(ivBytes); 然后用它来做密码。 现在我想将这个IV存储在一个配置文件中,这样我就可以将它传输到解密函数,为此我需要将IV转换为字符串格式 我使用了byte curIV[]=cipher.getIV()获取IV并将其值打印到控制台,但当我将其转换为字符串时, 这样stringivst
byte[] ivBytes = new byte[16];
IvParameterSpec iv = new IvParameterSpec(ivBytes);
然后用它来做密码。
现在我想将这个IV存储在一个配置文件中,这样我就可以将它传输到解密函数,为此我需要将IV转换为字符串格式
我使用了byte curIV[]=cipher.getIV()
获取IV并将其值打印到控制台,但当我将其转换为字符串时,
这样stringivstring=新字符串(curIV)代码>,它不返回任何内容
byte[] ivBytes = new byte[16];
这将创建一个初始化为0
的16字节数组0x00
不是可打印字符(它是a),因此您可能无法看到打印的字符(打印时出现问题或查看打印结果时出现问题)
根据您的需要,您可能需要:
- 按照@TmTron的建议,使用
Arrays.toString()
打印它(但如果希望在某些程序中无法正确看到打印的结果,则需要hexa viewer才能正确查看)
- 以十六进制表示形式打印
- 使用
您的代码工作正常
数组初始化为16
,其中每个16
字节都是0
现在,让我们看看ascii表,找到0
的正确字符
啊哈,0
的字符是characterNUL
如果执行新字符串(cipher.getIV())代码>您将成为不包含任何信息的有效字符串值
如何解决
只需将大小为16的字符串转换为字节
byte[] ivBytes = "123456789abcdef".getBytes();
安全
计算机在计算方面很好,但在随机值方面很差。随机值很难估计。这使得随机值对于安全性非常重要。这使得16x0字节数组不是一个好主意
配置
最后,您需要将该信息存储到配置中。嗯,因为这个字符不是可读字符,所以很难将它保存到基于文本的配置中
注重安全性,不应允许16x0 IVs。因此,16x0 IVs不能存储到配置中
建议
改用这个:
String ivString = "blahblah"; // read from configuration if required
IvParameterSpec iv = new IvParameterSpec(ivString.getBytes());
ivString = new String(iv.getIV()); //write to configuration if required
嘿,什么是IV?你好,IV是一个初始化向量,它作为一个参数传递给密码。您可以在这里阅读更多内容-字节数组可能包含不可打印的字符-您可以使用-看到这一点,但您希望它有什么?我没有看到任何代码向字节添加任何值array@LenosVbytearray在数组中初始化为16x0。这是一个有效的静脉注射,但不是很安全!那么您建议将IV中的字节限制为字母数字/可打印字符值?这会不会将可能的组合从2^128
减少到95^16
~2^112
?@JiriTousek是的,它确实减少了(95^16??)。安全性将得到提高,因为您必须使用IV>0
。但它确实违反了真理的单一版本,即不清楚是谁定义了IV的值范围:规范还是Impl。在我看来,如果规范sais0
是一个有效的、原子的、真实的值(如此好的值),那么我希望Impl更清楚:D。问题确实是IV的错误初始化,谢谢!你的建议很好。但是,关键是调用0x00任何类型的字符都没有意义。非文本不是文本。