Cryptographie en Java : chiffrement et hachage
Dans le monde moderne de la sécurité de l'information, la cryptographie joue un rôle clé. Java fournit des outils intégrés puissants pour la mise en œuvre d'opérations cryptographiques via Java Cryptography Architecture (JCA) et Java Cryptography Extension (JCE). Dans cet article, nous allons détailler les mécanismes principaux : le chiffrement symétrique, le chiffrement asymétrique et le hachage, et fournir des exemples pratiques de code.
Concepts fondamentaux de la cryptographie
Avant de passer au code, il est important de comprendre la différence entre les primitives cryptographiques de base :
- Chiffrement symétrique — utilise la même clé pour chiffrer et déchiffrer les données. Rapide, mais nécessite une transmission sécurisée de la clé.
- Chiffrement asymétrique — utilise une paire de clés : une clé publique (pour le chiffrement) et une clé privée (pour le déchiffrement). Plus lent, mais résout le problème de l'échange de clés.
- Hachage — transformation irréversible des données en une chaîne de longueur fixe. Utilisé pour vérifier l'intégrité et stocker les mots de passe.
Chiffrement symétrique AES en Java
AES (Advanced Encryption Standard) est l'algorithme symétrique le plus populaire. En Java, on l'utilise via la classe Cipher. Voici un exemple de chiffrement et déchiffrement d'une chaîne :
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;
public class AesExample { public static void main(String[] args) throws Exception { // Génération d'une clé AES-128 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); // Message original String originalMessage = "Bonjour, cryptographie !"; System.out.println("Message original : " + originalMessage); // Chiffrement Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes("UTF-8")); String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Message chiffré : " + encryptedMessage); // Déchiffrement cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage)); String decryptedMessage = new String(decryptedBytes, "UTF-8"); System.out.println("Message déchiffré : " + decryptedMessage); }}Dans l'exemple, le mode ECB (Electronic Codebook) est utilisé avec le complément PKCS5Padding. Pour la production, il est recommandé d'utiliser des modes plus sécurisés comme CBC ou GCM.
Chiffrement asymétrique RSA
RSA est un algorithme asymétrique classique. En Java, on utilise les classes KeyPairGenerator et Cipher. Il est important de noter : RSA ne peut chiffrer que des données jusqu'à la taille de la clé (généralement 2048 bits). Pour de grands volumes de données, RSA est combiné avec le chiffrement symétrique (schéma hybride).
import javax.crypto.Cipher;import java.security.*;import java.util.Base64;
public class RsaExample { public static void main(String[] args) throws Exception { // Génération d'une paire de clés RSA-2048 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String secretMessage = "Données secrètes"; System.out.println("Message original : " + secretMessage); // Chiffrement avec la clé publique