Utilizzo di Gpg in php per cifrare password

From RVM Wiki
Jump to navigation Jump to search


Obiettivo: si vuole creare un'applicazione che memorizzi delle passowrd in un database che siano indecifrabili, a meno di usare una chiave privata non disponibile sulla macchina. Questo è utile se si utilizza una cifratura one-way tipo crypt, ma si vuole avere la possibilità di fare un recover delle password in caso di bisogno.

Soluzione: affiancare alla cifratura one-way un sistema di chiavi pubbliche e private, tipo gpg, richiamandolo da php.

Preparazione della coppia di chiavi

Seguire le istruzioni riportate in Cifrare_un_file_in_modalità_batch

L'utente cifratore sarà www-data in quanto php sotto apache viene eseguito con questa utenza.

Per importare la chiave pubblica bisognerà quindi fare:

su - www-data
gpg --import public_key.gpg

La chiave sarà quindi in /var/www/.gnupg. Sarebbe preferibile non renderla accessibile da web, ma in ogni caso anche se fosse prelevata, non servirebbe a nulla.

Listato del programma commentato

La parte di codice php interessata è descrita e commentata di seguito.

putenv("GNUPGHOME=/var/www/.gnupg");

Definisce la variabile di sistema che indica dove sono memorizzate le chiavi

$comando="echo " . $nuovapassa . " | gpg --batch --trust-model always -ea -r nome_chiave_pubblica";

Si costruisce la stringa del comando usato per cifrare la password $nuovapassa.

Gnupg cifra il suo STDIN se lo riceve da uno STDOUT, ed emette sul suo STDOUT la stringa cifrata.

Se si prova il comando dalla shell, una semplice stringa '12345678' viene cifrata come un blocco:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.1 (GNU/Linux)

hQIOA2zl3fx0Jh2uEAf/WelfFlutFQ4z8xYMywHv+JACkL76RyHEfo/ScytZd7kP
MyC5eNw6kr1J8WBDRjQ2Zkm/QqU39PDW8M5vGfMYuojENgDu1mWoEOi6gbJz9FgO
+NlhPW5hXe6uSqLNkAWooSm0uSZXvAK28KXTCNQ9pT8f596fsEnaxbBRjdWwYtSz
K8pvvbrQzBDREsT6rb71aYy6YKry/AD/am/fmaJ/bP3vORxtynhdfK2CCsHFBOv1
TKVy05GJmDNMBzUczXHcfB49Zqes5vfZFvPOyaxaRARf3gtjSlSW3t+w03uqjeAV
5y9hTYeWCuCzIw73nCVZFnVlilnJOwc62fEzuEWKuwf9FSa6x4U0kjAd/tp4UjzB
3Q0IjTA+KVq/sq+Eo9cALRuFDZWtWeW2F1KtU7ryk24hQEQIdy8EXGF6o/r4QaKD
iTDi81OSWPc9d5n01d1vSsQ6dAGuN6GixBoL2YvmqnRgjHVKCSv7s/jQHa2o4KWj
voNYS7mh4Y+hhSF/rkjnrLDeEvju72NeSVflKWQxeNMrpMUEFU05bx+ZpH9knRlp
0dKYG6Cf977clyF8yXnS6Y/JzCnpzG1bMwT7w4XYMNy61zY5r4xkoF1/rcX8Kjqx
btXCqwrOKmkm471J54fQGkYITrya2HM/i4meO5AheNvz3iSgUBnefbqPWGlXTwIa
x9JEAcqHNf58Xns1AVbKC1mcL5Hh6oSz4gmQjDW2z1iPWr+Y92qkvsYe7OmW/t7d
QuMID6nRHYqgZYY/AA/IoqyCvcshBRo=
=M+uz
-----END PGP MESSAGE-----

Va da se che questa stringa va salvata in un campo di mysql di tipo LONGTEXT

$recoverPassword=`$comando`;

Per memorizzare in una variabile lo STDOUT di un programma bisogna utilizzare l'operatore BACKQUOTES "`" , similmente alla shell bash.


Listato del programma

putenv("GNUPGHOME=/var/www/.gnupg");
$comando="echo " . $nuovapassa . " | gpg --batch --trust-model always -ea -r nome_chiave_pubblica";
$recoverPassword=`$comando`;