2010-06-30 15 views
26

Estoy trabajando en una aplicación de Android, y necesito usar encriptación para un aspecto de la misma. Realmente soy indiferente a qué algoritmo utilizo (AES, DES, RSA, etc.). Soy consciente de que Java tiene un paquete de cifrado, pero no estoy familiarizado con él en absoluto. ¿Alguien puede publicar un ejemplo sobre cómo hacer una función de cifrado/descifrado?Cifrado de Android

+1

El algoritmo depende mucho del escenario de uso. ¿Qué es lo que estás protegiendo, de quién, dónde, por qué y cómo planeas hacerlo? AES (cifrado simétrico) y RSA (asimétrico) funcionan de manera muy diferente. –

+0

Simplemente estoy almacenando un nombre de usuario y contraseña localmente en el dispositivo. Tengo una implementación de RSA y la utilicé para mis propósitos. –

+0

@Steven - No estoy seguro de que RSA sea el mejor sistema para eso. –

Respuesta

13

La biblioteca java AES tiene un defecto que permite, en las circunstancias adecuadas, que un oyente descifre los paquetes enviados. Ver Padding Oracle Exploit Tool vs Apache MyFaces.

Dicho esto, revise esta ASUNTA pregunta Java 256bit AES Encryption.

Castillo Hinchable AES Ejemplo robado de: http://www.java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

public class MainClass { 
    public static void main(String[] args) throws Exception { 
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());  
    byte[] input = "www.java2s.com".getBytes(); 
    byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 
       0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 
       0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 
       0x15, 0x16, 0x17 }; 

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); 

    System.out.println(new String(input)); 

    // encryption pass 
    cipher.init(Cipher.ENCRYPT_MODE, key); 

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
    int ctLength = cipher.update(input, 0, input.length, cipherText, 0); 
    ctLength += cipher.doFinal(cipherText, ctLength); 
    System.out.println(new String(cipherText)); 
    System.out.println(ctLength); 

    // decryption pass 
    cipher.init(Cipher.DECRYPT_MODE, key); 
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)]; 
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0); 
    ptLength += cipher.doFinal(plainText, ptLength); 
    System.out.println(new String(plainText)); 
    System.out.println(ptLength); 
    } 
} 
+0

Security.addProvider (new org.bouncycastle.jce.provider.BouncyCastleProvider()) ¿Qué hace esto? –

+0

Seguridad.addProvider le informa a Java que está planeando usar un proveedor de seguridad en particular (básicamente instala ese proveedor de seguridad en el administrador de seguridad, similar a cargar una biblioteca). –

+1

Acabo de tener lo que asumiré que es la coincidencia más extraña de todas: miré el video de Youtube enlazado, y después de descifrar cada octeto de la fila superior (de derecha a izquierda) reinicié mi computadora. Cuando revisé el registro del sistema, fue debido a la temperatura de la CPU por encima del umbral. Cuando abrí mi computadora para cambiar la masilla térmica con ártico plateado 5, vi que el ventilador del disipador de calor en la tarjeta de video estaba quemado (literalmente marrón, burbujeante y deformado). No puedo evitar ser paranoico de que haya algún software de falla defectuoso. – snapfractalpop

1

Mira mi respuesta aquí Android database encryption. Contiene 2 archivos que puede incluir en cualquiera de sus aplicaciones que requieren cifrado de almacenamiento de datos.

+0

Lo voy a probar mañana. Es muy interesante. Gracias hermano. – EliaszKubala

0

Teniendo en cuenta la sobrecarga para cifrar y descifrar datos en Android, ideé una biblioteca que se basa únicamente en bibliotecas nativas de Android y Java para hacer el proceso lo más simple posible .

Para instalar, use el centro de distribución jcenter. En Gradle:

compile 'com.tinmegali.android:mcipher:0.4'

Uso

String ALIAS = "alias" 
MEncryptor encryptor = new MEncryptorBuilder(ALIAS).build(); 
MDecryptor decryptor = new MDecryptorBuilder(ALIAS).build(); 

String toEncrypt = "encrypt this string"; 
// encrypting 
String encrypted = encryptor.encryptString(toEncrypt, this); 

// decrypting 
String decrypted = decryptor.decryptString(encrypted, this); 

MCipher es compatible SDK de 19+ y se adapta automáticamente a las partes más pequeñas y grandes de datos. De forma predeterminada, usa AES/GCM/NoPadding para SDKs 23+ y RSA/ECB/PKCS1Padding para versiones anteriores.

MCipher on Github