1

目前,当我使用 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);

给出输出

”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
4

3 回答 3

5

你是如何“制作”签名的?如果你使用这个sign方法,你会得到一个字节数组,而不是一个字符串。这不是某些文本的二进制表示,它只是任意二进制数据。这就是您应该使用的,如果您需要将其转换为字符串,您应该使用 base64 转换以避免数据损坏。

于 2009-07-17T20:03:27.160 回答
5

奇怪的字符在那里,因为加密签名产生字节而不是字符串。因此,如果您想要一个可打印的表示,您应该对它进行 Base64 编码这里是 Java 的公共域实现)。

从加密签名中去除非打印字符将使其无用,因为您将无法使用它进行验证。

更新:

[B@15356d5

这是在字节数组上调用 toString 的结果。“[”表示数组,“B”表示字节,“15356d5”是数组的地址。您应该将解码后的数组传递给 [Si​​gnature.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
于 2009-07-17T20:04:34.367 回答
0

如果我正确理解您的问题,您需要删除代码低于 32 的字符,除了 char 9(制表符)、char 10(新行)和 char 13(返回)。

编辑:我同意其他人的观点,因为处理这样​​的加密输出不是你通常想要的。

于 2009-07-17T20:04:52.617 回答