age*_*rrr 3 java digital-signature hmac hmacsha1
我想知道如何验证我创建的签名.我创建签名的代码看起来与此类似: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 仅具有integrity和authenticity属性,而不是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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10129 次 |
| 最近记录: |