Подтвердить что ты не робот

Хранение RSA Private Key Android

Во время создания простого приложения для Android-сообщений, предназначенного для шифрования/дешифрования сообщений и отправки их через интернет, я решил использовать шифрование с открытым/закрытым ключом RSA. Вопрос в том, как хранить закрытый ключ, так что даже если телефон вредоносно внедрен, ключ останется в безопасности? Насколько я понял, KeyStore используется для сертификатов и не может использоваться для этого? Должен ли я шифровать закрытый ключ как текстовый файл с помощью AES? У меня очень мало опыта в области безопасности, поэтому, пожалуйста, не стесняйтесь исправлять мои идеи и высказывать свое мнение!

С уважением.

4b9b3361

Ответ 1

Я думаю, что KeyStore может быть подходящим для вашего использования. Он способен хранить ключи RSA и шифрует их с помощью AES, даже с правами доступа root, их невозможно извлечь без пароля или грубой силы.

Здесь хорошая статья об использовании KeyStore: http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html

Ответ 2

Вы можете сохранить общедоступный/закрытый ключ RSA, используя SharedPreference на Android. Чтобы ваши ключи были безопасны, когда телефон вредоносно внедрен, вы можете сделать следующие шаги:

1: Если вы хотите, чтобы все данные генерировали пару ключей.
2: Подскажите пользователю пароль.
3: Используйте этот пароль для создания симметричного ключа для шифрования вашего закрытого ключа.
4: Вы можете зашифровать свои данные с помощью открытого ключа и дешифровать с помощью закрытого ключа.
5: Вы можете сохранить сеанс для пароля, запрошенного на шаге 2. Во время этого сеанса вы можете использовать симметричный ключ (сгенерированный из пароля) для шифрования/дешифрования закрытого ключа.

Следующий фрагмент кода показывает, как хранить и извлекать открытый ключ

public void setPublicKey(PublicKey publicKey, String key, Context context) {

    byte[] pubKey = publicKey.getEncoded();
    String pubKeyString = Base64.encodeBytes(pubKey);
    this.setString(key, pubKeyString, context);
}

public PublicKey getPublicKey(String key,Context context) {

    PublicKey pKey = null;
    try {

        String pubString = this.getString(key, context);

        if(pubString!=null) {
            byte[] binCpk = Base64.decode(pubString);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(binCpk);
            pKey = keyFactory.generatePublic(publicKeySpec);
        }
        }catch(Exception e){
    }
    return pKey;
}

В следующем фрагменте кода показано, как хранить & введите секретный ключ.

public void setPrivateKey(PrivateKey privateKey, String key, Context context) {

    byte[] priKey = privateKey.getEncoded();
    String priKeyString = Base64.encodeBytes(priKey);
    this.setString(key, priKeyString, context);
}

public PrivateKey getPrivateKey(String key, Context context) {

    PrivateKey privateKey = null;

    try {
        String privateString = this.getString(key, context);
        if(privateString!=null){
            byte[] binCpk = Base64.decode(privateString);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(binCpk);
            privateKey = keyFactory.generatePrivate(privateKeySpec);
        }
    } 
    catch(Exception e){
    }
    return privateKey;
}

Ответ 3

Ни одно хранилище ключей (P12, JKS, AKS) в файловой системе не может быть достаточно безопасным для хранения закрытых ключей RSA. Только смарт-карта или защищенные жетоны могут обеспечить безопасность на высоком уровне. Прочтите эту книгу: "Внутренние базы Android". В этой книге вы найдете хорошее описание Android Security и JCA-провайдеров.