目前,当我使用java.security.signature进行签名时,它会传回一个字符串.我似乎无法使用这个字符串,因为只有当我将字符串复制到notepad ++时才能看到特殊字符,如果我删除这些特殊字符,我可以使用我程序中字符串的剩余部分.
在记事本中,它们看起来像黑盒子,上面写着ACK GS STX SI SUB ETB BS VT
我真的不明白它们是什么,所以很难说如何驾驭它们.
是否有一个函数可以运行以删除这些和可能类似的字符?
当我使用帖子中提供的base64类时,我不能回到签名
System.out.println(signature);
String base64 = Base64.encodeBytes(sig);
System.out.println(base64);
String sig2 = new String (Base64.decode(base64));
System.out.println(sig2);
Run Code Online (Sandbox Code Playgroud)
给出输出
”zÌý¥y]žd”xKmËY³ÕN´Ìå}ÏBÊNÈ›`Αrp~jÖüñ0…Rõ…•éh?ÞÀ_û_¥ÂçªsÂk{6H7œÉ/”âtTK±Ï…Ã/Ùê²
lHrM/aV5XZ5klHhLbctZs9VOtMzlfc9Cyk7Im2DOkXJwfmoG1vzxMIVS9YWV6Wg/HQLewF/7X6XC56pzwmt7DzZIN5zJL5TidFRLsc+Fwy/Z6rIaNA2uVlCh3XYkWcu882tKt2RySSkn1heWhG0IeNNfopAvbmHDlgszaWaXYzY=
[B@15356d5
Run Code Online (Sandbox Code Playgroud)
你是如何"制作"签名的?如果使用该sign方法,则返回一个字节数组,而不是字符串.这不是某些文本的二进制表示,它只是任意二进制数据.这就是你应该使用的,如果你需要将它转换为字符串,你应该使用base64转换来避免数据损坏.
奇数字符在那里因为加密签名产生字节而不是字符串.因此,如果你想要一个可打印的表示,你应该对其进行Base64编码(这里是Java的公共域实现).
从加密签名中剥离非打印字符将使其无效,因为您将无法使用它进行验证.
更新:
[B @ 15356d5
这是在字节数组上调用toString的结果."["表示数组,"B"表示字节,"15356d5"表示数组的地址.您应该将解码后的数组传递给[Signature.verify](http://java.sun.com/j2se/1.4.2/docs/api/java/security/Signature.html#verify(byte [ ])).
就像是:
Signature sig = new Signature("dsa");
sig.initVerify(key);
sig.verify(Base64.decode(base64)); // <-- bytes go here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4076 次 |
| 最近记录: |