【问题标题】:How to add a owner AES key to AndroidKeyStore?如何将所有者 AES 密钥添加到 AndroidKeyStore?
【发布时间】:2019-12-04 07:04:10
【问题描述】:

我想将我的 AES-256 密钥存储到 AndroidKeyStore,这个 AES-256 密钥是原始密钥(随机 32 字节)。我尝试了一些这样的代码。

public foo () {
    SecureRandom sr = new SecureRandom();
    byte[] key = new byte[32];
    sr.nextBytes(key);

    try {
        KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
        ks.load(null);

        SecretKeySpec sks = new SecretKeySpec(key, "AES");
        SecretKeyFactory skf = SecretKeyFactory.getInstance("AES");
        SecretKey sk = skf.generateSecret(sks);

        ks.setEntry("key", new KeyStore.SecretKeyEntry(sk), new 
                KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT).build());

        KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry) ks.getEntry("key", null);
        SecretKey skLoad = (SecretKey) ks.getKey("key", null);

        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, skLoad);

        Log.i(TAG, Arrays.toString(cipher.doFinal(plainBytes)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我在 SecretKey sk = skf.generateSecret(sks); 行得到了异常;

java.security.spec.InvalidKeySpecException: To generate secret key in Android Keystore, use KeyGenerator initialized with android.security.keystore.KeyGenParameterSpec

我知道我们可以使用 KeyGenerator 和 KeyGenParameterSpec 来保存密钥,但我有一些理由使用所有者密钥,而 KeyGenParameter 似乎无法导入我的所有者密钥。所以对这个问题有什么想法,谢谢大家!

【问题讨论】:

标签: android cryptography aes


【解决方案1】:

一般情况下,您不应从密钥库外部导入密钥,因为它们在进入之前是不安全的。因此,稍后添加它们的好处有限。

但是,您可以做一个小技巧:在密钥存储中创建一个包装密钥,并使用它来包装您的对称密钥,然后存储结果。然后,当再次需要密钥时,您可以简单地反转该过程。

不幸的是,存储密钥的最佳方法(例如 (GCM-)SIV 模式)通常没有实现,但是嘿,现在您至少听说过它。

【讨论】:

  • 是的,可能是我使用了包装密钥。谢谢!
  • 我成功包装了密钥,并且可以使用该密钥进行加密/解密,但是该密钥似乎无法取出,我尝试使用 KeyStore.getKey().encoded() 但它为空.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2017-04-16
  • 2015-03-13
相关资源
最近更新 更多