生成对称密钥并存储在 android 密钥库中
Generate symmetric key and store in android keystore
我正在尝试执行以下操作,
- 为 sqlcipher 生成密钥。
- 将秘密存储在 android 密钥库中。
- 从密钥库中检索秘密。
我几乎找到了所有我需要的东西,但是我在让下面的代码片段一起工作时遇到了问题。
预:设置密钥库
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 但它们正在创建 public/private 密钥,与许多其他密钥一样,所以在那里有点困惑,但我有以下内容。
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 但如上面链接的示例所示,这需要创建 public/private 键。我做错了什么?
我正在尝试执行以下操作,
- 为 sqlcipher 生成密钥。
- 将秘密存储在 android 密钥库中。
- 从密钥库中检索秘密。
我几乎找到了所有我需要的东西,但是我在让下面的代码片段一起工作时遇到了问题。
预:设置密钥库
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 但它们正在创建 public/private 密钥,与许多其他密钥一样,所以在那里有点困惑,但我有以下内容。
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 但如上面链接的示例所示,这需要创建 public/private 键。我做错了什么?