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