PHP 5.3 : Nouvelles fonctionnalités SSL
21 novembre 2008 —Les exemples correspondant à ce point se trouvent dans le répertoire "ssl".
PHP 5.3 voit apparaitre de nouvelles fonctions au sein de la bibliothèque OpenSSL.
Pour la petite histoire, lors de l'ajout de ces nouvelles fonctions, l'objectif était de faciliter l'implémentation d'OpenID en PHP.
Sommaire :
Accès au fonctions Digest
La première fonction rajoutée est openssl_get_md_methods
, qui permet de lister les fonctions de hachage exportées par OpenSSL :
$methods = openssl_get_md_methods();
var_dump($methods);
echo '<pre>';
foreach ($methods as $method) {
echo $method . ' : ' . openssl_digest('Hello, World!', $method) . "\n";
}
echo '</pre>';
Sur la plate-forme où j'ai lancé cette portion de code, j'avais 25 fonctions de digest disponibles, allant de DSA à SHA256, en passant par MD5.
Voici un extrait de l'affichage obtenu :
DSA : 0a0a9f2a6772942557ab5355d76af442f8f65e01 DSA-SHA : 0a0a9f2a6772942557ab5355d76af442f8f65e01 MD2 : 1c8f1e6a94aaa7145210bf90bb52871a MD4 : 94e3cb0fa9aa7a5ee3db74b79e915989 MD5 : 65a8e27d8879283831b664bd8b7f0ad4 RIPEMD160 : 527a6a4b9a6da75607546842e0e00105350b1aaf SHA : 5a5588f0407c6ae9a988758e76965f841b299229 SHA1 : 0a0a9f2a6772942557ab5355d76af442f8f65e01
On retrouve bien évidemment de grands classiques, comme md5
ou sha1
, au milieu d'autres fonctions moins largement répandues...
Accès aux fonctions de cipher
La deuxième fonction ajoutée est openssl_get_cipher_methods
, qui permet d'obtenir la liste des fonctions d'encryptage/décryptage exportées par la bibliothèque OpenSSL :
$methods = openssl_get_cipher_methods();
var_dump($methods);
$texteACrypter = "he who doesn't do anything, doesn't go wrong -- Zeev Suraski";
$clefSecrete = "glop";
echo '<pre>';
foreach ($methods as $method) {
$encrypted = openssl_encrypt($texteACrypter, $method, $clefSecrete);
$decrypted = openssl_decrypt($encrypted, $method, $clefSecrete);
echo $method . ' : ' . $encrypted . ' ; ' . $decrypted . "\n";
}
echo '</pre>';
Et encore une fois, un extrait de la sortie obtenue, avec le nom de la fonction de cipher, le résultat obtenu suite au décryptage, et le dé-cryptage :
bf-ecb : /nyRYCzQPE1sunxSBclxXBd7p7gl1fUnE80gBCS1NM4s3wS1Eho6rFHOOR73V9UtnolYW+flbiCwIKa/DYh5CQ== ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski bf-ofb : M9wwf140zhwHo98k8sj2MEXdogqXEQ+TjN81pebs2tmhNOsfU3jvMy91MBM76dWM7GVjeh95p8oDybDt ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski cast5-cbc : xKgdC1y654PFYW1rIjdevu8MsQOegvJoZx0KmMwb8aCHFmznxIQVy1yvAWR3bZztvGCGrM84WkpbG33pZcxUiQ== ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski cast5-cfb : t8ABR9mPvocRikrX0Kblq2rUXHiVnA/OnjR/mDJDq8+/nn6Z9yfPbpcpRat0lYqfVAcwlypT4A4KNq4S ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski cast5-ecb : xKgdC1y654NIzRl9gJqbhYKtmJoXBoFpgLhwgdtPtYB7VZ1tRHLX0MjErtfREMJBAonp48zngSiTKlsKV0/WhQ== ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski cast5-ofb : t8ABR9mPvofCv9+AKTcRO4Q0doYlavn8zRzLvV3dZk0niO7l20KloA4nUll4VN1B5n89T/IuGh9piPte ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski des-cbc : WrCiOVPU1ipF+0trwXyVZ/6cxiNVft+TK2+vAP0E57b9smf9x/cZlQQ4531aDX778S3YJeP/5/YulADXoHT/+Q== ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski des-cfb : cDDlaifQN+hGOnGJ2xvGna7y8+qRxwQG+1DJBwQm/4abKgdZYUczC4+aOPGesZM1nKXjgoqB4+KTxGNo ; he who doesn't do anything, doesn't go wrong -- Zeev Suraski
Selon votre installation, vous constaterez que vous disposez d'un grand nombre de fonctions d'encryptage !
RSA et clefs privées et publiques
Pour terminer, un exemple illustrant comment obtenir un couple de clefs privées et publiques :
$config = array(
'private_key_type' => OPENSSL_KEYTYPE_RSA,
'private_key_bits' => 1024,
'encrypt_key' => true,
);
$key = openssl_pkey_new($config);
$details = openssl_pkey_get_details($key);
var_dump($details);
echo '<hr />';
$export = '';
openssl_pkey_export($key, $export, 'mot de passe');
echo "<pre>$export</pre>";
echo '<hr />';
$privateKey = openssl_pkey_get_private($key);
var_dump(openssl_pkey_get_details($privateKey));
echo '<hr />';
$publicKey = openssl_pkey_get_public($details['key']);
var_dump(openssl_pkey_get_details($publicKey));
echo '<hr />';
Qui donne la clef publique suivante :
array
'bits' => int 1024
'key' => string '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKoAcX7PSKeBAZi+g1QBz44OUE
6IXIO0yyhIjmUVzjHyIA23kyMopdMKgzEtstopeaCcpq0lQbH3Mbd4ijykP6CbgW
g7f8HTw47Gy6VBooMVrmoFVMsU821zOtAdgyFUu1NNsaAesdJ9OiNt4SHt7FT7q9
rES6IKEyrZ19xgro5wIDAQAB
-----END PUBLIC KEY-----
' (length=272)
'rsa' =>
array
'n' => string '...' (length=128)
'e' => string '...' (length=3)
'd' => string '...' (length=128)
'p' => string '...' (length=64)
'q' => string '...' (length=64)
'dmp1' => string '...' (length=64)
'dmq1' => string '...' (length=64)
'iqmp' => string '...' (length=64)
'type' => int 0
Et la clef privée correspondant :
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,8359C31963B650A8 1h5jV3F8OpuIL2Mtg59cQIvKV95mrCcPDgCWhegxh/i7JfeanjRCYEDnltk3sUQ8 3cHWn+7ZfGVHkl1XOZbQNKUgOupkdYCgq0bVMCYH92MGqxcU3jTR3nbat/m2NX3E yMaF0t2Eq1KwI0O6A/DIklP2aCrFkS6lk0itSF+ybeQwe4ft3M3KRv64FrkS0S+4 Ib5hmIb9pectAGRS5enngkwuWPGhzLbXIPd206EKujw1JC+OkNi1kefoNHqIvYUE 42LWp4ccaVJzP3LIlArk/FvC63Hh5Hk2T6jrMTQKsY2/pD4u6ADHnhyDkmXSXV0J wYVV+zJcRU4QiTZKxAZu/PfRV0/39+tqjFz3j8XjbZTgZmiZ0CriAWAn8kZP22xK DfEZLUnvYE8lRd7GBlo5l1JZavnNZXdAZftEOIu72SZdG+CRkQ3jB8r4VEIp90IN EbHrgkwgprUBu1yIWZcSQ8Gtffw6Dmoz7jmMPA6Rdy0s8n+yx3hacuFHyOMlD6PZ gT5taUMtQ6i4YpzmAsqrLB66vmhKOZNl/CasXtfemWEkdqXd5Twg6LqjXiZrphwc fI5pqCbC9/dSEcnWm0XZmd2MPgLE0pvWJWugDpShJEImdO847xt4fMUSwfnekuNN GnrBOYI5wYQFs/OUEdnyc8J+phMnUCqYy71fJyQ9jwOuddmklU7Szfi2HvAoanwL vOyqhRQsQlN1kfhLZENMlfcENmOgtCS7B6HLkqJz5D17Bl1LqUPdob+46Chl9+k9 Acdhk6Dp45qtz3FaIWTEGWc03EztLjB5jTqr7oeZc+k0EbsbkNH5Ew== -----END RSA PRIVATE KEY-----
A vous d'encrypter vos documents, à présent ;-)