我正在尝试使用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.c1#وٴE8af8t〜W {%\ž #itҽ; NKN {U>&安培; D_&安培;伍 ž\ KGE〜S4ƎGgU:S取代; I%YLn3Y9T }的Usb急症շѾUrYڝ[JH〜亩\ 3UjcUactNo-1J B]
private.pem是使用此命令生成的
openssl req -new -x509 -days 3652 -nodes -out private.crt -keyout private.pem.
非常感谢任何帮助或提示。
解决
我所做的是使用此行将de byte array编码为Base64
byte[] encodedArray = org.bouncycastle.util.encoders.Base64.encode(signedArray);
和voalá!
答案 0 :(得分:2)
您的签名是byte[]
,它不是字符串。尝试将字节数组视为字符串可以为您提供所找到的内容。保留签名并将其存储为字节数组,或者将字节数组转换为字符串兼容格式,例如Base64。 Java 8包含Base64
类,它将为您进行转换。如果你确实使用Base64,那么记得在检查签名之前转换回字节。