PHP 5.3 : Nouvelles fonctionnalités SSL

21 novembre 2008php, php-5.3
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

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 ;-)