Intro à Jasypt

1. Vue d’ensemble

Dans cet article, nous examinerons la bibliothèque Jasypt (Java Simplified Encryption).

Jasypt est une bibliothèque Java qui permet aux développeurs d’ajouter des fonctionnalités de chiffrement de base aux projets avec un minimum d’effort et sans avoir besoin de connaissances approfondies sur les détails de mise en œuvre des protocoles de chiffrement.

2. Utilisation du cryptage simple

Considérez que nous construisons une application Web dans laquelle l’utilisateur soumet des données privées de compte. Nous devons stocker ces données dans la base de données, mais il ne serait pas sûr de stocker du texte brut.

Une solution consiste à stocker des données chiffrées dans la base de données et à les déchiffrer lors de la récupération des données pour un utilisateur particulier.

Pour chiffrer et déchiffrer en utilisant un algorithme très simple, nous pouvons utiliser une classe BasicTextEncryptor de la classe Jas bibliothèque:

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

Ensuite, nous pouvons utiliser une méthode encrypt () pour chiffrer le texte brut:

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

Si nous voulons stocker des données privées pour un utilisateur donné dans la base de données, nous pouvons stocker un myEncryptedText sans violer les restrictions de sécurité. Si nous voulons déchiffrer les données en texte brut, nous pouvons utiliser une méthode decrypt () :

String plainText = textEncryptor.decrypt(myEncryptedText);

assertEquals(plainText, privateData);

Nous voyons que les données déchiffrées sont égales aux données en texte brut qui étaient auparavant chiffrées.

3. Cryptage unidirectionnel

L’exemple précédent n’est pas un moyen idéal pour effectuer une authentification, c’est-à-dire lorsque nous souhaitons stocker un mot de passe d’utilisateur. Idéalement, nous souhaitons chiffrer le mot de passe sans le décrypter. Lorsque l’utilisateur tente de se connecter à notre service, nous cryptons son mot de passe et le comparons avec le mot de passe crypté stocké dans la base de données. De cette façon, nous n’avons pas besoin d’opérer avec un mot de passe en texte brut.

Nous pouvons utiliser une classe BasicPasswordEncryptor pour effectuer le chiffrement à sens unique:

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

Ensuite, nous pouvons comparer un mot de passe déjà chiffré avec le mot de passe d’un utilisateur qui exécute un processus de connexion sans avoir à déchiffrer le mot de passe déjà stocké dans la base de données:

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

assertTrue(result);

4. Configuration de l’algorithme pour le chiffrement

Nous pouvons utiliser un algorithme de cryptage plus puissant, mais nous devons nous rappeler d’installer Java Cryptography Extension (JCE), stratégie de compétence illimitée en matière de compétence. Fichiers pour notre machine virtuelle Java (les instructions d’installation sont incluses dans le téléchargement).

En Jasypt, nous pouvons utiliser un chiffrement fort en utilisant une classe StandardPBEStringEncryptor et le personnaliser à l’aide d’une méthode setAlgorithm () :

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

Définissons l’algorithme de chiffrement sur PBEWithMD5AndTripleDES.

Ensuite, le processus de chiffrement et de déchiffrement a le même aspect que le précédent utilisant une classe BasicTextEncryptor :

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

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

5. Utilisation du décryptage multi-thread

Lorsque nous travaillons sur la machine multicœur, nous souhaitons gérer le traitement du déchiffrement en parallèle. Pour obtenir de bonnes performances, nous pouvons utiliser un PooledPBEStringEncryptor et l’API setPoolSize () créer un pool de digesteurs. Chacun d’eux peut être utilisé par les différents threads en parallèle:

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

Il est judicieux de définir la taille du pool pour qu’elle soit égale au nombre de cœurs de la machine. Le code pour le cryptage et le décryptage est le même que les précédents.

6. Utilisation dans d’autres cadres

Une dernière note rapide est que la bibliothèque Jasypt peut être intégrée à de nombreuses autres bibliothèques, y compris bien sûr le Spring Framework.

Nous avons seulement besoin de créer une configuration pour ajouter la prise en charge du cryptage à notre application Spring. Et si nous voulons stocker des données sensibles dans la base de données et que nous utilisons Hibernate comme cadre d’accès aux données, nous pouvons également y intégrer Jasypt .

Des instructions sur ces intégrations, ainsi que sur d’autres frameworks, sont disponibles dans la section Guides de la page d’accueil Jasypt ].

7. Conclusion

Dans cet article, nous examinions la bibliothèque Jasypt , qui nous aide à créer des applications plus sécurisées en utilisant des algorithmes de cryptographie déjà bien connus et testés. Il est recouvert d’une API simple et facile à utiliser.

Vous trouverez la mise en œuvre de tous ces exemples et extraits de code dans le projet GitHub . Il s’agit d’un projet Maven. courir comme il est.