使用API​​ 18及更高版本在Android KeyStore中存储密钥

时间:2017-04-02 18:35:10

标签: android security android-keystore secret-key

安全性不是我的专业领域,但我有一个关于使用API​​ 18及更高版本在Android KeyStore中存储密钥的问题。我使用以下代码尝试存储我的密钥:

<PropertyGroup>
 <TargetFramework>netstandard1.4</TargetFramework>
 <PackageId>AppLogger.YOUR_NAME</PackageId>
 <PackageVersion>1.0.0</PackageVersion>
 <Authors>YOUR_NAME</Authors>
 <Description>Awesome application logging utility</Description>
 <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
 <PackageReleaseNotes>First release</PackageReleaseNotes>
 <Copyright>Copyright 2016 (c) Contoso Corporation. All rights reserved.</Copyright>
 <PackageTags>logger logging logs</PackageTags>

我理解“null”应该是我构建的KeyProtection参数,但这不适用于API 18.这个问题是否有解决方法?我一直很难找到有效的东西。

编辑我应该提一下,将其保留为null会引发错误:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); KeyStore.SecretKeyEntry sKeyEntry = new KeyStore.SecretKeyEntry(ivKey); ks.setEntry(ALIAS, sKeyEntry, null); // This is where the issue is

2 个答案:

答案 0 :(得分:0)

AndroidKeyStore在API级别23之前不支持密钥。要执行您尝试执行的操作,您必须以23或更高的目标为目标。

您可以做的是使用AndroidKeyStore对公钥/私钥对(例如RSA)的支持来加密密钥材料,然后将其存储在本地文件中。当您想要使用它时,您需要使用私钥对其进行解密,然后一旦您拥有密钥材料,就使用普通的Java加密API(即,不要指定&#34; AndroidKeyStore&#34 ;)用它进行密码操作。

要了解如何使用AndroidKeyStore RSA密钥对进行加密和解密,请查看http://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/

然而,我并不认为从安全角度来看实际上可以实现任何目标。您想要实现哪些安全目标?

答案 1 :(得分:0)

要使用AndroidKeyStore创建RSA(公共/私人)密钥,可以使用以下方法。

获取密钥库

val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)

检查KeyStore是否包含我们的密钥

如果KeyStore不包含密钥,则创建密钥

    if (!keyStore.containsAlias(KEY_NAME)) {

        val keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        keyPairGenerator.initialize(
            KeyGenParameterSpec.Builder(
                KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
            )
                .setAlgorithmParameterSpec(RSAKeyGenParameterSpec(2048, F4))
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                .build()
        )

        val keyPair = keyPairGenerator.generateKeyPair()
        val publicKey = keyPair.public
        val privateKey = keyPair.private
    }

使用KEY_NAME检索密钥

val privateKeyEntry = keyStore.getEntry(KEY_NAME, null) as KeyStore.PrivateKeyEntry
val privateKey = privateKeyEntry.privateKey
val publicKey = privateKeyEntry.certificate.publicKey

有关更多信息,请参见this