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 шт):
Это не проблема.
Ваш код сначала конвертировал массив байт test в base64 строку, а потом обратно. При этом он создал новый массив байт test3, который находится по новому адресу (но с таким же содержимым как у test). Когда вы выводите его через print, то показывается адрес массива, и для test и test3 они разные.
Если под проблемой вы понимаете, что при прямом сравнении test == test3 получаете false, то это потому, что правильно сравнивать содержимое массивов, а не ссылки: java.util.Arrays.equals(test, test3) покажет true.
Когда создается строка из массива байт, то она тоже копирует данные во внутренний массив. По-этому и там адрес отличается.
