RSA сигнатура. Одинаковые строки, разные байты

Я хочу создать сигнатуру с помощью приватного ключа. Все отлично без ошибок.
Но когда я превращаю байты в строку, то все байты изменяются на другие.

public byte[] sign(byte[] b) throws Exception {
    Signature privateSignature = KeyUtils.generateSignature();
    privateSignature.initSign(this.privateKey);
    privateSignature.update(b);

    return privateSignature.sign();
}

public static String encodeWithoutPadding(byte[] bytes) {
    return Base64.getEncoder().withoutPadding().encodeToString(bytes);
}


public static byte[] stringToByte(String str) {
    return Base64.getDecoder().decode(s);
}

// public static byte[] stringToByte(String str) { // Также пробовал вот так
//     return encodeWithoutPadding(Base64.getDecoder().decode(s));
// }



public static void main(String[] args) throws Exception {
   byte[] test = p.sign("Hello");
   String test2 = Base64.getEncoder().encodeToString(test);
   byte[] test3 = stringToByte(test2)
   String test4 = Base64.getEncoder().encodeToString(test3);

   System.out.println(test); // -> [B@50134894
   System.out.println(test2); // -> ho+UXjXOWvDkvCJrDRj6Z4/gQ1hrvjvqq...
   System.out.println(test3); // -> [B@2957fcb0
   System.out.println(test4); // -> ho+UXjXOWvDkvCJrDRj6Z4/gQ1hrvjvqq...
}

введите сюда описание изображения

Как видим строки одинаковые, но байты разные.

В чем может быть проблема?


Ответы (1 шт):

Автор решения: Roman Konoval

Это не проблема.

Ваш код сначала конвертировал массив байт test в base64 строку, а потом обратно. При этом он создал новый массив байт test3, который находится по новому адресу (но с таким же содержимым как у test). Когда вы выводите его через print, то показывается адрес массива, и для test и test3 они разные.

Если под проблемой вы понимаете, что при прямом сравнении test == test3 получаете false, то это потому, что правильно сравнивать содержимое массивов, а не ссылки: java.util.Arrays.equals(test, test3) покажет true.

Когда создается строка из массива байт, то она тоже копирует данные во внутренний массив. По-этому и там адрес отличается.

→ Ссылка