【问题标题】:Need help removing strange characters from string需要帮助从字符串中删除奇怪的字符
【发布时间】:2009-07-17 19:55:18
【问题描述】:

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

【问题讨论】:

    标签: java notepad++


    【解决方案1】:

    出现奇怪的字符是因为加密签名产生的是字节而不是字符串。因此,如果你想要一个可打印的表示,你应该Base64 encode it (here's a public domain implementation for 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
    

    【讨论】:

    • 从技术角度来看,签名的 base64 转换是否仍然是有效的签名?
    • 它将包含所有数据,这很重要。在使用它来检查签名的有效性之前,必须反转 base64 编码。
    • 我在将 base64 转换再次更改为签名时遇到问题,我已经更新了我的初始帖子
    【解决方案2】:

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

    【讨论】:

    • 我是否对签名字节数组进行base64转换?
    【解决方案3】:

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

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

    【讨论】:

    • “摆脱”加密签名中的数据很少是一个好主意......我强烈怀疑这是一个更根本的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多