如何根据数据进行签名,但是在Java中基于哈希进行验证?

时间:2014-03-09 00:36:15

标签: java hash cryptography

如何根据数据计算RSA签名,但是根据数据的哈希验证签名(和/或反之亦然)?在内部签名/验证数据只是对数据进行散列,然后对散列进行操作,在其他平台上我可以完成此操作。但在Java中,我似乎无法正确配置签名算法。

如何仅使用数据的哈希来验证签名?

这就是我所拥有的:

import java.security.*;

public class Main {
    public static void main(String[] args) throws Exception
    {
        byte[] data = new byte[] {1,2,3};

        MessageDigest digest = MessageDigest.getInstance("SHA1");
        digest.update(data);
        byte[] sha1Hash = digest.digest();

        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(512);
        KeyPair keyPair = kpg.genKeyPair();

        Signature signingInstance = Signature.getInstance("SHA1withRSA");
        signingInstance.initSign(keyPair.getPrivate());
        signingInstance.update(data);
        byte[] signature = signingInstance.sign();

        Signature dataVerifyingInstance = Signature.getInstance("SHA1withRSA");
        dataVerifyingInstance.initVerify(keyPair.getPublic());
        dataVerifyingInstance.update(data);
        boolean dataVerified = dataVerifyingInstance.verify(signature);

        Signature hashVerifyingInstance = Signature.getInstance("NONEwithRSA");
        hashVerifyingInstance.initVerify(keyPair.getPublic());
        hashVerifyingInstance.update(sha1Hash);
        boolean hashVerified = hashVerifyingInstance.verify(signature);

        System.out.println("Verification based on data: " + dataVerified);
        System.out.println("Verification based on hash: " + hashVerified);
    }
}

运行此程序的输出是:

Verification based on data: true
Verification based on hash: false

1 个答案:

答案 0 :(得分:2)

您必须首先围绕哈希值实现PKCS#1 v1.5填充(正式命名为EMSA-PKCS1-v1_5)。只有在那之后"NONEwithRSA"才能解决问题。

您当然可以欺骗并查看BouncyCastle或Java的GPL版本的来源。或者,您可以使用BouncyCastle轻量级API,但是您将失去与JCA的兼容性并添加依赖项。

JavaCard确实具有创建哈希卡的功能。想要在全功能PC上运行的库中不需要这种功能(我也没有在Java 7类中找到它)。