繁体   English   中英

在Java中验证hmac sha1签名

[英]Verifying hmac sha1 signature in Java

我想知道如何验证我创建的签名。 我创建签名的代码看起来与此类似: HMAC-SHA1:如何在Java中正确执行?

我发送消息,签名和公钥来验证签名。 使用KeyPairGenerator生成公钥和私钥。 我如何使用公钥来验证我的签名? 或者你可以建议任何好的Java库用于签名和验证使用HMAC SHA1的签名吗?

首先要澄清的是, HMAC代码不会生成签名。 它是一种消息验证码(MAC)

后一个链接以这种方式解释了签名和MAC之间的区别:

MAC与数字签名不同,因为MAC值都是使用相同的密钥生成和验证的。 这意味着在发起通信之前,消息的发送方和接收方必须就相同的密钥达成一致,如对称加密的情况。 出于同样的原因,在网络范围的共享密钥的情况下,MAC不提供由签名提供的不可否认性的属性:任何可以验证MAC的用户也能够为其他消息生成MAC。 相反,使用密钥对的私钥生成数字签名,这是非对称加密。 由于此私钥只能由其持有者访问,因此数字签名证明文档是由该持有者签署的。 因此,数字签名确实提供了不可否认性。 但是,可以通过将密钥使用信息安全地绑定到MAC密钥的系统来提供不可否认性。 相同的密钥拥有两个人,但是一个密钥的副本可用于MAC生成,而另一个密钥的副本在硬件安全模块中仅允许MAC验证。 这通常在金融业中完成。

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

这限制了HMAC仅具有integrityauthenticity属性,而不是non-repudiation

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

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

如果要使用此路由,请使用Java Signature类。 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM