ตัวละครแปลก ๆ ของ BouncyCastle ใน String พร้อมลายเซ็น

ฉันกำลังพยายามเซ็นชื่อสตริงโดยใช้ไลบรารี BouncyCastle รหัสของฉันใช้งานได้ แต่สตริงผลลัพธ์เต็มไปด้วยอักขระแปลก ๆ และสัญชาตญาณของฉันก็บอกว่ามีบางอย่างผิดปกติ รหัสของฉันมีลักษณะเช่นนี้

Security.addProvider(new BouncyCastleProvider());
FileReader fileReader = new FileReader(new File("certs/private.pem"));
PEMReader r = new PEMReader(fileReader);
PrivateKey privateKey = (PrivateKey) r.readObject();
r.close()
String toSign = "hello world";
Signature signature = Signature.getInstance("SHA1withRSA","BC");
signature.initSign(privateKey);
signature.update(toSign.getBytes("UTF-8"));
byte[] signedArray = signature.sign();
String signedString = new String(signedArray, "UTF-8");

และสตริงผลลัพธ์ (signedString) มีลักษณะ (แย่มาก) เช่นนี้:

�����jc.������c�1�#�ٶ����E8����a��f8���t�~W�{%��\Z#�� มัน��ҽ;��n��k�n{U>&�d�_���&��?��g� z\�k�g���e~�S4���G�g ��U�:��s>i�%YL�n3�������Y��9����T���}�Usb�&����eշѾUr�Y�ڝ[ j�h~mu\3U��j���c�U�ac����t��ไม่-��1J�B]�

private.pem ถูกสร้างขึ้นด้วยคำสั่งนี้

openssl req -new -x509 -days 3652 -nodes -out private.crt -keyout private.pem. 

ความช่วยเหลือหรือคำแนะนำใด ๆ จะได้รับการชื่นชมอย่างมาก

แก้ไขแล้ว

สิ่งที่ฉันทำคือเข้ารหัสอาร์เรย์เดอไบต์เป็น Base64 โดยใช้บรรทัดนี้

byte[] encodedArray = org.bouncycastle.util.encoders.Base64.encode(signedArray); 

และว้าว!


person cgajardo    schedule 24.09.2015    source แหล่งที่มา
comment
นี่เป็นเรื่องปกติอย่างสมบูรณ์ บางทีคุณอาจต้องการเข้ารหัสอาร์เรย์ไบต์ก่อนที่จะพิมพ์   -  person Artjom B.    schedule 24.09.2015
comment
คุณหมายถึงสิ่งที่แตกต่างจาก: new String(signedArray, UTF-8) ?   -  person cgajardo    schedule 24.09.2015


คำตอบ (1)


ลายเซ็นของคุณคือ byte[] ไม่ใช่สตริง ความพยายามที่จะปฏิบัติต่ออาร์เรย์ไบต์เหมือนกับสตริงจะให้สิ่งที่คุณพบ เก็บรักษาและจัดเก็บลายเซ็นเป็นอาร์เรย์ไบต์ หรือแปลงอาร์เรย์ไบต์เป็นรูปแบบที่เข้ากันได้กับสตริง เช่น Base64 Java 8 มีคลาส Base64 ซึ่งจะทำการแปลงให้กับคุณ หากคุณใช้ Base64 อย่าลืมแปลงกลับเป็นไบต์ก่อนที่จะตรวจสอบลายเซ็น

person rossum    schedule 24.09.2015