getByte()为不同的字符串返回相同的byte []

时间:2016-05-27 14:07:33

标签: java bytearray public-key-encryption session-keys

我正在生成一个Session密钥,每次运行程序时都会更改。 但是当我将其转换为BYTE ARRAY时,每次运行程序时生成的字节数组都是相同的。 IT应该是不同的吗? 这是我的代码

Key key;
SecureRandom rand = new SecureRandom();
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(rand);
generator.init(256);
key = generator.generateKey();
String key1=key.toString();
byte[] genratesessionKey1 = key1.getBytes();
System.out.println("SESSION KEY IS(Byte format)   "+genratesessionKey1.toString());

然后我也使用了一个虚拟字符串。然后我生成了它的Byte []。然后我改变了该字符串中的值并再次生成了Byte []。仍然会返回相同的结果。

String test2="yadav";
String key1=key.toString();
byte[] genratesessionKey1 = key1.getBytes();
byte[] g2=test.getBytes("UTF-8");
byte[] g3=test.getBytes();              
System.out.println("Session key in String   "+key1);
System.out.println("Testing Byte Format   "+g2);
System.out.println("Testing Byte Format 2   "+g3);

为什么会发生。任何建议都将受到赞赏

First Execution

Second Execution

3 个答案:

答案 0 :(得分:2)

您不能依赖于在字节数组上调用toString()来检查其内容。返回的值不会告诉您字节是什么。

如果您确实想检查字节数组的内容并查看其是否发生更改,请改用Arrays.toString(byteArray)。然后你应该能够验证字节数组确实发生了变化。

答案 1 :(得分:0)

首先,代码不会编译也不会运行。什么(省略进口和类)

   public static void main(String[] args) 
           throws NoSuchAlgorithmException, UnsupportedEncodingException {
      Key key;
      SecureRandom rand = new SecureRandom();
      KeyGenerator generator = KeyGenerator.getInstance("AES");
      generator.init(rand);
      generator.init(256);
      key = generator.generateKey();
      String key1 = key.toString();
      byte[] genratesessionKey1 = key1.getBytes();
      System.out.println("SESSION KEY IS(Byte format)   " 
                             +  genratesessionKey1.toString());

      String test2="yadav";
      byte[] g2 = test2.getBytes("UTF-8");
      byte[] g3 = test2.getBytes();              
      System.out.println("Session key in String   " + key1);
      System.out.println("Testing Byte Format   " + g2);
      System.out.println("Testing Byte Format 2   " + g3);

      System.out.println("Session key in String   "
                                     + Arrays.toString(genratesessionKey1));

   } // main(String[])

输出为

SESSION KEY IS(Byte format)   [B@1c53fd30
Session key in String   javax.crypto.spec.SecretKeySpec@fffe8e54
Testing Byte Format   [B@50cbc42f
Testing Byte Format 2   [B@75412c2f

这只是显示继承Object.toString()的数组,意思是将(无用的)地址显示为哈希值。因此,无论长度或内容如何,​​toString()都可以使所有数组看起来都相似 也许,Mudit想要看到阵列的内容。添加

System.out.println("Session key in String   "
                                     + Arrays.toString(genratesessionKey1));

产量

Session key in String   [106, 97, 118, 97, 120, 46, 99, 114, 121, ....

基本原理:向下兼容性禁止增强所有数组的toString()方法(无用,重复我)。因此,自Java5以来,Mudit和许多其他人所期望的是在辅助类java.util.Arrays中作为静态方法。

答案 2 :(得分:0)

我会使用DatatypeConverter我已将它与我的安全项目一起使用,它就像一个魅力......