Librerie di Crittografia in Java
Le principali librerie di crittografia in java usano l’architettura JCA e l’estensione JCE, vediamo adesso in dettaglia cosa sono e come sono fatte.
JCA e JCE
Java Cryptography Architecture (JCA)
La Java Cryptography Architecture (JCA) è un framework Java, incluso nel JDK, che permette di eseguire operazioni crittografiche, basato su principi di:
- Indipendenza dall’implementazione
- Interoperabilità delle implementazioni
- Indipendenza e estendibilità degli algoritmi
Java Cryptography Extension (JCE)
La Java Cryptography Extension (JCE) implementa in modo completo le funzionalità di cifratura e decifrazione dichiarate dalla JCA, offrendo il supporto all’utilizzo di cifrari simmetrici a blocco e a flusso, cifrari asimmetrici e cifrari con password tutti applicabili a Dati, Serializable Objects e I/O stream.
Java Cryptography Architecture (JCA)
La Java Cryptography Architecture (JCA) è un framework Java, incluso nel JDK, che permette di eseguire operazioni crittografiche, basato su principi di:
- Indipendenza dall’implementazione
- Interoperabilità delle implementazioni
- Indipendenza e estendibilità degli algoritmi
Indipendenza dall’implementazione perché le applicazioni non hanno bisogno di implementare funzioni crittografiche, possono richiedere i servizi crittografici alla piattaforma Java, dove i servizi per le funzioni di sicurezza saranno implementati da diversi Provider.
I Provider stessi dovranno conformarsi a un’interfaccia comune, che permette alla piattaforma di fornire i servizi richiesti.
Interoperabilità perché i servizi forniti dalle diverse implementazioni devono essere interoperabili, è possibile ad esempio creare una chiave di firma con un’implementazione, usare un’implementazione diversa per firmare i documenti e una terza implementazione per verificare le firme. L’interoperabilità delle implementazioni è complementare all’indipendenza dalle stesse, si possono usare i servizi crittografici senza preoccuparsi di chi li implementa.
Indipendenza dagli algoritmi si ottiene attraverso la definizione di Servizi che forniscono le funzionalità di base necessarie alla crittografia come:
- Signature per la firma
- MessageDigest per le impronte
- KeyPairGenerator per le coppie di chiavi
- KeyFactory per la chiavi simmetriche
- Cipher per la cifratura
- MAC
- …
L’indipendenza dall’implementazione è ottenuta aggiungendo alla piattaforma dei plugin chiamati CSP (Cryptographic Service Provider) o semplicemente Provider. Ogni Provider fornisce uno o più Servici per determinati algoritmi, l’interoperabilità degli algoritmi garantisce che i Servizi forniti da Provider diversi ma relativi allo stesso algoritmo possano cooperare.
Estendibilià degli algoritmi è il principio di estendibilità su cui è basata la piattaforma JCA, implica che nuovi algoritmi possono essere aggiunti facilmente, l’unico requisito è che siano uniformabili a uno dei Servizi previsti: Cipher, MessageDigest etc.
Architettura JCA
L’architettura JCA è composta dalle seguenti componenti:
- Factory pattern che definisce un interfaccia per la creazione di un oggetto ma lascia che le sottoclassi decidano quale classe istanziare, e l’istanza si ottiene con getInstance( ).
- Strategy pattern che astrae una famiglia di algoritmi, li incapsula e li rende interscambiabili, permettendo all’utente di scambiare gli algoritmi provenienti da provider diversi
Provider
Un Provider è un insieme di implementazioni di vari algoritmi.
Il provider SUN (sun.java.security.sun) incorpora i seguenti algoritmi:
- MD5, SHA-1
- DSA: firma, verifica e generazione delle chiavi, parametri
- Creazione di certificati X.509
- Generazione di numeri random proprietaria
- Keystore proprietario
Altri provider RSAJCA (com.sun.rsajca.Provider):
- Gestione chiavi RSA
- Firma digitale RSA con SHA-1 o MD5
Java Cryptography Extension (JCE)
La Java Cryptography Extension (JCE) implementa in modo completo le funzionalità di cifratura e decifrazione dichiarate dalla JCA, offrendo il supporto all’utilizzo di cifrari simmetrici a blocco e a flusso, cifrari asimmetrici e cifrari con password tutti applicabili a Dati, Serializable Objects e I/O stream.
Le sue classi principali di JCE sono:
- Cipher
- CipherInputStream / CipherOutputStream
- KeyGenerator
- SecretKeyFactory
- SealedObject
- MAC
Principali Provider per JCE sono:
- Provider “SunJCE”
- Algoritmi di cifratura (AES, DES, TripleDes, PBE, …)
- Modalità di cifratura (ECB, CBC, OFB, CFB, CTR, PCBC)
- Padding (NoPadding, PKCS5PADDING)
- Facilità per la conversione delle chiavi da oggetti Java in array di byte e viceversa
- KeyGenerator
- Algoritmi MAC
- Provider “BouncyCastle” (non integrato nel JDK “va installato”)
- Implementa ed estende le tecniche crittografiche definite dalla JCA e dalla JCE
- Implementazione alternativa degli algoritmi di cifratura (AES, DES, TripleDES, PBE, …)
- Algoritmi di cifratura asimmetrica (RSA, ElGamal)
- Algoritmi di firma digitale
- Padding (None, PKCS1PADDING)
- Facilità per diversi protocolli di KeyAgreement
- Facilità per utilizzare cifrari simmetrici a flusso e a blocchi
- Implementa ed estende le tecniche crittografiche definite dalla JCA e dalla JCE
Le API utilizzate dalle 2 architetture JCA e JCE sono:
- Package java.security:
- API per configurare JCA
- Configurare e interrogare i Provider
- Definizione generica di Service
- Classi statiche con metodi statici di configurazione
- Package javax.crypto
- API crittografiche (JCE)
- Definizione dei diversi Service (non implementazione degli algoritmi)
- Pattern Factory
In allegato una demo realizzata da me:
La relazione dove è presente quest’articolo:
Delitala_Oreste_Crittografia_Java_Relazione
Una breve presentazione sull’argomento: