【问题标题】:getByte() is returning same byte[ ] for different StringsgetByte() 为不同的字符串返回相同的字节 []
【发布时间】:2016-09-25 22:00:15
【问题描述】:

我正在生成一个会话密钥,每次运行程序时都会更改。 但是当我将它转换为字节数组时,每次运行程序时生成的字节数组都是相同的。 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[]。它仍然返回相同的结果。

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

【问题讨论】:

  • 你能给我们完整的代码吗?我看不到测试来自哪里
  • 请提供该问题的完整最小示例。您提供的代码几乎是一个工作示例,但不完全是。我假设对test 的引用应该是test2 ("yadav"),并且代码按我预期的那样运行——也就是说,不是你所描述的。所以请提供一个工作示例。
  • 您知道字节数组上的toString() 实际上并没有打印出字节内容,对吧?那么,您在查看什么来确定字节数组始终相同?请发布您的输出。
  • 是的 IN String test2="yadav";当我将其更改为 String test2="yadav1234";
  • 它仍然为两个字符串返回相同的字节 [] .. 应该不同吧?

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


【解决方案1】:

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

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

【讨论】:

  • 当我使用 Arrays.toString(byteArray) ... 它会发生变化,但我必须对其进行加密并将其传递为该字节 [] 格式,因此返回的加密对于每个会话密钥都有正确的结果每次执行程序时生成
【解决方案2】:

首先,代码不会编译也不会运行。什么将(省略导入和类)是

   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 中。

【讨论】:

  • 当我使用 Arrays.toString(byteArray) ... 它会发生变化,但我必须对其进行加密并将其传递为该字节 [] 格式,因此返回的加密对于每个会话密钥都有正确的结果每次执行程序时生成
【解决方案3】:

我会使用 DatatypeConverter 我已经在我的安全项目中使用过它,它就像一个魅力......

【讨论】:

  • 只用Base64. 不需要用晦涩的DatatypeConverter
  • 公平回答 erikson,但它只是另一个转换器
  • 它们真的不等价。 Base64 被设计和支持作为任何 base-64 要求的解决方案,具有可配置的行长和空白处理、多个标准化符号集等。
  • @erickson 我想加密那个字节 [ ] 。所以如果我使用 byte[].toString() 然后使用会话密钥对其进行加密。会错吗?
  • 因为我不知道如何在 java 中使用会话密钥加密字节 []
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多