El cifrado con modo ECB no debe usarse
Estoy tratando de utilizar un Cipher
con un par de claves RSA junto con la "AndroidKeyStore"
. En toda la documentación de Android que puedo encontrar, los ejemplos muestran Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")
o Cipher.getInstance("RSA/ECB/PKCS1Padding")
. Ambos vienen con la misma advertencia en Android Studio:
El cifrado ECB no debe utilizarse
- Descifrado RSA en Android - iPhone
- Diferentes claves públicas RSA generadas en Android
- Java: ¿Cómo puedo generar PrivateKey de una cadena?
- Cargar datos de clave pública del archivo
- Android BigInteger ArithmeticException
Cipher # getInstance no debe ser llamado con ECB como el modo de cifrado o sin establecer el modo de cifrado porque el modo predeterminado en android es ECB, que es inseguro.
Obviamente, no puedo omitirlo, o establecer el modo en None
, porque el valor predeterminado es ECB. Si el modo ECB es inseguro, ¿qué modo debo usar?
Si utilizo cualquier otro modo (que yo sepa) recibo una NoSuchAlgorithmException: No provider found for RSA/{mode}/OAEPWithSHA-256AndMGF1Padding
. ¿Podría el relleno ser el problema?
De cualquier manera, de acuerdo con la documentación del sistema Android KeyStore , el modo ECB parece ser el único modo de bloque de cifrado que admite al utilizar RSA.
- Obtener el error java.lang.ArrayIndexOutOfBoundsException: demasiados datos para el bloque RSA
- Encriptación RSA en Android
- Compartir y almacenar RSA - clave pública en el servidor java y viceversa
- El exponente privado de Android KeyStore no se puede extraer
- Encriptación de cadena RSA en Android
- RSA Encrypt and Decrypt Strings en Android
- Firma de una cadena con una clave privada, firma RSA-SHA1 y md5 en Android
- Android RSA Generación de pares de claves - ¿Debo usar Java estándar / Bouncy Castle / Spongy Castle / JSch / Other?
Esto parece un error en Android Lint utilizado por Android Studio para encontrar problemas. La intención de esa advertencia es advertir sobre el uso del modo de bloque del ECB con cifras simétricas, como AES. Sin embargo, no hay ningún punto en advertir sobre esto para RSA, porque RSA / ECB / … Cipher acepta / procesa sólo un bloque de entrada.
Le sugiero que presente un error en https://code.google.com/p/android/ contra Android Lint.
Me gusta esta explicación ( de Maarten Bodewes ):
"RSA/ECB/PKCS1Padding"
realidad no implementa cifrado de modo ECB. Se debería haber llamado"RSA/None/PKCS1Padding"
ya que sólo se puede utilizar para cifrar un solo bloque de texto sin formato (o, de hecho, una clave secreta). Esto es sólo un error de nombre de Sun / Oracle.
Si su versión de Android incluye BouncyCastle, puede utilizar None
lugar de ECB
.
Cambiando "AES / ECB / PKCS5PADDING" a "AES / CBC / PKCS5PADDING" fijo esta advertencia de seguridad de pelusa.