FIELDPROC , Cryptage de colonne sous DB2.


 

La version 7 de DB2 propose une nouvelle fonctionnalité permettant de crypter le contenu d'une colonne par le nouveau mot-clé FIELDPROC ajouté aux ordres SQL CREATE TABLE et ALTER TABLE

 Create table fieldtable              
(cle integer ,
zone char(200) FIELDPROC fieldproc1)

sous System i navigator :

ACS

La zone cryptée ne peut pas être :

Programmation :

  1. une zone fonction indiquant le contexte
    8 = appel lors de la création
    0 = appel pour crypter
    4 = appel pour décrypter
  2. une structure décrivant les paramètres
  3. une structure décrivant la valeur en clair
  4. la valeur en clair
  5. une structure décrivant la valeur cryptée
  6. la valeur cryptée
  7. SQLCODE (doit commencer par 38, si erreur, 00000 dans le cas contraire)
  8. message complémentaire si SQLCODE <> '00000'

Exemple avec un pgm qui inverse les bits (fonction RPG %BITNOT) sur une zone CHAR
 et ne décrypte que si c'est QSECOFR qui lit.

(pour les structures, voir le code complet fourni en exemple)

      /free
select;
when fonction = 8; // création
// le type retourné est le même, donc copie de la définition
encoded_attr= decoded_attr;
when fonction = 0; // INSERT => encodage
lg = decoded_attr.sqlfpLength;
transforme(decoded_Data : encoded_Data : lg);
when fonction = 4 ; // SELECT => decodage
lg = encoded_attr.sqlfpLength;
if profil = 'QSECOFR';
transforme(encoded_Data : decoded_Data : lg);
else;
%subst(decoded_Data:1:lg) = %subst(encoded_Data:1:lg);
endif;
other ;
SQLSTATE = '38001';
message = 'demande inconnue';
ENDSL;
*inlr = *on;
/end-free
* procédure de codage, inverse tous les bits,x'00 devient x'FF', etc ...
* (algorithme trop simple pour utiliser en production)
Ptransforme B
D PI
D data1 32767
D data2 32767
D lg 5I 0
D i S 5I 0
/free
for i = 1 to lg;
// la doc déconseille de crypter les espaces
if %subst(data1 : i : 1) = ' ';
%subst(data2:i:1) = %subst(data1:i:1);
else;
%subst(data2:i:1) = %bitnot(%subst(data1:i:1));
endif;
ENDFOR;
/end-free
ptransforme E

puis

 Insert into fieldtable values
(1 , 'coucou')
Insert into fieldtable values
(2 , 'autre test')

SELECT * FROM FIELDTABLE, sous QSECOFR

Sous un autre profil (ici, avec System i navigator)

 

Quelques remarques

- La documentation vous déconseille de crypter le caractère espace

en effet quand vous comparez à la zone, une constante plus courte, le système complète l'information la plus petite par des espaces.

  si les espaces de la zone sont cryptés, du coup la donnée sera considérée comme différente de la constante alors qu'en réalité ce n'est pas le cas.


- les tris peuvent être perturbés sur une zone cryptée :

ex SELECT *FROM FIELDTABLE ORDER BY ZONE

-> sous QSECOFR (la zone est décryptée)

-> sous un autre profil (la zone reste cryptée)

- lors d'un CPYF la procédure sera appelée (même sur DSPPFM), ainsi que lors d'un CREATE TABLE AS (SELECT ...)

- une option de QAQQINI destinée à l'optimiseur, indique si la zone doit être décryptée systématiquement :
     FIELDPROC_ENCODED_COMPARISON :


 

(C) Volubis 2010