安全性不是我的专业领域,但我有一个关于使用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
答案 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: