getByte() возвращает один и тот же байт [ ] для разных строк
Я генерирую ключ сеанса, который меняется каждый раз, когда я запускаю программу. Но когда я конвертирую его в 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[]. Тем не менее он возвращает тот же результат.
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);
Почему это происходит. Любые предложения будут оценены
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.
Вы не можете полагаться на звонок toString()
на байтовом массиве для проверки его содержимого. Возвращаемое значение не говорит вам, что байты.
Если вы действительно хотите проверить содержимое байтового массива и посмотреть, изменяется он или нет, используйте Arrays.toString(byteArray)
вместо. И тогда вы сможете убедиться, что байтовый массив действительно изменяется.
Я бы использовал DatatypeConverter, я использовал его с моим проектом безопасности, и он работал как шарм...