Cryptographie en Java : chiffrement et hachage — guide détaillé
Dans le monde moderne de la sécurité de l'information, la cryptographie est le fondement de la protection des données. Java fournit une boîte à outils intégrée puissante pour implémenter le chiffrement et le hachage via les packages javax.crypto et java.security. Dans cet article, nous examinerons en détail les principales opérations cryptographiques en Java : le chiffrement symétrique et asymétrique, le hachage de mots de passe et le travail avec les signatures numériques.
1. Bases de la cryptographie en Java
Java Cryptography Architecture (JCA) est un framework qui permet aux développeurs d'intégrer facilement des algorithmes cryptographiques. Classes clés :
javax.crypto.Cipher— pour le chiffrement et le déchiffrement.java.security.MessageDigest— pour le hachage.java.security.KeyPairGenerator— pour la génération de clés.javax.crypto.spec.SecretKeySpec— pour la création de clés symétriques.
Pour travailler avec la cryptographie, importez :
import javax.crypto.*;import javax.crypto.spec.*;import java.security.*;2. Chiffrement symétrique (AES)
Le chiffrement symétrique utilise une seule clé pour le chiffrement et le déchiffrement. AES (Advanced Encryption Standard) est l'algorithme le plus populaire. Exemple de chiffrement d'une chaîne :
import javax.crypto.*;import javax.crypto.spec.*;import java.util.Base64;
public class AesExample { public static void main(String[] args) throws Exception { String plainText = "Message secret"; String secretKey = "0123456789abcdef"; // 16 octets pour AES-128
// Création de la clé SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// Chiffrement cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes()); String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Chiffré : " + encryptedText);
// Déchiffrement cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText)); String decryptedText = new String(decryptedBytes); System.out.println("Déchiffré : " + decryptedText); }}Important : Le mode ECB n'est pas recommandé pour de grands volumes de données. Utilisez AES/GCM/NoPadding pour une meilleure sécurité.
3. Chiffrement asymétrique (RSA)
Le chiffrement asymétrique utilise une paire de clés : une publique (pour le chiffrement) et une privée (pour le déchiffrement). RSA est l'algorithme classique. Exemple :
import javax.crypto.*;import java.security.*;import java.util.Base64;
public class RsaExample { public static void main(String[] args) throws Exception { // Génération de la paire de clés KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair pair = keyGen.generateKeyPair(); PublicKey publicKey = pair.getPublic(); PrivateKey privateKey = pair.getPrivate();
// Chiffrement avec la clé publique Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedBytes = cipher.doFinal("Données secrètes".getBytes()); String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Chiffré RSA : " + encryptedText);
// Déchiffrement avec la clé privée cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));