Utilizzo di Gpg in php per cifrare password
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`;
Link utili
Data Encryption Tutorial Lesson 1
Text_Password allows one to create pronounceable and unpronounceable passwords