HMAC密钥生成算法

时间:2017-04-24 12:30:09

标签: java hmac

我找到了HMAC签名的例子。

密码基密钥生成:

SecretKeySpec key = new SecretKeySpec(passowrd.getBytes("UTF-8"), "HmacSHA256");

随机密钥生成:

KeyGenerator gen = KeyGenerator.getInstance("HmacSHA256");
Key key = gen.generateKey;

代HMAC签名

string passowrd = "password";
string data = "data";
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] signature = mac.doFinal(data.getBytes("UTF-8"));

SecretKeySpecKeyGeneratorMac中的算法是否需要匹配?我尝试使用不同的算法,如下所示,但它有效。

Key key = new SecretKeySpec("pass".getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
byte[] signature = mac.doFinal(data.getBytes("UTF-8"));

此代码也适用

KeyGenerator gen = KeyGenerator.getInstance("HmacSHA256");
gen.init(keysize);
val key = gen.generateKey;
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] signature = mac.doFinal(data.getBytes("UTF-8"));

我不确定它是否正确。实际上,当我在KeyGenerator中更改算法时,它会返回不同长度的密钥,但如果我将密钥大小指定为init(int keysize),我认为它是相同的。如果使用SecureRandom

之间的区别相同,该怎么办?

1 个答案:

答案 0 :(得分:1)

根据JCA reference guide,这是某些HMAC实现的独特之处。

  

对于某些MAC算法,与用于初始化Mac对象的(secret-)密钥对象相关联的(secret-)密钥算法无关紧要(这是HMAC-MD5和HMAC-SHA1实现的情况SunJCE提供程序)。但是,对于其他密钥,(secret-)密钥算法确实很重要,如果使用具有不合适的(secret-)密钥算法的(secret-)密钥对象,则会引发InvalidKeyException。

关于为什么,我不能说。我只能猜测,SecretKeySpec更改算法并不重要,因为:

  

此类仅适用于原始秘密密钥,这些原始密钥可以表示为字节数组,并且没有与之关联的密钥参数,例如DES或Triple DES密钥。