Хранение RSA Private Key Android
Во время создания простого приложения для Android-сообщений, предназначенного для шифрования/дешифрования сообщений и отправки их через интернет, я решил использовать шифрование с открытым/закрытым ключом RSA. Вопрос в том, как хранить закрытый ключ, так что даже если телефон вредоносно внедрен, ключ останется в безопасности? Насколько я понял, KeyStore используется для сертификатов и не может использоваться для этого? Должен ли я шифровать закрытый ключ как текстовый файл с помощью AES? У меня очень мало опыта в области безопасности, поэтому, пожалуйста, не стесняйтесь исправлять мои идеи и высказывать свое мнение!
С уважением.
Ответы
Ответ 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-провайдеров.