在Android密钥库中安全存储密钥

时间:2015-08-30 16:53:10

标签: java android security encryption android-keystore

我正在制作一个与服务器通信的android应用程序。我在服务器上使用基于令牌的身份验证,并从服务器向客户端传递信息,我使用的是非对称加密。

这是流程的方式

  1. 生成的公钥和私钥已经存在
  2. 公钥用于加密信息,然后从服务器传递到客户端
  3. 应用程序使用私钥解密信息
  4. 但是,我不知道如何将私钥安全地存储在密钥库中。如果我在运行时存储它,密钥将在代码中输出,如果我在REST连接期间发送私钥,那么就没有加密的意义,因为黑客可以找到这两个密钥。任何人都可以帮我创建最好的解决方案吗? THX提前!

1 个答案:

答案 0 :(得分:2)

您可以将您的私钥存储在共享首选项中,但使用生成的密钥进行加密,该密钥将存储在Android KeyStore中,这将为存储私钥提供更高的安全性。

请参阅Kotlin的以下示例。 首先,您需要生成密钥:

fun generateSecretKey(): SecretKey {
    val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
    val spec = KeyGenParameterSpec
            .Builder(secretKeyAlias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
            .build()

    keyGenerator.init(spec)
    return keyGenerator.generateKey()
}

它会自动存储在KeyStore中,因为我们在获取KeyGenerator的实例时会将其作为提供者提及。

稍后,当您需要再次获取密钥时,您可以这样做:

fun getSecretKey(): SecretKey {
    val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
    val secretKeyEntry = keyStore.getEntry(secretKeyAlias, null) as KeyStore.SecretKeyEntry
    return secretKeyEntry.secretKey
}

或者您始终可以使用getSecretKey()方法,如果通过将最后一行更改为KeyStore null获得return secretKeyEntry.secretKey ?: generateSecretKey() ,则会生成新方法。

SecretKey

获得fun encrypt(data: String): ByteArray? { val cipher = Cipher.getInstance("AES/GCM/NoPadding") cipher.init(Cipher.ENCRYPT_MODE, getSecretKey()) iv = cipher.iv return cipher.doFinal(data.toByteArray()) } 后,您可以继续加密:

encrypt

此处,方法ByteArray将返回SharedPreferences,您可以将其存储在iv中。 注意:您还应该存储初始化向量(IV)。它存储在fun decrypt(encrypted: ByteArray): String { val cipher = Cipher.getInstance("AES/GCM/NoPadding") val spec = GCMParameterSpec(128, iv) cipher.init(Cipher.DECRYPT_MODE, getSecretKey(), spec) val decoded = cipher.doFinal(encrypted) return String(decoded, Charsets.UTF_8) } 属性中。

要解密存储的数据,请使用以下方法:

GCMParameterSpec

在这里,您必须将商店初始化向量(IV)传递给let x = 'https://www.vsss.co.in/Admin/uploads/501738/13_english.png?968921', y = x.substr(0, x.indexOf('?'), x.length - x.indexOf('?')) + '?' + '2222222' console.log(y)

希望它会帮助某人。

相关问题