Chiffrement des données

Bonjour!

Non, rien de nouveau sur le chiffrement des données, le contenu du post que vous citez est toujours d’actualité.

Vous pouvez utilisez le pattern “CustomObjectDB” pour enrichir les fonctionnalités d’ObjectDB : vous pouvez faire hériter tous vos objets d’une classe intermédiaire.

ObjectDB <— {EncryptedObjectDB <----} DemoSupplier

Exemple:

Implémentation

package com.simplicite.commons.Cryptomator;

import java.util.*;

import com.simplicite.util.*;
import com.simplicite.util.exceptions.*;
import com.simplicite.util.tools.*;


public class EncryptedObjectDB extends ObjectDB {
	private static final long serialVersionUID = 1L;

	// based on https://docs.simplicite.io/documentation/01-core/advanced-code-examples.md#encryption
	@Override
	public String preSave(){
		for(ObjectField f : getFields())
			try{
				if(isEncrypted(f))
					f.setValue(EncryptionTool.encrypt(f.getValue(), getEncryptionKey()));
			}
			catch(EncryptionException e){
				AppLog.error(e, getGrant());	
			}
		
		return super.preSave();
	}
	
	@Override
	public void postSelect(String rowId, boolean copy){
		for(ObjectField f : getFields())
			try{
				if(isEncrypted(f))
					f.setValue(EncryptionTool.decrypt(f.getValue(), getEncryptionKey()));
			}
			catch(EncryptionException e){
				AppLog.error(e, getGrant());	
			}
		
		super.postSelect(rowId, copy);
	}
	
	private static boolean isEncrypted(ObjectField f){
		return !f.isEmpty() && "CONFIDENTIAL".equals(f.getClassification());
	}
	
	private static String getEncryptionKey(){
		// DO NOT STORE THE KEY IN THE DATABASE
		return System.getProperty("encryption.key"); // Simplicite012345
	}
}

Dans le cas d’une instance déployée avec Docker, il faudrait passer la clef de chiffrement par, au choix:

  • un fichier sur un volume, par
  • une propriété java : -e JAVA_OPTS="-Dencryption.key=Simplicite012345"
  • une variable d’environnement

Voir aussi les exemples dans la doc sur le sujet.

Utilisation

Pour crypter par exemple le champ “email” du supplier de la démo, il faut

  1. faire hériter DemoSupplier de EncryptedObjectDB
package com.simplicite.objects.Demo;
public class DemoSupplier extends com.simplicite.commons.Cryptomator.EncryptedObjectDB {
	private static final long serialVersionUID = 1L;
}
  1. changer le paramètrage du champ (on a utilisé le caractère de donnée confidentielle ou non, pour l’exemple, c’est un détournement du méta-modèle, et il faut augmenter la taille de la colonne, les données prennent plus de place en base une fois chiffrées)

PS: Attention à la reprise de données!

Avertissement (17/10/22)

Ceci est un exemple, à implémenter avec délicatesse. Voir le post ci-dessous pour quelques conseils supplémentaires.

https://community.simplicite.io/t/probleme-sur-le-dechiffrage-de-certains-champs-herites/5364/5

1 Like