Première approche de chiffrement sur IBM i DB2
mer 25 septembre 2019Sur IBM i, les données sensibles sont souvent stockées depuis des années dans des fichiers physiques devenus critiques, sans chiffrement ni contrôle fin des accès. Pourtant, Db2 for i propose plusieurs mécanismes pour protéger ces informations, dont des fonctions SQL de chiffrement simples à mettre en œuvre. Cet article propose une première approche pratique, sans prétendre couvrir toutes les options de sécurité possibles sur la plateforme.
Les exemples présentés dans cet article ont été testés sur IBM i 7.1, avec la base intégrée Db2 for i. Ils restent en grande partie transposables sur des versions plus récentes (7.2, 7.3, 7.4, 7.5), mais certains détails peuvent varier selon votre environnement.
Pourquoi chiffrer les données sur IBM i ?
Les applications IBM i manipulent de plus en plus de données sensibles : informations personnelles, coordonnées bancaires, données de santé, etc. Dans beaucoup de systèmes historiques, ces données sont stockées en clair dans les tables ou fichiers physiques, accessibles à de nombreux programmes batch, interfaces 5250 ou outils de requête.
Même avec des profils utilisateurs bien gérés, des droits *PUBLIC limités et des journaux d’audit activés, les risques restent importants : extraction massive par un compte puissant, copie de fichiers, fuite après sauvegarde non chiffrée. Le chiffrement ajoute une couche de protection supplémentaire, en rendant l’information illisible sans la clé adéquate.
Dans cette première approche, on se concentre sur le chiffrement au niveau colonne via SQL, sans aborder les solutions plus avancées (FieldProc, gestion de clés centralisée, HSM, etc.).
Panorama rapide des options de chiffrement Db2 for i
Avant d’entrer dans le code, il est utile de situer les principales options existantes sur Db2 for i (liste non exhaustive, à adapter selon la version IBM i) :
- Fonctions SQL de chiffrement (ENCRYPT_xxx / DECRYPT_xxx)
Chiffrement au niveau colonne, piloté par des instructions SQL, souvent le point d’entrée le plus simple pour un développeur SQL/RPG. - Field Procedures (FieldProc)
Mécanisme Db2 for i permettant de chiffrer automatiquement une colonne de table, de façon transparente pour la plupart des programmes, au prix d’une configuration plus poussée. - APIs cryptographiques IBM i
Ensemble d’APIs (Qc3…) offrant un contrôle fin du chiffrement au sein des programmes RPG, C, etc., avec une vraie logique de gestion de clés, mais une mise en œuvre plus technique. - Chiffrement au niveau système / stockage
Solutions visant les bibliothèques, fichiers, ASP ou l’IFS, utiles pour protéger les données « au repos », mais qui ne remplacent pas le chiffrement logique des colonnes.
Dans cet article, on se limite volontairement aux fonctions SQL de chiffrement/déchiffrement pour illustrer la démarche, sans entrer dans la gestion avancée des clés.
Pré-requis et contexte technique
Avant de tester, quelques pré-requis à vérifier :
- Version IBM i 7.1 minimum
- Type de données à chiffrer
Les fonctions SQL de chiffrement attendent un format précis (CHAR, VARCHAR, éventuellement CCSID particulier). Il peut être nécessaire de caster les colonnes avant chiffrement. - Droits et environnement
Le développeur doit disposer des droits nécessaires pour créer/altérer des tables, exécuter des fonctions SQL, et tester sur un environnement non productif.
Exemple simple : chiffrer une colonne en SQL
1. Poser le mot de passe de chiffrement
Avant de chiffrer, tu poses le mot de passe de session :
SET ENCRYPTION PASSWORD = 'PHRASE_SECRETE';L’instruction SET ENCRYPTION PASSWORD définit un mot de passe de chiffrement au niveau de la session SQL. Les fonctions de chiffrement comme ENCRYPT_TDES utiliseront ce mot de passe par défaut, sauf si un autre est passé explicitement en paramètre.
Avec WITH HINT pour ajouter une aide pour se souvenir du mot de passe
SET ENCRYPTION PASSWORD = 'PHRASE_SECRETE' WITH HINT 'Indice pour se souvenir';2. Chiffrer la donnée avec ENCRYPT_TDES
SET ENCRYPTION PASSWORD = ‘PHRASE_SECRETE’; INSERT INTO Client_Moyen_paiement VALUES(‘JOSHUA’, ENCRYPT_TDES(‘1111222233334444’));
ENCRYPT_TDESchiffre la chaîne passée en paramètre en utilisant l’algorithme Triple DES (3DES).- Si tu ne passes pas de mot de passe en deuxième paramètre, c’est le mot de passe de session défini par
SET ENCRYPTION PASSWORDqui est utilisé. - La colonne correspondante dans
Client_Moyen_paiementdoit être définie avec une longueur suffisante pour stocker la valeur chiffrée.
Dans cet exemple, la colonne NUM_CARTE ne stocke plus le numéro de carte en clair, mais le résultat de ENCRYPT_TDES. La valeur est illisible sans connaître le mot de passe de chiffrement et utiliser la fonction de déchiffrement correspondante.
Lecture de la donnée chiffrée avec DECRYPT_CHAR
Après avoir inséré la donnée chiffrée dans Client_Moyen_paiement, on peut la relire en clair avec DECRYPT_CHAR. On doit d’abord redéfinir le même mot de passe de chiffrement pour la session.
-- 1. Reposer le mot de passe de chiffrement pour la session
SET ENCRYPTION PASSWORD = 'PHRASE_SECRETE';
-- 2. Lire la donnée en clair à partir de la colonne chiffrée
SELECT
CLIENT,
DECRYPT_CHAR(MOYEN_PAIEMENT) AS NUM_CARTE_LISIBLE
FROM Client_Moyen_paiement
WHERE CLIENT = 'JOSHUA';L’instruction SET ENCRYPTION PASSWORD doit utiliser la même phrase secrète que celle employée lors du chiffrement, sinon la fonction DECRYPT_CHAR ne pourra pas retrouver la valeur d’origine. La table stocke toujours uniquement le résultat de ENCRYPT_TDES, mais la requête SQL reconstitue la donnée lisible à la volée pour les sessions qui connaissent le bon mot de passe.
Phrase secrète
- Éviter la phrase secrète en dur dans le code
Dans les exemples ci-dessus, la phrase secrète apparaît en clair pour des raisons pédagogiques. En production, il est fortement recommandé de ne jamais stocker cette passphrase en dur dans les sources SQL ou les scripts de déploiement, mais de la récupérer depuis un mécanisme sécurisé (fichier de configuration protégé, variable d’environnement, coffre-fort à secrets, etc.).
- Limiter la visibilité dans le code SQL Db2 for i
Sur IBM i, il est également possible d’obfusquer le code SQL (fonction WRAP) afin d’éviter que la phrase secrète apparaisse en clair lorsqu’on récupère le source d’une fonction ou d’une procédure. Cela ne remplace pas une vraie gestion de clés, mais limite l’exposition accidentelle du secret dans les outils de développement.
Ci-dessous le document qui a servi à écrire cet article et pour aller plus loin :
Et pour aller encore plus loin, les documents suivant dont un Redbook un peu ancien :
Protecting i5/OS data with encryption
IBM System i Security : Protecting i5/OS Data with Encryption

