Java Language
Sicurezza e crittografia
Ricerca…
introduzione
Le pratiche di sicurezza in Java possono essere separate in due categorie ampie e vagamente definite; Sicurezza della piattaforma Java e programmazione Java sicura.
Le pratiche di sicurezza della piattaforma Java si occupano della gestione della sicurezza e dell'integrità della JVM. Include argomenti come la gestione dei provider JCE e le politiche di sicurezza.
Le pratiche di programmazione Java sicure riguardano i modi migliori per scrivere programmi Java sicuri. Include argomenti come l'uso di numeri casuali e crittografia e la prevenzione delle vulnerabilità.
Osservazioni
Mentre gli esempi dovrebbero essere chiaramente fatti, alcuni argomenti che devono essere trattati sono:
- Il concetto / struttura del fornitore JCE
- Elemento dell'elenco
Il JCE
Java Cryptography Extension (JCE) è un framework integrato in JVM per consentire agli sviluppatori di utilizzare in modo semplice e sicuro la crittografia nei loro programmi. Lo fa fornendo un'interfaccia semplice e portatile ai programmatori, mentre utilizza un sistema di JCE Provider per implementare in modo sicuro le operazioni crittografiche sottostanti.
Chiavi e gestione delle chiavi
Mentre JCE protegge le operazioni di crittografia e la generazione delle chiavi, è compito dello sviluppatore gestire effettivamente le proprie chiavi. Maggiori informazioni devono essere fornite qui.
Una best practice comunemente accettata per la gestione delle chiavi in fase di esecuzione è quella di archiviarle solo come array di byte
e mai come stringhe. Questo perché le stringhe Java sono immutabili e non possono essere "cancellate" o "azzerate" manualmente in memoria; mentre un riferimento a una stringa può essere rimosso, la stringa esatta rimarrà in memoria fino a quando il suo segmento di memoria non viene raccolto e riutilizzato. Un utente malintenzionato avrebbe una grande finestra in cui è possibile scaricare la memoria del programma e trovare facilmente la chiave. Al contrario, gli array di byte
sono mutabili e possono avere il loro contenuto sovrascritto sul posto; è una buona idea azzerare le tue chiavi non appena non ne hai più bisogno.
Vulnerabilità comuni di Java
Ha bisogno di contenuti
Preoccupazioni di rete
Ha bisogno di contenuti
Casualità e tu
Ha bisogno di contenuti
Per la maggior parte delle applicazioni, la classe java.utils.Random
è una fonte perfetta di dati "casuali". Se devi scegliere un elemento casuale da un array, o generare una stringa casuale, o creare un identificatore "univoco" temporaneo, dovresti probabilmente usare Random
.
Tuttavia, molti sistemi crittografici si affidano alla casualità per la loro sicurezza e la casualità fornita da Random
non è semplicemente di qualità sufficientemente alta. Per qualsiasi operazione di crittografia che richiede un input casuale, è consigliabile utilizzare SecureRandom
.
Hashing e convalida
Più informazioni necessarie
Una funzione hash crittografica è un membro di una classe di funzioni con tre proprietà vitali; coerenza, unicità e irreversibilità.
Coerenza: dati gli stessi dati, una funzione di hash restituirà sempre lo stesso valore. Cioè, se X = Y, f (x) sarà sempre uguale a f (y) per la funzione hash f.
Unicità: non ci saranno mai due input per una funzione hash nello stesso output. Cioè, se X! = Y, f (x)! = F (y), per qualsiasi valore di X e Y.
Irreversibilità: è difficile, se non impossibile, "invertire" una funzione hash. Cioè, dato solo f (X), non dovrebbe esserci modo di trovare l'X originale in corto di mettere ogni possibile valore di X attraverso la funzione f (forza bruta). Non dovrebbe esserci alcuna funzione f1 tale che f1 (f (X)) = X.
Molte funzioni non hanno almeno uno di questi attributi. Ad esempio, MD5 e SHA1 sono noti per avere collisioni, cioè due ingressi che hanno lo stesso output, quindi mancano di unicità. Alcune funzioni che si ritiene attualmente siano sicure sono SHA-256 e SHA-512.