válida una subido studio recuperar play modificada has google generate generar firmar firma crear con como app android encryption cryptography rsa android-keystore

una - Cifrado y descifrado de nombre de usuario utilizando KeyStore en Android M y versiones anteriores?



has subido un apk con una firma no válida (1)

Estoy tratando de cifrar y descifrar el nombre de usuario en la aplicación utilizando KeyStore,

Usando KeyPairGeneratorSpec para crear la clave en versiones anteriores como 18 a 22,

KeyPairGeneratorSpec se ha visto privado de la versión 23 de android M, pero Android M es compatible con KeyGenParameterSpec.

¿Este KeyGenParameterSpec admite comparabilidad hacia atrás o cómo lo hago?

Estoy probando algo así, ¿hay alguna mejor solución para esto? Esto funciona bien como ahora!

En el momento de Ciper.getInstance en encriptación y descifrado, necesito hacer esto. ¿Hay algún parámetro único "RSA / ECB / OAEPWithSHA-256AndMGF1Padding" o "RSA / ECB / PKCS1Padding" que puedo aprobar para la versión ?

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); }else{ c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); }

A continuación, el código funciona bien como ahora, hágamelo saber cómo puedo mejorar esto.

Generador de llaves :

genkey(){ KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ TCLog.e(TAG,"Current version is 23(MashMello)"); //Api level 23 KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder( keyName, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT ) .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP) .build(); generator.initialize(spec); }else{ TCLog.e(TAG,"Current version is < 23(MashMello)"); //api level 17+ 4.4.3 KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(getActivity()) .setAlias(keyName) .setSubject(new X500Principal("CN=Sample Name, O=Android Authority")) .setSerialNumber(BigInteger.ONE) .setStartDate(start.getTime()) .setEndDate(end.getTime()) .build(); generator.initialize(spec); } KeyPair keyPair = generator.generateKeyPair(); }

Código de encriptación:

doEncription(){ try { KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(keyName, null); PublicKey publicKey = (PublicKey) privateKeyEntry.getCertificate().getPublicKey(); Cipher c; if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); }else{ c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); } c.init(Cipher.ENCRYPT_MODE, publicKey); encodedUser = c.doFinal(userName.getBytes()); encodedPassword = c.doFinal(userPassword.getBytes()); userName = Base64.encodeToString(encodedUser, Base64.DEFAULT); userPassword = Base64.encodeToString(encodedPassword, Base64.DEFAULT); // Log.e("MainActivity","AES Encription Error.!"); } catch (Exception e) { Log.e("MainActivity", "AES Encription Error.!"); } }

Código de descifrado:

doDecryption(){ try { KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(keyName, null); PrivateKey privateKey = (PrivateKey) privateKeyEntry.getPrivateKey(); Cipher c; if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); }else{ c = Cipher.getInstance("RSA/ECB/PKCS1Padding"); } c.init(Cipher.DECRYPT_MODE, privateKey); decodedUser = c.doFinal(encodedUser); decodedPassword = c.doFinal(encodedPassword); } catch (Exception e) { Log.e("MainActivity", "AES Decryption Error.!"); } }


la transformación de cifrado depende de qué parámetros proporcione a KeyGenParameterSpec o KeyPairGeneratorSpec . Si desea usar "RSA/ECB/PKCS1Padding" en ambos casos (Android M y abajo) cambie

spec.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)

a

spec.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)

Puede verificar qué algoritmos están disponibles con el siguiente fragmento de código:

Provider[] providers = Security.getProviders(); for (Provider p : providers) { Log.d(TAG, "provider: " + p.getName()); Set<Provider.Service> services = p.getServices(); for (Provider.Service s : services) { Log.d(TAG, "--> algorithm: " + s.getAlgorithm()); } }

Evité escribir mucho if-else al declarar una interfaz IKeyStoreHandler que proporciona todos los métodos necesarios (agregar / eliminar claves, enumerar todas las claves por sus alias, obtener clave privada / pública, descifrar / encriptar texto) e implementarla para ambos casos .