当前位置: 首页 > 知识库问答 >
问题:

signature.verify()在java中返回false

万俟渝
2023-03-14

首先,我看到有其他帖子也有这个问题,但没有人有和我一样的问题,即签名。verify()意外返回了false。

这是我的代码:

private static String encriptar(String xmlSolicitud, PrivateKey privateKey)
        throws Exception {

    Signature signature=Signature.getInstance("SHA1withRSA");
    signature.initSign(privateKey);
    signature.update(xmlSolicitud.getBytes(Charset.forName("UTF-8")));
    byte[] signatureValue = signature.sign();
    String response = Base64.encode(signatureValue);
    signature.initVerify(keyReader.publicKeyRead(Reference.rutaPublicKeyTest));
    System.out.println(signature.verify(signatureValue));
    return response;
}

下面是我如何读入键(如果需要):

public static PrivateKey privateKeyRead(String filename)
        throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {

    File f = new File(filename);
    FileInputStream fis = new FileInputStream(f);
    DataInputStream dis = new DataInputStream(fis);
    byte[] keyBytes = new byte[(int)f.length()];
    dis.readFully(keyBytes);
    dis.close();

    PKCS8EncodedKeySpec spec =
                new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(spec);
}

public static PublicKey publicKeyRead(String filename)
        throws Exception {

    File f = new File(filename);
    FileInputStream fis = new FileInputStream(f);
    DataInputStream dis = new DataInputStream(fis);
    byte[] keyBytes = new byte[(int)f.length()];
    dis.readFully(keyBytes);
    dis.close();

    X509EncodedKeySpec spec =
                new X509EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePublic(spec);
}

共有1个答案

酆茂才
2023-03-14

调用ign后,签名的状态会重置。根据留档:

对此方法的调用将此签名对象重置为之前通过调用initSign(Private ateKey)进行签名时的状态。也就是说,对象被重置并可用于从同一签名者生成另一个签名,如果需要,通过对updateign的新调用。

您需要使用签名的字节再次更新签名:

private static String encriptar(String xmlSolicitud, PrivateKey privateKey)
        throws Exception {

    Signature signature=Signature.getInstance("SHA1withRSA");
    signature.initSign(privateKey);
    signature.update(xmlSolicitud.getBytes(Charset.forName("UTF-8")));

    byte[] signatureValue = signature.sign();
    String response = Base64.encode(signatureValue);

    signature.initVerify(keyReader.publicKeyRead(Reference.rutaPublicKeyTest));
    signature.update(xmlSolicitud.getBytes(Charset.forName("UTF-8"))); // <-- Here

    System.out.println(signature.verify(signatureValue)); // <-- Will print true

    return response;
}

另一方面,看起来您正在对XML内容进行签名。使用XML签名避免被规范化问题绊倒可能是明智的。

 类似资料:
  • 问题内容: 我正在尝试在Java程序中阅读标准输入。我期望一系列数字后跟换行符,例如: 当通过eclipse内置控制台提供输入时,一切都会顺利进行。但是,使用Windows命令行时,程序将输出: 我的代码是: 有什么线索吗? 问题答案: 得到a 表示相关对象已到达EOF(文件末尾),或者换句话说,它们无法再获得任何标准输入。现在,您的代码明显的问题是: 的每个方法调用都会创建一个 新的 。 每个这

  • 问题内容: 序言:我知道使用列表或其他集合来返回结果,但是随后我必须遍历列表以将结果取出:请参阅第二个示例 前言2:我正在寻找“ Java不支持…”之外的答案。 我正在寻找一种从Java方法调用返回多个对象的便捷方法。 有点像PHP: 我真的厌倦了在参数中传递持有者对象,例如: 然后: 如果有人想出一种优雅的方法来解决这个问题,那将非常有兴趣。 使用清单 这有两个缺点: 我必须先将清单装在房子的被

  • 问题内容: 即使正则表达式应返回true,程序也不会退出。代码有什么问题? 问题答案: 仅当整个字符串与正则表达式匹配时才返回。在你的情况下,你的正则表达式仅代表 一个 字符不是,或。 我怀疑您要检查字符串是否包含您在正则表达式中描述的这些特殊字符之一。在这种情况下,请将您的正则表达式括起来,以使正则表达式匹配整个字符串。哦,您不必逃脱character class内部。

  • 问题内容: 当我尝试从Java代码中删除tomcat服务器conf / Catalina / localhost中存在的文件时,file.delete()始终返回false。但是,如果我通过file.exists()函数检查文件,它将返回true。我没有任何例外。请帮助我们为什么会这样。有什么解决方案? 问题答案: 当我尝试从Java代码中删除tomcat服务器conf / Catalina /

  • 问题内容: 如果将来我使用setMaxAge()设置cookie,那么当我在后续请求中将cookie读回内存时,getMaxAge()会返回-1。我已经通过Chrome的设置和检查器检查了实际的cookie,并且可以验证该过期日期确实设置为将来的60天。 为什么c.getMaxAge()总是返回-1? 问题答案: 浏览器不会发送cookie属性,例如路径和过期。它仅将名称和值发送回去。如果最大期限

  • 问题内容: 我有一个自定义对话框,当我尝试获取EditText的值时,它返回null。 该行返回null 这是完整的代码。 问题答案: 尝试这个: 你必须告诉在哪个视图中找到ID。否则,它将尝试通过xml布局(通常在中声明)夸大视图中的ID。