我找到了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"));
SecretKeySpec
或KeyGenerator
和Mac
中的算法是否需要匹配?我尝试使用不同的算法,如下所示,但它有效。
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
答案 0 :(得分:1)
根据JCA reference guide,这是某些HMAC实现的独特之处。
对于某些MAC算法,与用于初始化Mac对象的(secret-)密钥对象相关联的(secret-)密钥算法无关紧要(这是HMAC-MD5和HMAC-SHA1实现的情况SunJCE提供程序)。但是,对于其他密钥,(secret-)密钥算法确实很重要,如果使用具有不合适的(secret-)密钥算法的(secret-)密钥对象,则会引发InvalidKeyException。
关于为什么,我不能说。我只能猜测,SecretKeySpec更改算法并不重要,因为:
此类仅适用于原始秘密密钥,这些原始密钥可以表示为字节数组,并且没有与之关联的密钥参数,例如DES或Triple DES密钥。