使用 java 生成 HmacSHA256 时密钥可以为空吗
Can the key be empty while generating HmacSHA256 using java
我正在 Java 中生成 HMAC-SHA256。如果键设置为“”则抛出以下异常:
java.lang.IllegalArgumentException: Empty key
但我可以在 Java脚本中使用空密钥生成 HMAC
CryptoJS.HmacSHA256("Sample Text", "")
CryptoJS 中的方法。在 Java 中,space 也被接受为键,但不接受空键。
是否可以在 Java 中使用空密钥?
Java - 和大多数编程语言一样 - 是图灵完备的,所以你可以做任何其他语言可以做的计算,即使你必须自己编程。
很遗憾,您显示的异常是 SecretKeySpec
的一部分,这意味着您无法直接生成密钥。您不能只使用不同的提供商,因为密钥创建是相同的。
但是,如果你很聪明,那么你会发现 SecretKey
只是一个接口,这意味着你可以实现它:
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);
当然,如果您的代码需要一个JavaMac
对象,那么这不是适合您的解决方案。
此答案中两个选项中的代码产生相同的结果,因此您可以非常确定它是有效的。
我正在 Java 中生成 HMAC-SHA256。如果键设置为“”则抛出以下异常:
java.lang.IllegalArgumentException: Empty key
但我可以在 Java脚本中使用空密钥生成 HMAC
CryptoJS.HmacSHA256("Sample Text", "")
CryptoJS 中的方法。在 Java 中,space 也被接受为键,但不接受空键。
是否可以在 Java 中使用空密钥?
Java - 和大多数编程语言一样 - 是图灵完备的,所以你可以做任何其他语言可以做的计算,即使你必须自己编程。
很遗憾,您显示的异常是 SecretKeySpec
的一部分,这意味着您无法直接生成密钥。您不能只使用不同的提供商,因为密钥创建是相同的。
但是,如果你很聪明,那么你会发现 SecretKey
只是一个接口,这意味着你可以实现它:
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);
当然,如果您的代码需要一个JavaMac
对象,那么这不是适合您的解决方案。
此答案中两个选项中的代码产生相同的结果,因此您可以非常确定它是有效的。