Sto lavorando a un programma che deve memorizzare le informazioni binarie crittografate a riposo. Sfortunatamente, non riesco a trovare una risorsa che spieghi quali schemi di crittografia sono i migliori per le diverse applicazioni.Crittografia Java: quali algoritmi dovrei usare?
Poiché la crittografia è complicata e non sono un esperto, ho deciso di utilizzare una libreria denominata Jasypt che avvolge le funzioni di crittografia incorporate di Java. Per capire quali algoritmi sono disponibili per me, ho scritto alcuni test unitari.
Il primo test chiama la funzione di Jasypt AlgorithmRegistry.getAllPBEAlgorithms()
ed elenca tutti gli algoritmi di crittografia disponibili:
PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256
PBEWITHMD5ANDDES
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
In fase di esecuzione, Jasypt getterà un EncryptionOperationNotPossibleException
se si tenta di utilizzare un algoritmo che per qualche motivo non è supportato o viola le regole di crittografia di Java. È interessante notare che, se tento di usare ognuno degli algoritmi 'disponibili' per cifrare e decifrare alcuni dati arbitrari, e solo stampare i quelli che non gettano tale eccezione, ho questa snellita lista:
PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
L'elenco degli algoritmi disponibili può essere ampliato inserendo il JCE BouncyCastle e registrandolo eseguendo Security.addProvider(new BouncyCastleProvider())
. Se ripeto il test precedente dopo aver fatto questo, ottenere una lista molto più grande di algoritmi tra cui scegliere:
PBEWITHMD2ANDDES
PBEWITHMD5AND128BITAES-CBC-OPENSSL
PBEWITHMD5AND192BITAES-CBC-OPENSSL
PBEWITHMD5AND256BITAES-CBC-OPENSSL
PBEWITHMD5ANDDES
PBEWITHMD5ANDRC2
PBEWITHSHA1ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHSHA256AND256BITAES-CBC-BC
PBEWITHSHAAND128BITAES-CBC-BC
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHAAND128BITRC4
PBEWITHSHAAND192BITAES-CBC-BC
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
PBEWITHSHAAND40BITRC2-CBC
PBEWITHSHAAND40BITRC4
PBEWITHSHAANDIDEA-CBC
PBEWITHSHAANDTWOFISH-CBC
Purtroppo, ora non ho idea di quale di questi molti algoritmi è più appropriato per la mia applicazione. Ho l'impressione che AES sia la strada giusta da fare, e sembra che l'PBEWITHSHA256AND256BITAES-CBC-BC
sia l'implementazione AES con la lunghezza della chiave più lunga, ma non so dove andare per confermare questo sospetto.
Quali di questi schemi fornirebbero i più alti livelli di sicurezza e che hanno evidenti problemi di sicurezza?
EDIT: Voglio essere in grado di distribuire il mio codice senza richiedere all'utente finale di installare i file di crittografia illimitate, come che quasi certamente oltre le capacità degli utenti esperti non così tech. Quello che voglio veramente è la crittografia più potente che riesco a ottenere senza usare i file di giurisdizione della forza illimitata.
non lo fanno. Utilizza le librerie wrapper che prendono tutte le decisioni corrette. Leggi http://blog.slaks.net/2015-11-18/common-crypto-pitfalls/ – SLaks
Ho cambiato la domanda per spiegare direttamente quale schema fornisce "i più alti livelli di sicurezza". Chiedere spiegazioni/indicazioni fuori sede è fuori tema e chiedere "il meglio" è soggettivo. Entrambi sarebbero motivi per chiudere la domanda. –
non hai bisogno di una libreria; non troppo difficile da usare API java. il mio esempio - https://gist.github.com/zhong-j-yu/9d23c850e580d60ddd46 – ZhongYu