сохранение приватного ключа RSA - PullRequest
0 голосов
/ 12 марта 2020

У меня есть приложение для обмена сообщениями, для защиты сообщений пользователей я сначала зашифровываю сообщение ключом AES, а затем шифрую этот ключ AES с помощью известного ключа publi c RSA другого пользователя и отправляю ключ AES с сообщением. , когда ключ приходит к другому пользователю, он дешифрует этот ключ с помощью закрытого ключа RSA, сохраненного в базе данных телефонов. При попытке загрузить приложение в Google Play я узнал, что это небезопасный способ хранения закрытого ключа RSA. Я пытался сохранить пару ключей в хранилище ключей, но когда я пытаюсь расшифровать ключ AES с помощью закрытого ключа, я не могу получить доступ к закодированному байтовому массиву закрытого ключа, потому что я сохранил KeyStore и не разрешил доступ к нему. Есть ли способы решить эту проблему?

Создание и сохранение ключей:

fun generateRSAKey(context: Context): KeyPair {
        val keyPairGenerator = KeyPairGenerator.getInstance(
            AppConst.RSA, "AndroidKeyStore"
        )
        val spec:AlgorithmParameterSpec
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
             spec = KeyGenParameterSpec.Builder(
                    "privateKey",
                    KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
                )
                .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                .setKeySize(1024)
                .build()
        }
        else
        {
            val start: Calendar = Calendar.getInstance()
            val end: Calendar = Calendar.getInstance()
            end.add(Calendar.YEAR, 100)
             spec = KeyPairGeneratorSpec.Builder(context)
                .setAlias("privateKey")
                .setSubject(X500Principal("CN=Sample Name, O=Android Authority"))
                .setSerialNumber(BigInteger.ONE)
                .setStartDate(start.time)
                .setEndDate(end.time)
                .build()
        }
        keyPairGenerator.initialize(spec)
        return  keyPairGenerator.generateKeyPair()

    }

Получение ключей:

val keyStore=EncryptionUtil.getKeyStoreInstance()
            keyStore.load(null)
            val entry: KeyStore.Entry = keyStore.getEntry("privateKey", null)
            val privateKey: PrivateKey = (entry as KeyStore.PrivateKeyEntry).privateKey
            val decryptedAES = EncryptionUtil.decryptRSA(
                android.util.Base64.decode(
                    aesKey,
                    android.util.Base64.DEFAULT
                ), KeyFactory.getInstance("RSA").generatePrivate(PKCS8EncodedKeySpec(privateKey.encoded))
            )
...