java - JAVA验证签名问题

标签 java

我已经实现了一个示例代码来生成哈希并签名并验证签名,如下所示: 但是,当我尝试验证签名时,它向我抛出错误。它无法验证签名。

我是否遵循正确的程序。请提出建议

我需要的实际场景是我想计算文件的哈希值,对哈希值进行签名并解密签名,这样我就可以获得可以用原始哈希值进行验证的哈希值。

您能否建议我使用 APIS,如果可能的话,请提供一个示例程序来实现这一点。

public class Temp {
    public static void main(String args[]) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, SignatureException{

        KeyPairGenerator signkeygen = KeyPairGenerator.getInstance("RSA");  
        signkeygen.initialize(2048);//The argument specifies the length of the key in bits
        KeyPair signkey = signkeygen.generateKeyPair();
        PublicKey sign_publicKey = signkey.getPublic();
        PrivateKey sign_privateKey = signkey.getPrivate();

        String test = "hai";

        Signature mysign = Signature.getInstance("SHA1withRSA");
        mysign.update(test.getBytes());
        byte[] byteSignedData = mysign.sign();
        Signature vSign = Signature.getInstance("SHA1withRSA");
        vSign.initVerify(sign_publicKey); 
        vSign.update(byteSignedData);

        boolean signStatus = vSign.verify(byteSignedData);
        System.out.println(signStatus);
        ...

最佳答案

据我所知,您需要初始化一个签名对象来指定您正在使用私钥进行签名。截至目前,您正在使用公钥进行验证,但没有使用私钥进行签名,这会在尝试验证时抛出错误。

public class Temp {
    public static void main(String args[]) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, SignatureException{

    KeyPairGenerator signkeygen = KeyPairGenerator.getInstance("RSA");  
    signkeygen.initialize(2048);//The argument specifies the length of the key in bits
    KeyPair signkey = signkeygen.generateKeyPair();
    PublicKey sign_publicKey = signkey.getPublic();
    PrivateKey sign_privateKey = signkey.getPrivate();



    Signature mysign = Signature.getInstance("SHA1withRSA");
    mysign.initSign(sign_privateKey);  //Added this line
    byte[] byteSignedData = mysign.sign();
    Signature vSign = Signature.getInstance("SHA1withRSA");
    vSign.initVerify(sign_publicKey); 


    boolean signStatus = vSign.verify(byteSignedData);
    System.out.println(signStatus);

这应该返回 true。另外,当试图找出代码的哪一部分有问题时,抛出所有异常并不是一个好主意。最好捕获它们并让每个生成不同的 println。这样你就可以知道算法的哪一部分出了问题

关于java - JAVA验证签名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7160619/

相关文章:

java - android 中的 jar 依赖项 - 未发现类定义异常

Java 定义或初始化类的属性

java - 获取 java.lang.OutOfMemoryError : GC overhead limit exceeded in Jboss

java - 当某些元素也包含逗号时,如何从逗号分隔的文本中解析元素?

java - 通过 InstallCert.java 接收服务器证书时出现 PKIX 错误

java - Spring MVC JSP JSTL 退出每个带有 boolean 值的循环

java - 如何在不输入完整路径的情况下从命令行使用 .jar

java - Hibernate 存储派生属性

代码热部署和调度jar文件部署的Java框架

java - 从 Java Web 应用程序连接到 Cisco Any Connect VPN