para - manual de programacion android pdf
Almacenamiento de RSA Private Key Android (3)
Creo que KeyStore podría ser adecuado para su uso. Es capaz de almacenar claves RSA y cifrarlas usando AES, por lo que incluso con acceso de raíz, no se pueden extraer sin la contraseña o el uso de datos brutos.
Hay una buena publicación aquí sobre el uso de KeyStore: http://nelenkov.blogspot.fr/2012/05/storing-application-secrets-in-androids.html
Durante la creación de la aplicación de Android de mensajería simple que consiste en cifrar / descifrar mensajes y enviarlos a través de Internet, decidí usar el cifrado de clave pública / privada RSA. La pregunta es cómo almacenar la clave privada, de modo que incluso si el teléfono tiene una raíz maliciosa, ¿la clave permanecerá segura? Por lo que entendí, KeyStore se usa para certificados y no se puede usar para esto. ¿Debo cifrar la clave privada como archivo de texto con AES? ¡Tengo muy poca experiencia con la seguridad, así que siéntase libre de corregir mis ideas y dé su opinión!
Saludos cordiales.
Ninguno de los almacenes de claves (P12, JKS, AKS) en el sistema de archivos no puede ser lo suficientemente seguro para mantener claves privadas RSA. Solo las tarjetas SmartCard o las fichas seguras pueden proporcionar seguridad de alto nivel. Lee este libro: "Android Security Internals". En este libro encontrará una buena descripción de los proveedores de Android Security y JCA.
Puede conservar su clave pública / privada RSA usando SharedPreference en Android. Para mantener sus llaves seguras cuando el teléfono tiene una raíz maliciosa, puede realizar los siguientes pasos:
1: Cuando desee ecrypt cualquier dato genere un par de claves.
2: pedir al usuario una contraseña.
3: Use esa contraseña para generar una clave simétrica para cifrar su clave privada.
4: Puede cifrar sus datos con la clave pública y descifrarlos con la clave privada.
5: Puede mantener una sesión para la contraseña solicitada en el paso 2. Durante esa sesión, puede usar la clave simétrica (generada a partir de la contraseña) para cifrar / descifrar la clave privada.
El siguiente fragmento de código muestra cómo almacenar y obtener la clave pública
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;
}
El siguiente fragmento de código muestra cómo almacenar y obtener la clave privada.
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;
}