为什么无论SecretKeySpec
的第二个参数如何,它始终有效?它不是有效的算法名称吗?谢谢
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "it does not matter what I put here. why?");
sha256_HMAC.init(secret_key);
String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
问题是:为什么我通过的东西无关紧要?无论我作为第二个参数(算法名称)传递什么,代码始终可以正常工作。
答案 0 :(得分:2)
我认为这只是一个巧合,因为Java加密体系结构基于providers的概念。似乎Mac
的默认JDK提供程序没有检查SecretKeySpec
中的算法,而是完全依赖于Mac.algorithm
字段中保存的算法。
您仍然应该在SecretKeySpec
中设置正确的算法,因为没有什么可以阻止提供者检查密钥的算法。例如,如果您查看Mac.chooseProvider(Key key, AlgorithmParameterSpec params)
私有方法,它将密钥传递给外部代码:
// if provider says it does not support this key, ignore it
if (s.supportsParameter(key) == false) {
continue;
}
答案 1 :(得分:1)
如果您查看代码,将会看到
public SecretKeySpec(byte[] key, String algorithm) {
...
this.algorithm = algorithm;
和标题
@throws IllegalArgumentException
* if the key data or the algorithm name is null or if the key
* data is empty.
所以SecretKeySpec
不在乎算法。
当您初始化MAC时,只会出现错误
* @exception InvalidKeyException if the given key is inappropriate for
* initializing this MAC.
public final void init(Key key) throws InvalidKeyException {