Quale crittografia basata su password da utilizzare con Java 6 standard?

5

Quale metodo di crittografia basato su password dovrei usare in Java 6? Dovrebbe essere il più strong possibile, ma lavorare con il file dei criteri di sicurezza predefinito (non quello con esportazione limitato che devi scaricare e installare separatamente)?

    
posta user12889 25.07.2011 - 05:57
fonte

2 risposte

5

La mia raccomandazione: dovresti cerca di evitare l'uso della crittografia basata su password , se puoi evitarlo. In particolare, la crittografia basata su password tende ad essere insicura, in pratica. Il problema è che è raro che le password degli utenti abbiano abbastanza entropia per resistere all'attacco del dizionario. Pertanto, se hai bisogno di crittografia, probabilmente non vuoi usare la crittografia basata su password , se c'è qualche alternativa .

Una soluzione migliore consiste nel fornire agli utenti una chiave e utilizzare la chiave per crittografare o decrittografare.

Se non segui la mia raccomandazione: se devi assolutamente utilizzare la crittografia basata su password, ecco alcuni suggerimenti per ridurre un po 'il rischio:

  • Utilizza PBKDF2 per ricavare la chiave dalla password. Scegli un numero adeguato di iterazioni in modo che il processo di derivazione della chiave avvenga, ad es. 100 ms sulla macchina dell'utente. Ciò renderà in qualche modo più difficile eseguire la ricerca del dizionario sulla passphrase dell'utente, tuttavia, non elimina il rischio, quindi gli utenti devono ancora fare uno sforzo extra per scegliere una passphrase molto lunga.

  • Fai tutto il possibile per aumentare la probabilità che gli utenti utilizzino una passphrase molto lunga. L'approccio migliore sarebbe generare automaticamente la password per loro. Suggerisco di sceglierne uno con 80 bit di entropia. Se si trasforma in una password che utilizza A-Za-z0-9 (ma non O o l, per evitare confusione con 0 o 1), la passphrase risultante sarà lunga 14 caratteri. Agli utenti potrebbe non piacere avere a che fare con una passphrase così lunga, ma dovranno solo succhiarlo e gestirli, se vogliono essere sicuri.

    Se lasci che gli utenti scelgano la propria passphrase, la maggior parte sceglierà una passphrase di bassa qualità. Suggerisco di includere terribili avvertenze sul rischio. Dovresti raccomandare di scegliere una passphrase lunga almeno 20 caratteri, ed è casuale come possono farcela. Potresti voler fornire una piccola app per generare una passphrase di esempio per loro, che possono essere tagliati e incollati e utilizzati.

    Anche con tutti i tuoi sforzi, se gli utenti scelgono la propria passphrase, molti utenti ne sceglieranno probabilmente una non sufficientemente sicura. Il problema è che la crittografia richiede passphrase che sono considerevolmente più lunghe e più forti delle password che usi per una password di account web. La maggior parte degli utenti probabilmente non lo sa, e comunque i fastidi di scegliere una passphrase abbastanza lunga e strong probabilmente scoraggeranno molti utenti dal farlo e li indurranno a comportarsi in modo non sicuro.

Se hai la sensazione che la crittografia basata su password sia un mal di testa da usare in modo sicuro, il tuo senso è assolutamente accurato.

    
risposta data 25.09.2011 - 01:17
fonte
3

Prima di leggere la risposta di @ D.W., è piena di buoni consigli. Quindi, se si desidera eseguire ancora la crittografia basata su password, considerare quanto segue:

  • La crittografia basata su password consiste nel trasformare una password in una chiave e quindi usare quella chiave per la crittografia simmetrica.
  • Java può eseguire una crittografia basata su password, ovvero eseguire i due passaggi in un'API semplificata, come mostrato here . Tuttavia, consente solo alcune combinazioni di meccanismi di criptaggio della password e algoritmi di crittografia e, in particolare, viene segnalato che non lo consente con AES, che è un problema.
  • Niente ti impedisce di eseguire la trasformazione da password a chiave e quindi la crittografia in due passaggi separati nel codice.

Si noti che i meccanismi di hashing delle password di solito non sono coperti dalle leggi crittografiche e dai regolamenti sulle esportazioni, poiché non "nascondono" i dati. Suggerisco quindi di includere solo un'esecuzione di bcrypt nel codice, ad es. jBCrypt che è scritto in Java, OpenSource con una licenza facile e ragionevolmente compatto ( uno file sorgente). Dovresti modificare il codice un po ', perché quell'implementazione vuole usare stringhe , mentre tu vuoi i bit grezzi; quindi, fai quanto segue:

  • Utilizza il metodo crypt_raw() per convertire la password e il sale nell'output di bcrypt a 192 bit.
  • Hash questi 192 bit con SHA-512 (Java 6 include un'implementazione SHA-512). Questo produce 512 bit.
  • Utilizza questi 512 bit per la crittografia AES dei tuoi dati, con un MAC sul risultato (ad esempio con HMAC / SHA -256, quindi nuovamente supportato da Java 6). Vedi sotto per i dettagli.

(Di solito preferisco bcrypt su PBKDF2 per le ragioni spiegate ci , ma anche PBKDF2 non è male, quindi se vuoi davvero PBKDF2 (o ne hai bisogno per motivi di conformità), allora vai a prenderlo.)

Importante: eseguire correttamente la crittografia e aggiungere un MAC può essere compromesso in un numero sorprendentemente elevato di modi. sei caldamente incoraggiato a non farlo da solo. Tuttavia, il seguente metodo dovrebbe essere sicuro:

  • Hai 512 bit di "dati derivati da password". Suddividilo in quattro blocchi a 128 bit.
  • Cifra i dati con AES-128 in modalità CBC. CBC richiede un vettore di inizializzazione , che è una matrice di 16 byte casuali. Utilizzare il primo blocco a 128 bit (dall'uscita SHA-512) come chiave e il secondo blocco a 128 bit come IV. Inoltre, usa il padding PKCS # 5 (dato che i tuoi dati di input possono avere una lunghezza che non è un multiplo di 16).
  • Al termine della crittografia, calcolare HMAC / SHA-256 su un input costituito da IV, quindi il risultato di crittografia , in tale ordine; la chiave per HMAC sarà il terzo blocco a 128 bit dell'uscita SHA-512.
  • Il "file crittografato" deve contenere il sale per bcrypt (128 bit, ovvero 16 byte), l'output della crittografia AES / CBC e l'output HMAC (256 bit, ovvero 32 byte).
  • Per la decrittografia, utilizzare il sale (dal file crittografato) e la password per ricalcolare bcrypt, quindi applicare SHA-512 per ottenere la chiave di crittografia, IV e la chiave per HMAC. Verifica il valore HMAC e, se è corretto, decrittografare i dati.

E, ricorda: mai, mai , MAI riutilizzare il valore salt per due istanze di crittografia (indipendentemente dal fatto che utilizzino o meno la stessa password). Usa sempre java.security.SecureRandom per generare un salt casuale nuovo ogni volta che desideri crittografare un file.

    
risposta data 30.09.2012 - 17:52
fonte

Leggi altre domande sui tag