Я генерирую сеансовый ключ, который меняется каждый раз, когда я запускаю программу. Но когда я конвертирую его в BYTE ARRAY, создается Byte Array каждый раз, когда я запускаю программу. ЭТО должно быть другим, правда? Вот мой код

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);

Почему это происходит. Мы будем благодарны за любые предложения

Первая казнь

Вторая казнь

0
Mudit 27 Май 2016 в 17:07

3 ответа

Лучший ответ

Прежде всего, код не компилируется и не запускается. Что будет (без импорта и класса)

   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() всех массивов. Следовательно, то, что ожидают Mudit и многие другие, было помещено в качестве статических методов во вспомогательный класс java.util.Arrays начиная с Java5.

0
Albrecht Weinert 27 Май 2016 в 15:03

Я бы использовал DatatypeConverter, я использовал его в своем проекте безопасности, и он работал как шарм ...

0
RicardoVallejo 27 Май 2016 в 16:36

Вы не можете полагаться на вызов toString() байтового массива для проверки его содержимого. Возвращаемое значение не сообщает вам, что это за байты.

Если вы действительно хотите проверить содержимое байтового массива и посмотреть, изменяется оно или нет, используйте вместо этого Arrays.toString(byteArray). И тогда вы сможете убедиться, что байтовый массив действительно изменился.

2
sstan 27 Май 2016 в 15:02