1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
' Anonymisation de données
' fonction de mélange de données assortie avec une fonction de cryptage
' ======================================================================
' sur une idée de Pc75 dont j'ai été le bras armé
' réalisé en faisant un assemblage de deux fonctions :
' crypter ( Marcel Hubiche )
' alea ( Hervé Inisan )
' =======================================================================
' objet : permet de 'mélanger' les données d'une table en vue d'une anonymisation des données
' le principe est on fait un update des champs en affectant au champ d'1 enregistrement la valeur du même champ, ou d'un autre
' mais issu d'un enregistrement choisi au hasard.
' pour les données vraiment sensibles il est possible en plus de crypter la donnée en fournissant une clé de cryptage
' (si c'est pas de l'anonymisation ça ! ya plus qu'à jeter l'éponge)
' contraintes : la table traitée doit avoir une valeur numérique en clé
' les paramètres :
' nom_cle_num as string: nom de l'indentifiant qui contient la valeur numérique ,
' nom_rubrique as string: nom du champ à traduire ou mélanger
' nom_table as string: nom de la table traitée
' valeur_cle_min as double: valeur minimale de la clé numerique ( pour le choix aleatoire de valeur ),
' valeur_cle_max as double:valeur max de la clé numerique ( pour le choix aleatoire de valeur )
' valeur_actuelle as double : valeur de la cle numerique ( pour le calcul aléatoire )
' celcryptage as string : chaine de caractère utilisée pour le cryptage
' si le cryptage n'est utiliser fournir une chaîne vide "" en paramètre - (j'aime pas optional )
' usage :
' update nomtable set <nomduchamp> = dfirst("ShakEtAnonimise('nomclenum','nomduchamp','nomtable', _
' (select min(<nomclenum>) from nomtable), _
' (select max(<nomclenum>) from nomtable), " & _
' <nomtable>.<nomclenum> & _
' 'vnrfjzaerfaerf')","<nomtable>")
'
' le dfirst est un artifice pour éviter le fameux message "utilisez une table qui peut être mise à jour"
'
Function ShakEtAnonimise(ByVal nomclenum As String, _
ByVal nom_rubrique As String, _
ByVal nom_table As String, _
ByVal valeur_cle_min As Double, _
ByVal valeur_cle_max As Double, _
ByVal valeur_actuelle As Double, _
ByVal clecryptage As String) As String
Dim intermed As String
Dim criteres As String
'
' on construit le critère de sélection
criteres = "[" & nomclenum & "]"
criteres = criteres & "<= forcealea( " & valeur_cle_min & "," & valeur_cle_max & "," & valeur_actuelle & "-1)"
'
' on regarde la dernière valeur trouvée
intermed = DLast(nom_rubrique, nom_table, criteres)
If clecryptage <> "" Then
ShakEtAnonimise = Crypter(intermed, clecryptage)
Else
ShakEtAnonimise = intermed
End If
End Function
' Fonction d 'alea
'==================
' FONCTION ALEA POUR REQUETE de Hervé Inisan
' ---
' Entrée : intInf <- Borne inférieure
' intSup <- Borne supérieure
' v <- Une valeur quelconque, ou un champ de requête
' Sortie : ForceAlea -> Nombre entier entre intInf et infSup compris
'
Function ForceAlea( _
ByVal intInf As Double, _
ByVal intSup As Double, _
ByVal v As Variant) As Double
Randomize
ForceAlea = Int(Rnd * (intSup - intInf + 1)) + intInf
End Function
' Fonction de cryptage
'=======================
Function Crypter(ByVal chaîneACrypter As String, ByVal clef As String) As String
'---------------------------------------------------------------------------------------
' Procedure : Crypter
' Créée le : lundi 18 juil 2005 18:51
' Auteur : Maxence HUBICHE
' Site : http://mhubiche.developpez.com
' Objet : Crypter la chaîne chaîneACrypter en fonction d'une clef et de la méthode
' de Vigenère
'---------------------------------------------------------------------------------------
'
Dim sLettres As String
Dim lCompteur As Long
Dim lLongueur As Long
Dim lBoucle As Long
'Définition des constantes utiles pour la fonction (Clé et nombre d'itérations de la fonction maximum)
' Const CLEF As String = "nbvfdszé""'(-è_ijhgfcKLKjhgyuilM^+)àçiu-('32azsDRtvBhujkoç_è6tre""zsXWqazerfcx<;:<?"
Const NBROTATIONSMAX As Long = 13
'Définition de la longueur de la chaîne à crypter et de la chaîne de résultat
lLongueur = Len(chaîneACrypter)
sLettres = String(lLongueur, Chr(0))
'Boucler en fonction du nombre de rotations attendues
For lBoucle = 1 To NBROTATIONSMAX
'boucler pour chaque caractère de la chaîne initiale
For lCompteur = 1 To lLongueur
'Remplacer le caractère de la chaîne à crypter par le caractère correspondant à
' le reste de
' la valeur ascii du caractère à crypter
' plus
' la valeur ascii du caractère correspondant dans la clé, multiplié par la longueur de la clé
' quand on le divise par 256
Mid(sLettres, lCompteur, 1) = Chr((Asc(Mid(chaîneACrypter, lCompteur, 1)) + _
(Asc(Mid(clef, (lCompteur Mod Len(clef)) + 1, 1)) * lLongueur)) Mod 256)
'recommencer
Next
'réaffecter la chaîne à crypter par le résultat trouvé pour pouvoir recommencer une itération
chaîneACrypter = sLettres
'Nouvelle itération
Next
'Renvoyer le résultat final
Crypter = sLettres
End Function |
Partager