gpt4 book ai didi

java - 使用java生成HmacSHA256时key可以为空吗

转载 作者:行者123 更新时间:2023-12-02 09:42:25 25 4
gpt4 key购买 nike

我正在 Java 中生成 HMAC-SHA256。如果键设置为“”则抛出以下异常:

java.lang.IllegalArgumentException: Empty key 

但是我可以使用 JavaScript 中的空 key 生成 HMACCryptoJS 中的 CryptoJS.HmacSHA256("Sample Text", "") 方法。在 Java 中,空格也被接受为键,但不接受空键。

Java中可以使用空键吗?

最佳答案

Java - 与大多数编程语言一样 - 是图灵完备的,因此您可以执行其他语言可以执行的任何计算,即使您必须自己编程。

不幸的是,您显示的异常是 SecretKeySpec 的一部分,这意味着您无法直接生成 key 。您也不能仅仅使用不同的提供程序,因为 key 创建是相同的。

<小时/>

但是,如果您聪明的话,您会发现 SecretKey 只是一个接口(interface),这意味着您可以实现它:

public static class EmptyKey implements SecretKey {
private static final long serialVersionUID = 1L;

@Override
public String getAlgorithm() {
return "HMAC";
}

@Override
public String getFormat() {
return "RAW";
}

@Override
public byte[] getEncoded() {
// return empty key data
return new byte[0];
}
}

现在显然 Java 的 HMAC 实现本身并不禁止空键,所以这可以工作。当然,它可能无法在不同的 Java 实现或版本中工作,尽管在 HMAC 中插入检查似乎不太可能,因为它可能是 HMAC 的有效用例。

<小时/>

或者,您当然可以使用另一个实现 HMAC 的库,例如 Bouncy CaSTLe,并完全避开 JCA。

HMac hmac = new HMac(new SHA256Digest());
hmac.init(new KeyParameter(new byte[0]));
byte[] out = new byte[hmac.getMacSize()];
// you need to insert the message here, I'm using an empty message
hmac.doFinal(out, 0);

当然,如果您的代码需要 Java Mac 对象,那么这不是适合您的解决方案。

<小时/>

此答案中两个选项中的代码都会产生相同的结果,因此您可以非常确定它是有效的。

关于java - 使用java生成HmacSHA256时key可以为空吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56969153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com