Java cryptografie met Jasypt

Cryptografie is niet triviaal en cryptografie in Java is geen uitzondering. Om een tekst te versleutelen is relatief veel code nodig en kennis van de javax.crypto API:

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public void crypto() throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
            InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

    byte[] salt = { (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03 };

    PBEKeySpec keySpec = new PBEKeySpec("password".toCharArray(), salt, 1000, 8);
    PBEParameterSpec paramSpec = new PBEParameterSpec(keySpec.getSalt(), keySpec.getIterationCount());

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBE");
    SecretKey key = keyFactory.generateSecret(keySpec);

    Cipher cipher = Cipher.getInstance(key.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

    byte encrypted[] = cipher.doFinal("clear text".getBytes());
    System.err.println(new String(encrypted));

    Cipher decipher = Cipher.getInstance(key.getAlgorithm());
    decipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

    byte decrypted[] = decipher.doFinal(encrypted);
    System.err.println(new String(decrypted));
}

Met Jasypt (Java Simplified Encryption) kan dit veel eenvoudiger:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimplePBEConfig;
import org.jasypt.salt.RandomSaltGenerator;
import org.jasypt.salt.SaltGenerator;

public void jasypt() {

    SaltGenerator saltGenerator = new RandomSaltGenerator();
    saltGenerator.generateSalt(8);

    SimplePBEConfig config = new SimplePBEConfig();
    config.setSaltGenerator(saltGenerator);
    config.setKeyObtentionIterations(1000);
    config.setPassword("password");

    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
    encryptor.setConfig(config);

    String encrypted = encryptor.encrypt("clear text");
    System.err.println(encrypted);

    String decrypted = encryptor.decrypt(encrypted);
    System.err.println(decrypted);
}

Merk op dat het aantal checked exceptions gereduceerd wordt van 7 (!!) naar 0, het aantal imports van 12 (!!) naar 4, dat de Jasypt API veel meer POJO/getter/setter georienteerd is, waardoor het – niet verwonderlijk – ook makkelijk te integreren is in een Spring of Seam applicatie.

De StandardPBEStringEncyptor heeft overigens goede standaard instellingen voor de meeste configurabele opties, waardoor het voorbeeld nog veel korter zou kunnen er er slechts twee a drie regels overblijven.

Tenslotte integreert Jasypt ook met Hibernate voor het versleuteld opslaan van database data.

Voeg de volgende dependency toe aan je Maven2 POM om Jasypt 1.6 op te nemen in je project:

<dependency>
  <groupId>org.jasypt</groupId>
  <artifactId>jasypt</artifactId>
  <version>1.6</version>
</dependency>
Dit artikel is geplaatst in java en getagged met , , , . Bookmark de permalink.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>