用Java验证hmac sha1签名

用Java验证hmac sha1签名,java,digital-signature,hmac,hmacsha1,Java,Digital Signature,Hmac,Hmacsha1,我想知道如何验证我创建的签名。我创建签名的代码与以下代码类似: 我发送消息、签名和公钥来验证签名。使用KeyPairGenerator生成公钥和私钥。如何使用公钥验证签名?或者,您可以推荐一些好的Java库,用于签名和验证使用HMAC SHA1的签名吗?首先要澄清的是,代码不会生成签名。它是一种类型的 后一个链接通过以下方式解释签名和MAC之间的区别: MAC不同于数字签名,因为MAC值都是生成的 并使用相同的密钥进行验证。这意味着发送方 在启动之前,消息的接收者必须同意相同的密钥 通信,如对称

我想知道如何验证我创建的签名。我创建签名的代码与以下代码类似:

我发送消息、签名和公钥来验证签名。使用KeyPairGenerator生成公钥和私钥。如何使用公钥验证签名?或者,您可以推荐一些好的Java库,用于签名和验证使用HMAC SHA1的签名吗?

首先要澄清的是,代码不会生成签名。它是一种类型的

后一个链接通过以下方式解释签名和MAC之间的区别:

MAC不同于数字签名,因为MAC值都是生成的 并使用相同的密钥进行验证。这意味着发送方 在启动之前,消息的接收者必须同意相同的密钥 通信,如对称加密。同样 原因是,互委会不提供 特别是在网络范围内共享秘密的情况下的签名 密钥:任何能够验证MAC的用户也能够生成MAC 其他信息。相反,生成的是数字签名 使用密钥对的私钥,即非对称加密。 由于此私钥仅可由其持有者访问,因此 签名证明一份文件的签字人正是那个人 持有人因此,数字签名确实提供了不可否认性。然而, 安全绑定密钥的系统可以提供不可否认性 MAC密钥的使用信息;同一把钥匙有两把 人,但其中一个有一个可以用于MAC的密钥副本 当另一个在硬件中具有密钥副本时生成 仅允许MAC验证的安全模块。这是常见的 在金融业做过

因此,为了验证HMAC,您需要共享用于生成它的密钥。您将发送消息HMAC,并且接收者将拥有与生成HMAC相同的密钥。然后,他们可以使用相同的算法从您的消息生成HMAC,它应该与您发送的HMAC匹配。公钥/私钥(非对称)不用于此目的。您需要生成对称密钥(如AES),并与将生成/验证HMAC的人员安全地共享该密钥

这将HMAC限制为仅具有
完整性
真实性
属性,而不具有
不可抵赖性

上面的引文提到,可以使用硬件安全模块强制使用密钥,然后您可以获得不可否认性,只要只有一个人可以使用密钥生成HMAC

或者,您可以使用混合方法。使用共享对称密钥生成HMAC。最后的HMAC是一个散列。然后,您可以使用私钥(与HMAC中使用的密钥不同)对此哈希进行签名。使用对称密钥和您的公钥的第三方可以验证您是否签署了HMAC,并且可以使用消息和共享密钥生成他们自己的HMAC,以确保其匹配。这也会给你不可抵赖性

如果您想走这条路,请使用Java类。HMAC算法是SHA-1,假设您的密钥对是RSA,您可以使用
NONEwithRSA
签名算法,因为输入已经是SHA-1哈希。或者您可以使用
SHA1withRSA
算法再次散列它。只要生成签名并使用相同的算法进行验证,就应该可以了

    byte[] data = hmac.getBytes("UTF-8");

    Signature mySig = Signature.getInstance("NONEwithRSA");

    mySig.initSign(myPrivateKey);

    mySig.update(data);

    byte[] sigBytes = mySig.sign();

    // And to verify.

    Signature mySig2 = Signature.getInstance("NONEwithRSA");

    mySig2.initVerify(myPublicKey);

    boolean isSigValid = mySig2.verify(sigBytes);

很好的解释。为了让它工作,我需要在调用mySig2.verify(sigBytes)之前添加mySig2.update(数据)。我也被HMAC verify弄糊涂了。这篇文章帮助我理解。谢谢!!!