【问题标题】:Generate symmetric key and store in android keystore生成对称密钥并存储在 android keystore 中
【发布时间】:2023-11-18 13:37:01
【问题描述】:

我正在尝试执行以下操作,

  • 为 sqlcipher 生成密钥。
  • 将秘密存储在 android 密钥库中。
  • 从密钥库中检索密钥。

我几乎找到了我需要的所有东西,但我无法让以下代码段协同工作。

Pre:设置密钥库

private void InitialiseKeystore() throws ... {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);
    boolean containsAlias = keyStore.containsAlias("com.example.myapp");

    KeyPairGenerator kpg = KeyPairGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");

    if (!containsAlias) {
        kpg.initialize(new KeyGenParameterSpec.Builder(
                alias,
                KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
                .setDigests(KeyProperties.DIGEST_SHA256,
                        KeyProperties.DIGEST_SHA512)
                .build());

        KeyPair kp = kpg.generateKeyPair();
    }

生成对称密钥

我发现这些 examples 很好,但他们正在创建公钥/私钥,与许多其他人一样,所以有点困惑,但我有以下内容。

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); //<------------------------------------- [ERRORS HERE]
SecretKey secretKey = keyGen.generateKey();

存储在密钥库中

查看documentation,看来我应该使用KeyStore.SecretKeyEntry来存储秘密,所以这是我目前拥有的,

KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
keyStore.setKeyEntry("key1", secretKeyEntry.getSecretKey().getEncoded(), null);

从密钥库中检索

private static byte[] getRawSecret() throws Exception {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    byte[] raw = keyStore.getKey("key1", null).getEncoded();
    return raw;
}

这是出错的地方,在另一个函数中我试图调用 getRawSecret()。

SQLiteDatabase.openOrCreateDatabase(databaseFile, getRawSecret().toString(), null);

错误Cannot initialize without a android.security.keystore.KeyGenParameterSpec parameter

那么问题,如何创建对称密钥并存储在密钥库中?由于错误告诉我使用 KeyGenParameterSpec 但如上面链接的示例中那样,这想要创建公钥/私钥。我做错了什么?

【问题讨论】:

    标签: android android-keystore


    【解决方案1】: