Crittografia di oggetti Java

2

Sto sviluppando un'applicazione Java e ho bisogno di fare una crittografia simmetrica per proteggere alcune delle mie informazioni sensibili. Ci sono molti algoritmi come AES, DES 3DES nella crittografia java. Qual è l'algoritmo migliore che dovrei utilizzare per crittografare le mie informazioni sensibili?

Per lo più ho dei valori stringa e ci sono un paio di istanze di cui ho bisogno per proteggere l'oggetto java.

    
posta 09.01.2017 - 23:16
fonte

3 risposte

2

AES-128 (o superiore) è l'algoritmo consigliato.

Devi anche scegliere un buon metodo di concatenamento con un vettore di inizializzazione casuale . Il riempimento dei dati di origine a lunghezza variabile è utile poiché AES è un algoritmo a blocchi. AES/CBC/PKCS5Padding è una buona opzione.

La crittografia Chiave dovrebbe essere generata da un generatore di numeri casuali crittografato (pseudo-) casuale . (Ad esempio, Java SecureRandom )

In alternativa, la chiave di crittografia potrebbe essere ricavata da una password abbastanza valida utilizzando una funzione di derivazione chiave idonea. ( confronto qui )

Suppongo che sia necessario crittografare i dati a riposo. La gestione delle chiavi dovrà essere presa in considerazione.

Se hai bisogno di crittografare i dati in transito, avrai anche bisogno della verifica MITM e Integrity, che è meglio eseguire con TLS. (HTTPS)

    
risposta data 09.01.2017 - 23:33
fonte
2

Se vuoi proteggere un oggetto Java devi usare SealedObject classe.

Di seguito è riportato un codice di esempio.

Utilizzo di AES-128 bit e scrittura in un file come oggetto sigillato.

  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);
  }
 }

La decrittazione è la seguente. Legge l'oggetto sigillato e decrittografa usando la stessa chiave.

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);
  }

Assicurare la chiave simmetrica è molto importante qui, ma è fuori tema.

AES (256) è lo standard moderno ed è stato utilizzato negli Stati Uniti federali e altre organizzazioni. AES ha crittografia 128,192 e 256 bit. DES è considerato come "Vecchio" e ha molte vulnerabilità . Il successore di DES è 3DES. 3DES mitiga molte vulnerabilità riscontrate nel DES. Ma è considerato lento quando si tratta di implementazioni software, perché applica il DES in 3 volte.

Quindi usa sempre AES quando sei in dubbio.

    
risposta data 09.01.2017 - 23:43
fonte
0

DES e 3DES non sono più considerati una crittografia strong. Guarda Rijndael AES, c'è un'implementazione disponibile per java (solo l'overflow dello stack di ricerca). Assicurati di leggere su come utilizzare i sali e su come conservare la chiave in modo sicuro.

    
risposta data 09.01.2017 - 23:21
fonte

Leggi altre domande sui tag