Tutto quello che devi sapere sulla crittografia in Java

Questo articolo ti fornirà una conoscenza dettagliata e completa della crittografia in Java e come usarla con esempi.

La crittografia è il metodo di utilizzo di algoritmi matematici per camuffare il significato di un'informazione in modo che solo le parti autorizzate possano decifrarla. In questo articolo, discuteremo di crittografia e decrittografia in nel seguente ordine:

Un'introduzione alla crittografia in Java

La crittografia viene implementata per proteggere i nostri dati (come testi, conversazioni e voce), sia che si trovino su un computer o che vengano inviati su Internet. Le recenti tecnologie di crittografia sono elementi essenziali di qualsiasi ambiente informatico sicuro.





Il ruolo principale della sicurezza della crittografia risiede nella capacità di un algoritmo di generare testo cifrato (testo crittografato) che è difficile ripristinare il suo testo in chiaro originale. L'utilizzo delle chiavi crea anche un altro livello di sicurezza per i metodi di protezione delle nostre informazioni. Una chiave è una certa informazione, che consente solo a coloro che la contengono di codificare e decodificare un messaggio.

Crittografia e decrittografia in Java



cos'è logger in java

Algoritmi di crittografia simmetrica

Gli algoritmi simmetrici utilizzano la stessa chiave per la crittografia e la decrittografia. Tali algoritmi possono funzionare solo in modalità blocco (che funziona su blocchi di dati di dimensioni fisse) o in modalità flusso (che funziona su bit o byte di dati). Tali algoritmisono anche comunemente utilizzati per applicazioni come la crittografia dei dati, la crittografia dei file e la crittografia dei dati trasmessi nelle reti di comunicazione (come TLS, e-mail, messaggi istantanei, ecc.)

Algoritmi di crittografia asimmetrici (o chiave pubblica)

A differenza degli algoritmi simmetrici, che utilizzano la stessa chiave sia per le operazioni di crittografia che per le operazioni di decrittografia, gli algoritmi asimmetrici utilizzano due chiavi identiche per questi due passaggi. Questi algoritmi vengono utilizzati per l'elaborazione delle firme digitali e dei protocolli di creazione delle chiavi. Tuttavia, ciò comporta anche una sfida che è necessario utilizzare due chiavi, il che rende le cose più complesse.



Per configurare in modo sicuro qualsiasi schema di crittografia di base, è molto importante che tutti questi parametri (come minimo) siano progettati correttamente:

  • La scelta dell'algoritmo corretto è importante.
  • Scegliere la giusta modalità di funzionamento per l'attività appropriata
  • Scegliere il giusto schema di imbottitura secondo il requisito
  • Scegliere i tasti giusti e le loro dimensioni di conseguenza
  • Inizializzazione corretta con CSPRING crittograficamente sicuro.

È molto importante essere consapevoli della configurazione sicura di tutti questi parametri. Anche un piccolo errore di configurazione può compromettere un intero sistema crittografico e aprirlo agli attacchi di hacker e altri malware. Quindi, per mantenere questa discussione semplice, parliamo solo delle inizializzazioni indipendenti dall'algoritmo di un Cipher. Invece di eseguire tali crittografie da soli, è sempre meglio lasciare che gli esperti facciano il loro lavoro di configurare più configurazioni dipendenti dall'algoritmo, come i valori p e q dell'algoritmo RSA, ecc. dozzina, vengono utilizzate le classi.

L'introduzione di gerarchie di classi, molti costruttori / metodi sovraccarichi e così via, aggiungendo molte complessità, che lo rendono non necessario. Vorrei che Java non complicasse le configurazioni di base e usasse semplicemente un'architettura più semplificata come quella di Microsoft, dove tutti questi parametri sono all'interno del perimetro di una singola classe SymmetricAlgorithm e AsymmetricAlgorithm. Per i primi tre parametri da specificare (algoritmo, modalità di funzionamento e schema di riempimento), un oggetto Cipher utilizza una stringa di trasformazione.

  • Scegliere l'algoritmo giusto

Una stringa di trasformazione include indubbiamente il nome di un algoritmo crittografico. Tra la crittografia simmetrica e quella asimmetrica, ci sono 11 algoritmi (non riguardanti le varie combinazioni PBEWithAnd), che possono essere specificati secondo la documentazione del nome dell'algoritmo standard. Di questi, solo due (uno per ciascuno, crittografia simmetrica e asimmetrica) sono effettivamente completamente protetti.

Gli algoritmi rimanenti sono eccessivamente danneggiati (DES, RC2, ecc.) O sono iniziate a emergere delle crepe (RC5), rendendolo fragile con sufficiente potenza della CPU - può essere già rotto nel momento in cui leggi questo. Uno sviluppatore attento alla sicurezza potrebbe non leggere i reperti delle specifiche NIST, né seguire gli ultimi avvenimenti e le ricerche nella comunità di crittografia. Potrebbero rilevare algoritmi non funzionanti o rischiosi, digest o generatore pseudo-casuale.

Sempre per:

  1. Algoritmo simmetrico: viene utilizzata la crittografia a blocchi AES / AESWrap.

  2. Algoritmo asimmetrico: viene utilizzato RSA.

  • Modalità di funzionamento

La modalità di funzionamento fa parte della trasformazione ed è rilevante solo per i codici a blocchi. Quando usiamo cifrari asimmetrici, usa ECB come modalità operativa, che essenzialmente è un hack dietro le quinte, il che significa ignorare questo valore. I fornitori Java come SunJCE, SunPKCS11 utilizzano per impostazione predefinita la modalità ECB per algoritmi simmetrici e asimmetrici. Può essere una buona cosa per gli algoritmi asimmetrici, ma una cattiva idea per i cifrari a blocchi.

I fornitori potrebbero essere istruiti a rendere i valori predefiniti sicuri in base all'algoritmo utilizzato. Usa la crittografia simmetrica per salvarti da attacchi di replay o attacchi con testo in chiaro noto. Inoltre, usa una trasformazione, che specifica completamente un algoritmo (cioè con la sua modalità di funzionamento e riempimento). Mai e poi mai fare qualcosa di simile a quello menzionato di seguito.

Come sopra, l'algoritmo AES verrebbe utilizzato con la modalità operativa ECB, rendendo molto semplici gli attacchi di replay. Per il nuovo sviluppo, se c'è la minima possibilità di rinnovare il vecchio lavoro, dovremmo usare la crittografia autenticata con la modalità AEAD (ad esempio GCM e CCM). Abbiamo un tag di autenticazione con una lunghezza totale di 128 bit. Se utilizziamo una modalità non autenticata, utilizziamo CBC o CTR con un MAC per autenticare il testo cifrato.

  • Scegliere lo schema di imbottitura appropriato

Le modalità di cifratura a blocchi comuni richiedono che la lunghezza del testo normale sia un multiplo della dimensione del blocco dell'algoritmo di crittografia sottostante, il che è raro. Quindi, abbiamo bisogno di imbottitura.Il programma Java ci fornisce tre diversi schemi per la crittografia simmetrica, uno è No Padding, che è inaccettabile, e un altro è ISO10126Padding che è stato ritirato dal 2007).

Pertanto, l'unica opzione adatta è l'utilizzo di PKCS5Padding. La combinazione di alcune modalità operative (ad esempio la modalità CBC) e lo schema di riempimento PKCS5Padding può portare ad attacchi di oracoli di riempimento. Non menzionare affatto uno schema di riempimento è più pericoloso che fornire uno schema suscettibile solo a determinati tipi di attacchi. La modalità operativa AEAD è la più consigliata per essere sicuri di essere protetti da questi attacchi.

  • Algoritmi asimmetrici

Negli algoritmi asimmetrici, abbiamo la possibilità di scegliere tra due schemi di riempimento. È importante assicurarsi che vengano utilizzati solo schemi OAEPWithAndPadding. In caso di digest, utilizzare SHA1 o SHA256 / 384/512. Per la funzione di generazione della maschera (MGF), utilizzare l'imbottitura MGF1 come specificato. PKCS1Padding con RSA è stato vulnerabile agli attacchi Ciphertext [6] dal 1998.

Qui parliamo del modo corretto di utilizzare una trasformazione in un metodo 'Cipher.getInstance'.

  • Crittografia simmetrica

  • Crittografia asimmetrica

Un livello di sicurezza di qualsiasi schema di crittografia è direttamente proporzionale alla dimensione della sua chiave. La lunghezza della chiave deve essere sufficientemente lunga da rendere irrealizzabile qualsiasi attacco di forza bruta, allo stesso tempo dovrebbe essere anche abbastanza breve da tenere a mente la fattibilità computazionale. Inoltre, dobbiamo cercare di considerare cosa resisterà ancora ai progressi computazionali per i prossimi 30 anni.

Con questo, arriviamo alla fine dell'articolo Encryption in Java. Spero che tu abbia un'idea di crittografia e decrittografia e del motivo per cui viene utilizzato in Java.

Controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per studenti e professionisti che desiderano diventare sviluppatori Java. Il corso è progettato per darti un vantaggio nella programmazione Java e formarti sia sui concetti di base che avanzati su Java insieme a vari framework Java come Hibernate e Spring.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo blog 'Crittografia in Java' e ti risponderemo il prima possibile.