Introduzione a Jasypt

1. Panoramica

In questo articolo, esamineremo la libreria Jasypt (Java Simplified Encryption).

Jasypt è una libreria Java che consente agli sviluppatori di aggiungere funzionalità di crittografia di base ai progetti con il minimo sforzo e senza la necessità di avere una conoscenza approfondita dei dettagli di implementazione dei protocolli di crittografia.

2. Utilizzo della crittografia semplice

Considera che stiamo creando un'applicazione web in cui l'utente invia i dati privati ​​di un account. Dobbiamo memorizzare quei dati nel database, ma non sarebbe sicuro memorizzare testo normale.

Un modo per gestirlo è archiviare dati crittografati nel database e decrittografarli durante il recupero di tali dati per un determinato utente.

Per eseguire la crittografia e la decrittografia utilizzando un algoritmo molto semplice, possiamo utilizzare una classe BasicTextEncryptor dalla libreria Jasypt:

BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); String privateData = "secret-data"; textEncryptor.setPasswordCharArray("some-random-data".toCharArray());

Quindi possiamo usare un metodo encrypt () per crittografare il testo normale:

String myEncryptedText = textEncryptor.encrypt(privateData); assertNotSame(privateData, myEncryptedText);

Se vogliamo memorizzare un dato privato per un determinato utente nel database, possiamo memorizzare un myEncryptedText senza violare alcuna restrizione di sicurezza. Se vogliamo decrittografare i dati in un testo normale, possiamo usare un metodo decrypt () :

String plainText = textEncryptor.decrypt(myEncryptedText); assertEquals(plainText, privateData);

Vediamo che i dati decrittografati sono uguali ai dati di testo normale che erano stati precedentemente crittografati.

3. Crittografia unidirezionale

L'esempio precedente non è un modo ideale per eseguire l'autenticazione, ovvero quando vogliamo memorizzare una password utente. Idealmente, vogliamo crittografare la password senza un modo per decrittografarla. Quando l'utente tenta di accedere al nostro servizio, crittografiamo la sua password e la confrontiamo con la password crittografata memorizzata nel database. In questo modo non è necessario operare su password in testo normale.

Possiamo usare una classe BasicPasswordEncryptor per eseguire la crittografia unidirezionale:

String password = "secret-pass"; BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor(); String encryptedPassword = passwordEncryptor.encryptPassword(password); 

Quindi, possiamo confrontare una password già crittografata con una password di un utente che esegue il processo di accesso senza la necessità di decrittografare la password che è già memorizzata nel database:

boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword); assertTrue(result);

4. Configurazione dell'algoritmo per la crittografia

Possiamo utilizzare un algoritmo di crittografia più potente, ma dobbiamo ricordarci di installare i file della politica di giurisdizione di Java Cryptography Extension (JCE) Unlimited Strength per la nostra JVM (le istruzioni di installazione sono incluse nel download).

In Jasypt possiamo utilizzare una crittografia avanzata utilizzando una classe StandardPBEStringEncryptor e personalizzarla utilizzando un metodo setAlgorithm () :

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); String privateData = "secret-data"; encryptor.setPassword("some-random-passwprd"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Impostiamo l' algoritmo di crittografia su PBEWithMD5AndTripleDES.

Successivamente, il processo di crittografia e decrittografia ha lo stesso aspetto del precedente utilizzando una classe BasicTextEncryptor :

String encryptedText = encryptor.encrypt(privateData); assertNotSame(privateData, encryptedText); String plainText = encryptor.decrypt(encryptedText); assertEquals(plainText, privateData);

5. Utilizzo della decrittografia multi-thread

Quando operiamo su una macchina multi-core, vogliamo gestire l'elaborazione della decrittazione in parallelo. Per ottenere una buona prestazione possiamo usare un PooledPBEStringEncryptor e l' API setPoolSize () per creare un pool di digestori. Ciascuno di essi può essere utilizzato dai diversi thread in parallelo:

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setPoolSize(4); encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

È buona norma impostare la dimensione del pool in modo che sia uguale al numero di core della macchina. Il codice per la crittografia e la decrittografia è lo stesso dei precedenti.

6. Utilizzo in altri framework

Una rapida nota finale è che la libreria Jasypt può essere integrata con molte altre librerie, incluso ovviamente Spring Framework.

Dobbiamo solo creare una configurazione per aggiungere il supporto della crittografia alla nostra applicazione Spring. E se vogliamo archiviare dati sensibili nel database e stiamo usando Hibernate come framework di accesso ai dati, possiamo anche integrare Jasypt con esso.

Le istruzioni su queste integrazioni, così come con alcuni altri framework, possono essere trovate nella sezione Guide sulla home page di Jasypt.

7. Conclusione

In questo articolo, stavamo esaminando la libreria Jasypt che ci aiuta a creare applicazioni più sicure utilizzando algoritmi di crittografia già ben noti e testati. È coperto dalla semplice API che è facile da usare.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel progetto GitHub: questo è un progetto Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.