【问题标题】:KMAC algorithm for KeyGenerator in JavaJava中KeyGenerator的KMAC算法
【发布时间】:2022-01-01 16:03:29
【问题描述】:

可以生成用于 HMAC-SHA256 的对称密钥:

    String algorithm = "HmacSHA256";
    KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
    keyGenerator.init(256);
    SecretKey secretKey = keyGenerator.generateKey();
    byte[] key = secretKey.getEncoded();

KMAC 应该使用什么算法名称?

【问题讨论】:

  • 为什么需要Keyed Hash函数来生成密钥?根据密码,可以使用 PBKDF2、Scrypt 和 Argon2。或者使用 HKDF 虽然在 JAVA afaik 中不可用。
  • 我正在寻找一种常见的 Java 方式来生成适用于指定算法的密钥,这与 HMAC-SHA256(见上文)、AES 等的方式相同。
  • HMAC 密钥应该是统一随机的...为什么不使用SecureRandom 生成
  • 我知道我可以使用 SecureRandom。我很好奇是否有使用KeyGenerator.getInstance() 生成此类密钥的内置支持。

标签: java cryptography hmac


【解决方案1】:

KMAC 基于 KECCAK/SHA-3,即available since Java 9

不幸的是,这仅适用于基本的 SHA-3 算法,而不是 [H]MAC 实现(在Java 11 中查看)。

Java 17 中有以下基于 SHA-3 的 Mac 实现可用:

  • HmacSHA3-224
  • HmacSHA3-256
  • HmacSHA3-384
  • HmacSHA3-512

如果我理解正确的话,它们都不等同于 KMAC。 KMAC 是专为 KECCAK 及其属性设计的特殊 MAC 实现。

所以唯一的选择是第三方的 KMAC 实现,比如 BouncyCastle 的实现:https://javadoc.io/static/org.bouncycastle/bcprov-jdk14/1.69/org/bouncycastle/crypto/macs/KMAC.html

【讨论】:

  • 如果你有 Keccak 排列,那么实现KMAC 并不难,而 SHAKE-128 使用 KECCAK[256](...)。
  • 我正在使用您提到的那个 BC 库,我只是在寻找一种简单而典型的 Java 方法来使用 KeyGenerator.getInstance() 生成合适的密钥,以用于该 BC KMAC 实现。
  • @automatictester 我不确定是否可以通过 Mac 或 KeyGenerator 的 getInstance 方法访问 KMAC。由于无论如何您都必须使用 Bouncy castle,您可以直接使用该类,如下例所示:github.com/bcgit/bc-java/blob/master/core/src/test/java/org/…
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2011-02-21
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多