2009-02-25 18 views
13

Abbiamo l'obbligo di eseguire lo sviluppo di Rijndael in Java.Supporto Rijndael in Java

Eventuali raccomandazioni per articoli, biblioteche, ecc. Che potrebbero aiutarci?

Eventuali puntatori alla manutenzione del keystore e in che modo memorizzare le chiavi in ​​modo sicuro?

Edit:

Si avrebbe bisogno di essere open source. Essenzialmente, è solo la crittografia/decrittografia dei dati standard che usa Rijndael.

+0

Rijndael == AES – lImbus

risposta

21

Java include AES fuori dalla scatola. Rijndael è AES. Non hai bisogno di librerie esterne. Hai solo bisogno di qualcosa di simile:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post 
byte[] iv = null ; //Ditto 
byte[] plaintext = null; //Whatever you want to encrypt/decrypt 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
//You can use ENCRYPT_MODE or DECRYPT_MODE 
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); 
byte[] ciphertext = cipher.doFinal(plaintext); 

E questo è tutto, per la crittografia/decrittografia. Se si stanno elaborando grandi quantità di dati, è meglio leggere chunk che sono multipli di 16 byte e chiamare update invece di doFinal (si chiama semplicemente doFinal nell'ultimo blocco).

+7

Rijndael non è uguale a AES, ma è AES con alcune restrizioni - dimensione di blocco fissa di 128 bit e alcune modalità di crittografia non supportate. Qualsiasi implementazione AES completa dovrebbe essere utilizzabile come Rijndael. – Cheeso

+14

Questo è esattamente il contrario, AES è un sottoinsieme di Rijndael –

+3

@ BrunoRohée è corretto. AES è un sottoinsieme di Rijndael, controlla questo http://stackoverflow.com/questions/748622/differences-between-rijndael-and-aes – tony9099

1

javax.crypto ha il supporto AES: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

quanto riguarda lo storage chiave sicura, il metodo usuale è quello di derivare una chiave di crittografia da input dell'utente (password) usando una funzione hash crittografico, e usare la chiave derivati ​​di crittografare il portachiavi. Oppure, se hai bisogno di una sola chiave, puoi utilizzare la chiave derivata stessa.

Ricordare sempre che la sicurezza del sistema è direttamente correlata alla forza della funzione di hash utilizzata. Utilizzare una funzione di hash crittograficamente protetta, insieme a un sale se possibile, e un hash più di una volta (centinaia di volte, ad esempio).

Ciò detto, la domanda è molto vaga.

+0

vale anche la pena notare che 'javax.crypto' utilizza una versione ottimizzata di AES ed è piuttosto veloce. – tony9099

5

Per un'ottima libreria gratuita, si consiglia vivamente BouncyCastle. È attivamente mantenuto, di alta qualità e ha una buona serie di esempi di codice. Per la documentazione di riferimento, dovrai fare affidamento sul generale JCE docs.

Non posso dire quale libreria utilizziamo per soddisfare i requisiti di certificazione FIPS. Ma ci sono alternative a CryptoJ che sono molto, molto più economiche.

In generale, suggerirei di generare una nuova chiave per ogni messaggio crittografato con un codice simmetrico come Rijndael e quindi crittografare quella chiave con un algoritmo asimmetrico come RSA. Queste chiavi private possono essere archiviate in un keystore basato su software e protetto da password come PKCS # 12 o Java "JKS" o, per una maggiore sicurezza, su token hardware "smart card" o altro modulo hardware crittografico.

3

Come la mia azienda ha recentemente scoperto, AES non è proprio Rijndael. AES ha la restrizione che le chiavi DEVONO essere 128, 192 o 256 bit - tuttavia, Rijndael consente anche le chiavi 160 e 224.

Come indicato da erickson sopra, BouncyCastle fornisce un oggetto Rijndael che supporta le lunghezze chiave aggiuntive: 128/160/192/224/256 bit. In particolare, dai un'occhiata all'API leggera.

Gnu-crypto è un'altra libreria open source, tuttavia NON fornisce supporto per chiavi da 160 e 224 bit.

Quindi, se sei specificamente alla ricerca di un supporto Rijndael completo, BouncyCastle è l'unico che ho trovato finora.

+1

Se hai bisogno di usare java per lo sviluppo Android (anche se la domanda non lo dice, vale la pena notare che Bounty Castle ha un fratello ora, che dà più flessibilità su Android conosciuto come Spongy Castle, che è un derivato .. e abbastanza buono in realtà) – tony9099