mardi 19 mai 2009
Si vous êtes dans une situation où vous devez protéger des données de manière sécuritaire, ça peut définitivement être une bonne idée de considérer à les encrypter. Vous ne voulez certainement pas que l'information reliée à la carte de crédit de votre client se retrouve entre de mauvaises mains! La librairie Mcrypt de PHP pemet d'effectuer de l'encryption de haut niveau, sans avoir besoin d'avoir des connaissances poussées dans ce domaine.
Petit crash course sur l'encryption :
- D'abord, il faut savoir qu'il existe de nombreux algorithmes (ciphers) qui offrent différents niveaux de sécurité : DES, Blowfish, Rijndael, Serpent, ThreeWay, TripleDES, Gost, Enigma, etc.
- Juste pour Rijndael, il est offert en mode 128, 192 et 256 bits.
- Ensuite, il y a toujours une clé, parfois appelée "key", "salt" ou "passphrase" qui permet d'être utilisée comme code secret à même l'algorithme d'encryption.
- Finalement, le mode d'encryption peut changer selon ce qu'on veut encoder : texte (ECB - Electronic Codebook), un fichier (CBC - Cipher Block Chaining), un byte stream (CFB), etc.
- Une fois configuré, on est en mesure de fournir le texte à encrypter.
// la donnée à protégerEnsuite, on peut faire l'opération inverse pour déchiffrer le texte :
$creditCard = "4500 xxxx xxxx 1234";
// clé secrète d'encryption (ça peut être n'importe quoi)
$key = "f0158bd5ea6dde2e0ba56103340b4393";
// algorithme à utiliser. Mode ECB = Electronic CodeBook
$cipher = mcrypt_module_open('rijndael-256', '', 'ecb', '');
// créer le vecteur d'initialisation (iv)
// MCRYPT_RAND est utilisé pour en créer un de source aléatoire (random)
$iv_size = mcrypt_enc_get_iv_size($cipher);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
// initialisation des buffers
mcrypt_generic_init($cipher, $key, $iv);
// encryption à l'aide de la fonction générique
$crypted = mcrypt_generic($cipher, $creditCard);
// crypter pour lire à l'écran :-)
$crypted = base64_encode($crypted);
// affichera : Y/EmDRkEW6UusTWf58HYS90qK9JT5Pv21ojy4g/0exQ=
echo $crypted;
// ménage
mcrypt_generic_deinit($cipher);
// réinitialiser les buffers (obligatoire)Il ne reste plus qu'à dissimuler le tout dans des fonctions ou dans une classe et le tour est joué. Je vous laisse avec un peu de lecture complémentaire pour approfondir le sujet : AES - Advanced Encryption Standard.
mcrypt_generic_init($cipher, $key, $iv);
// remettre dans l'état crypté normal
$crypted = base64_decode($crypted);
$decrypted = trim(mdecrypt_generic($cipher, $crypted));
// affichera : 4500 xxxx xxxx 1234
echo $decrypted;
// ménage final
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);