Comme vous l’avez peut-être remarqué il y a quelque temps, 4D vous offre un moyen simple de crypter vos données. Désormais, 4D vous permet également d’utiliser le même algorithme que celui utilisé pour le cryptage des données, mais cette fois pour vos propres besoins. Vous pouvez donc désormais crypter et décrypter toutes les informations que vous souhaitez, qu’il s’agisse d’un simple champ dans un tableau ou de fichiers externes.
Remarque: pour illustrer les nouvelles commandes présentées dans ce billet de blog, voici un IDH contenant de fausses analyses médicales et leurs rapports PDF externes. Dans cet IDH, les rapports sont chiffrés et vous les déchiffrez pour obtenir des documents lisibles.
Devenir plus fort
De nos jours, de plus en plus de données critiques doivent être cryptées pour éviter le piratage ou les fuites de données. En vous permettant de chiffrer facilement les tableaux, 4D a déjà répondu à ce besoin principal. Mais parfois, vous avez besoin de crypter uniquement un champ dans un tableau, ou des fichiers externes liés à des enregistrements tels que des rapports, des factures ou des analyses médicales. Vous pouviez déjà le faire en utilisant la classe 4D.CryptoKey, mais les algorithmes asymétriques sont plus adaptés à des fins de signature d’information. Nous vous offrons maintenant la possibilité de crypter vos propres données ou fichiers avec un puissant algorithme symétrique AES-256, le même que celui utilisé par 4D pour le cryptage des données et des journaux.
Derrière les rideaux
La nouvelle commande Encrypt data BLOB récupère un blob et calcule un blob crypté à l’aide de paramètres tels qu’un objet passe-partout et un sel.
Un objet de passage de clé est un objet résultant d’un New data key appel de commande. Vous pouvez également utiliser directement une phrase de passe au lieu d’un objet key pass. Comme 4D utilise un algorithme de type AES pour le cryptage, le blob résultant a une taille multiple de 16 octets. Ainsi, si la taille du blob d’origine n’est pas un multiple de 16, la commande ajoutera des octets nuls terminaux pour la compléter.
Pour l’opération inverse, la nouvelle commande Decrypt data BLOB reçoit un blob crypté et calcule un blob décrypté en utilisant les mêmes paramètres. Attention cependant, si les paramètres n’ont pas exactement les mêmes valeurs que ceux utilisés lors du chiffrement, le blob déchiffré ne sera pas le même que celui d’origine. En fait, c’est le comportement attendu de la cryptographie !
Le sel n’est pas si mauvais
L’utilisation de sel est un moyen de s’assurer que les données originales ne peuvent pas être récupérées à partir de données cryptées. Une façon de pirater les données est l’analyse de fréquence, c’est-à-dire la comparaison des informations cryptées avec des informations originales très similaires. Lorsque vous chiffrez les mêmes informations avec la même phrase de passe mais des sels différents, l’empreinte digitale (informations chiffrées) sera complètement différente.
Le sel est plus pertinent car ses valeurs sont multiples. Par exemple, lorsque vous cryptez un champ ou un fichier lié à un enregistrement, vous pouvez facilement utiliser la clé primaire comme sel. De cette façon, même si le contenu original du champ ou du fichier est le même pour plusieurs enregistrements, le contenu crypté sera complètement différent.
EXEMPLE DE CRYPTAGE DE FICHIER
Pour gérer facilement le cryptage et le décryptage de fichiers avec récupération de la taille originale, vous pouvez utiliser les méthodes suivantes.
Ces méthodes gèrent le complément de 16 octets en stockant la taille originale du fichier dans le fichier crypté lui-même afin qu’elle puisse être facilement récupérée lors du décryptage.
//encryptFile
#DECLARE($originalFile : 4D .File; $passPhrase : Text ; $salt : Integer ; $encryptedFile : 4D .File)->$result : Boolean
// AES-type encryption : as resulting blob size is a multiple of 16 bytes, some final null bytes may be added.
var $fileContent ; $blobToEncrypt; $blobEncrypted : Blob
var $contentLength ; $offset : Integer
$fileContent:=$originalFile.getContent()
// Store original file length at the beginning of the blob to encrypt
$contentLength :=BLOB size($fileContent)
VARIABLE TO BLOB ($contentLength; $blobToEncrypt; $offset)
COPY BLOB ($fileContent; $blobToEncrypt; 0 ; $offset; $contentLength)
$result :=Encrypt data BLOB($blobToEncrypt; $passPhrase; $salt; $blobEncrypted)
If ($result)
$encryptedFile .setContent($blobEncrypted)
End if
//decryptFile
#DECLARE($encryptedFile : 4D .File; $passPhrase : Text ; $salt : Integer ; $decryptedFile : 4D .File)->$result: Boolean
// AES-type decryption : as encrypted blob size is a multiple of 16 bytes, some final null bytes may have been added.
var $fileContent ; $blobToDecrypt; $blobDecrypted : Blob
var $contentLength ; $offset : Integer
$blobToDecrypt:=$encryptedFile.getContent()
$result :=Decrypt data BLOB($blobToDecrypt; $passPhrase; $salt; $blobDecrypted)
If ($result)
// Retrieve original file length at the beginning of the decrypted blob
BLOB TO VARIABLE ($blobDecrypted; $contentLength; $offset)
COPY BLOB ($blobDecrypted; $fileContent; $offset; 0 ; $contentLength)
$decryptedFile .
setContent($fileContent)
End if
CAS D’UTILISATION
Pour illustrer comment vous pouvez utiliser ces nouvelles commandes, voici une IDH contenant de fausses analyses médicales et leurs rapports PDF externes. Dans cet IDH, les rapports sont chiffrés et vous les déchiffrez pour obtenir des documents lisibles.
Maintenant, c’est à vous de crypter et décrypter les données comme le fait 4D !