Chiffrement des données

Bonjour,

Dans le cadre de l’un de nos projets nous devons chiffrer un certain nombre de champs en base de données.
D’après le post suivant Cryptage des données le chiffrement doit être ajouté à “la main” dans les hooks preSave et postSearch.
Dans notre cas nous avons beaucoup de champs à chiffrer. Est-ce que depuis 2017 des évolutions ont été réalisées sur ce sujet ?
Est-ce qu’il existe un autre moyen pour mettre en place le chiffrement plus rapidement, avec du paramétrage et non du code par exemple afin de dire quel champ doit être chiffré ou non ?

Merci d’avance

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

Merci Simon pour cette réponse très complète :slight_smile:

Quel est le rôle du champ “classification” ? Est-ce que c’est juste en champ “information” qui n’a pas d’impact sur le comportement de l’attribut ?

Bonjour Florent,

C’est purement à titre d’information, il me semble que ça avait été mis en place pour identifier des attributs sujets à la RGPD.

Bonjour Alistair,

Dac’, merci

[Message prédéfini]

Nous conseillons aux utilisateurs de marquer comme “solution” la réponse résolvant leur problématique pour permettre au support de mieux suivre les sujets non résolus, et à la communauté de trouver plus facilement la bonne réponse.

Vos messages indiquant une résolution du problème, nous avons réalisé cette opération pour vous.

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.