Cifrado de objetos Java

2

Estoy desarrollando una aplicación Java y necesito hacer un cifrado simétrico para proteger parte de mi información confidencial. Hay muchos algoritmos como AES, DES 3DES en criptografía Java. ¿Cuál es el mejor algoritmo que debo usar para cifrar mi información confidencial?

Principalmente tengo valores de cadena y hay un par de instancias que necesito para proteger el objeto Java.

    
pregunta 09.01.2017 - 23:16
fuente

3 respuestas

2

AES-128 (o superior) es el algoritmo recomendado.

También debes elegir un buen Método de encadenamiento con un Vector de inicialización aleatorio. El relleno de datos de origen de longitud variable es útil ya que AES es un algoritmo de bloque. AES/CBC/PKCS5Padding es una buena opción.

La encriptación Clave debe generarse desde un Criptográficamente seguro (pseudo-) Generador de números aleatorios . (es decir, SecureRandom de Java)

Alternativamente, la clave de cifrado podría derivarse de una contraseña razonablemente segura utilizando una función de derivación de claves adecuada. ( comparación aquí )

Supongo que necesitas cifrar los datos en reposo. La gestión de claves tendrá que ser considerada.

Si necesita cifrar los datos en tránsito, también necesitará la verificación de integridad y MITM, que se logra mejor con TLS. (HTTPS)

    
respondido por el George Bailey 09.01.2017 - 23:33
fuente
2

Si desea asegurar un objeto Java, debe usar SealedObject clase.

El siguiente es un código de ejemplo.

Usar AES-128 bit y escribir en un archivo como un objeto sellado.

  try {
//Generate a key
  KeyGenerator    gen = KeyGenerator.getInstance("AES");
  gen.init(128);
  Key sKey = gen.generateKey();

  Cipher c = Cipher.getInstance("AES");
  c.init(Cipher.ENCRYPT_MODE,sKey);

// do the sealing
  Car car=new Car("My car ",2014);
  SealedObject so = new SealedObject(car,c);

  FileOutputStream out = new FileOutputStream("Objects.obj");
  ObjectOutputStream oOut = new ObjectOutputStream(out);

//Save the key
  oOut.writeObject(sKey);

//Save the sealed object
  oOut.writeObject(so);
  oOut.close();
  System.out.println("SealedObject was written to Object file");

  } catch (Exception e) {
   System.out.println(e);
  }
 }

El descifrado es el siguiente. Lee el objeto sellado y descifra usando la misma clave.

try {
  FileInputStream in = new FileInputStream("Objects.obj");
  ObjectInputStream oIn = new ObjectInputStream(in);

//Read the key
  Key sKey= (Key) oIn.readObject();

//Read the sealed object
  SealedObject so= (SealedObject) oIn.readObject();
//unsealded the object
  Car car = (Car) so.getObject(sKey);
  car.getNo();
  car.getYear();

  } catch (Exception e) {
   System.out.println(e);
  }

Asegurar la clave simétrica es muy importante aquí, pero está fuera de tema.

AES (256) es el estándar moderno y se ha utilizado en las organizaciones federales de EE. UU. y otras. AES tiene cifrado de 128,192 y 256 bits. DES se considera "antiguo" y tiene muchas vulnerabilidades . El sucesor de DES es 3DES. 3DES mitiga muchas vulnerabilidades encontradas en DES. Pero se considera lento cuando se trata de implementaciones de software, porque está aplicando el DES en 3 veces.

Por lo tanto, siempre use AES cuando tenga dudas.

    
respondido por el user3496510 09.01.2017 - 23:43
fuente
0

DES y 3DES en realidad ya no se consideran encriptación fuerte. Mire Rijndael AES, hay una implementación disponible para java (solo busque el desbordamiento de pila). Asegúrese de leer cómo usar las sales y cómo almacenar su clave de manera segura.

    
respondido por el iainpb 09.01.2017 - 23:21
fuente

Lea otras preguntas en las etiquetas