使用Java生成HmacSHA256时密钥可以为空吗

时间:2019-07-10 10:52:44

标签: java cryptography sha256 hmac cryptojs

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

java.lang.IllegalArgumentException: Empty key 

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

是否可以在Java中使用空键?

1 个答案:

答案 0 :(得分:1)

与大多数编程语言一样,Java是Turing完整的,因此即使您必须自己进行编程,也可以进行其他语言可以进行的任何计算。

很遗憾,您显示的异常是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);

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


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