【问题标题】:Algorithms with HMAC key generation具有 HMAC 密钥生成的算法
【发布时间】:2017-04-24 12:30:08
【问题描述】:

我找到了 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有什么区别?

【问题讨论】:

    标签: java hmac


    【解决方案1】:

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

    对于某些 MAC 算法,与用于初始化 Mac 对象的(秘密)密钥对象关联的(秘密)密钥算法无关紧要(HMAC-MD5 和 HMAC-SHA1 的实现就是这种情况) SunJCE 提供商)。然而,对于其他人来说,(秘密)密钥算法确实很重要,如果使用具有不适当(秘密)密钥算法的(秘密)密钥对象,则会引发 InvalidKeyException。

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

    此类仅对可以表示为字节数组且没有与之关联的密钥参数的原始密钥有用,例如 DES 或三重 DES 密钥。

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      相关资源
      最近更新 更多