如何基于数据签名,但根据Java中的哈希验证



如何根据数据计算RSA签名,但根据数据的哈希(反之亦然)验证该签名?签名/验证 data 内部仅哈希数据,然后在哈希上运行,在其他平台上我可以完成此操作。但是我想,在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

您必须先于围绕哈希值构建PKCS#1 V1.5填充(正式命名为EMSA-PKCS1-V1_5)。只有在那之后才能使用"NONEwithRSA"工作。

当然,您可以作弊并查看Bouncycastle或Java的GPL版本的来源。另外,您可以使用Bouncycastle轻量级API,但是您会与JCA兼容并添加依赖项。

JavaCard确实具有创建哈希牌外卡的功能。在旨在在完整的PC上运行的库中,这种功能不太需要太多(我在Java 7类中也没有找到它)。

最新更新