【问题标题】:InvalidKeyException: Only SecretKey is supportedInvalidKeyException:仅支持 SecretKey
【发布时间】:2018-02-12 19:45:33
【问题描述】:

我最近开始在设备中看到此错误。

java.security.InvalidKeyException: Only SecretKey is supported
        at com.android.org.conscrypt.OpenSSLCipher.checkAndSetEncodedKey(OpenSSLCipher.java:436)
        at com.android.org.conscrypt.OpenSSLCipher.engineInit(OpenSSLCipher.java:273)
        at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2664)
        at javax.crypto.Cipher.tryCombinations(Cipher.java:2575)
        at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2480)
        at javax.crypto.Cipher.chooseProvider(Cipher.java:567)
        at javax.crypto.Cipher.init(Cipher.java:975)
        at javax.crypto.Cipher.init(Cipher.java:910)

来自https://github.com/justinsb/android-libcore/blob/master/luni/src/main/java/org/apache/harmony/xnet/provider/jsse/OpenSSLCipher.java#L232 在以下情况下抛出异常:

if (!(key instanceof SecretKey)) {
   throw new InvalidKeyException("Only SecretKey is supported");
}

我总是像这样从商店获取我的 SecretKey:

SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null);

知道发生了什么吗?

【问题讨论】:

  • 如果keynull,就会发生这种情况。 null instanceof T 总是返回 false

标签: android security ssl encryption boringssl


【解决方案1】:

使用 Key_Generator 对象生成密钥。

例如:

将 SecretKeyObject 初始化为全局

SecretKey secretKeyObject;

通过以下方式初始化密钥生成器对象:

KeyGenerator keyGeneratorObject = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");
            keyStoreObject.load(null);
            keyGeneratorObject.init(new KeyGenParameterSpec.Builder(key_name,KeyProperties.PURPOSE_ENCRYPT|KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC).setUserAuthenticationRequired(true)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7).build());
           secretKeyObject = keyGeneratorObject.generateKey();

然后

cipherObject.init(Cipher.ENCRYPT_MODE, secretKeyObject);

这对我有用。

【讨论】:

    【解决方案2】:

    如果 key 为空,就会发生这种情况。

    我遇到了类似的问题,只是我的代码中的一个错误导致无法正确读取密钥。因此在 Cipher.init() 中传递了 null 并导致了此消息。

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2015-01-03
      • 2013-07-11
      相关资源
      最近更新 更多