Может ли ключ быть пустым при генерации HmacSHA256 с использованием Java - PullRequest
0 голосов
/ 10 июля 2019

Я генерирую HMAC-SHA256 на Java. Если ключ установлен на «», то генерируется следующее исключение:

java.lang.IllegalArgumentException: Empty key 

Но я могу сгенерировать HMAC, используя пустой ключ в JavaScript, используя CryptoJS.HmacSHA256("Sample Text", "") метод в CryptoJS. В Java пробел также принимается как ключ, но пустой ключ не принимается.

Можно ли использовать пустой ключ в Java?

1 Ответ

1 голос
/ 12 июля 2019

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];
    }
}

теперь, очевидно, реализация HMAC Java сама по себе не запрещает пустые ключи, так что это будет работать.Конечно, он может не работать в разных реализациях или версиях 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, тогда это нерешение для вас.


Код в обоих вариантах этого ответа дает одинаковые результаты, поэтому вы можете быть уверены, что он действителен.

...