байт до строки и наоборот - PullRequest
       32

байт до строки и наоборот

4 голосов
/ 15 февраля 2012

Мне нужно преобразовать случайно сгенерированное значение соли и сохранить его в базе данных.Чтобы сохранить его в базе данных, я преобразовал его в строку.Затем для получения исходного значения я конвертирую его обратно в байт.Но оба значения не совпадают.Я пробовал "UTF-8", "UTF-16", BASE64Encoder.

SecureRandom ranGen = new SecureRandom();
byte[] aesKey = new byte[16]; // 16 bytes = 128 bits
ranGen.nextBytes(aesKey);   
System.out.println(aesKey);

String a=new String(aesKey,"UTF-16");
byte[] b=new byte[16];
b=a.getBytes("UTF-16");
System.out.println(b);

Выходы для вышеуказанного кода (выполнено 2 раза):

[B@11563ff
[B@1581593

и

[B@170888e
[B@11563ff

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Вы действительно должны использовать Base64 для преобразования двоичных данных в строки. Доступно множество бесплатных реализаций, например, найденных в Кодек Apache Commons .

Кроме того, его действительно легко использовать, например:

Для кодирования:

import org.apache.commons.codec.binary.Base64;
...
byte[] abValue = {...}; // Your data to encode
Base64 base64 = new Base64();
String strEncodedData = base64.encodeToString(abValue).trim();

Для декодирования:

import org.apache.commons.codec.binary.Base64;
...
String strEncodedData = "..."; // Your previously encoded data
Base64 base64 = new Base64();
byte[] abValue = base64.decode(strValue);
4 голосов
/ 15 февраля 2012

Поскольку ваш код написан выше, печатая aesKey, а затем b, вы фактически печатаете вывод метода toString для объекта массива, который является просто методом Object toString по умолчанию.Поэтому я не понимаю, как вы можете ожидать, что они будут одинаковыми.

Если вы действительно хотите проверить, что они одинаковы, вы должны сравнить их побайтно.

С точки зрения вашегоНа самом деле вопрос о сохранении байта [] в виде строки в БД, лучше всего его кодировать в Base64.Для этого я бы предложил использовать библиотеку кодеков Apache Commons.См. руководство пользователя .

РЕДАКТИРОВАНИЕ:

Используя BASE64Encode и BASE64Decoder, на которые вы ссылались, код будет выглядеть так:

    SecureRandom ranGen = new SecureRandom();
    byte[] aesKey = new byte[16]; // 16 bytes = 128 bits
    ranGen.nextBytes(aesKey);
    String a = new BASE64Encoder().encode(aesKey);

    System.out.println(a);

    byte[] b = new BASE64Decoder().decodeBuffer(a);
    System.out.println(new BASE64Encoder().encode(b));

    for (int i = 0; i < aesKey.length; i++) {
        System.out.println(aesKey[i] + " " + b[i]);
    }

Здесь я также просмотрел байты по отдельности, чтобы показать, что они действительно равны.

...