ho bisogno di fare questo per un piccolo progetto Ho costruito la sera.
Sappiamo quanto segue crea una nuova coppia dichiave (pubblica/privata):
function newPair (&$private, &$public, $passphrase=null) {
$res = openssl_pkey_new();
if ($res === false) {
throw new Exception ("Key generation failed: ".openssl_error_string());
return false;
}
// Sets private by reference
if (openssl_pkey_export ($res, $private, $passphrase) === false) {
throw new Exception ("Private key export failed: ".openssl_error_string());
return false;
}
// Array returns, contains "key" element.
$public = openssl_pkey_get_details($res);
if ($public === false) {
throw new Exception (openssl_error_string());
return false;
}
$public = $public["key"];
return true;
}
open_ssl_pkey_export() fa la magia passphrase. Quindi possiamo cambiare la passphrase in questo modo:
function changePassphrase ($private, $old, $new=null) {
$res = openssl_pkey_get_private ($private, $old);
if ($res === false) {
throw new Exception ("Loading private key failed: ".openssl_error_string());
return false;
}
if (openssl_pkey_export ($res, $result, $new) === false) {
throw new Exception ("Passphrase change failed: ".openssl_error_string());
return false;
}
return $result;
}
Spero che tu possa seguire quello che abbiamo fatto qui ...! (Ovviamente il lancio eccezione è puramente facoltativa ... ho appena tirato il codice testualmente dalla mia base di codice.)
changePassphrase() calcia la chiave privata come una stringa, insieme alle frasi d'accesso attuali e nuovi. Usiamo openssl_pkey_get_private() per recuperare un handle per la chiave privata, sbloccandolo con la vecchia passphrase.
(Vale la pena notare che la passphrase è letteralmente utilizzata per crittografare la chiave privata, che può sembrare un po 'double-dutch! [Crittografia della chiave di crittografia ...?!] Openssl_pkey_get_private() restituisce FALSE se non riesce a interpretare la chiave -.? cioè se la passphrase è sbagliato, e la chiave privata decifra un valore non valido senso)
aver sbloccato la chiave privata con il vecchio passphrase, prendiamo la maniglia chiave OpenSSL e passarlo al openssl_pkey_export () - proprio come abbiamo fatto dopo averlo creato in primo luogo (tramite openssl_pkey_new()) fornendo la nuova passphrase ... e hey-presto.
Spero che il mio esempio di codice venga letto in modo pulito, ho provato a scriverlo in un modo che sia facile da capire e da seguire, senza "compressione" e cortocircuito non necessarie.
Buona fortuna!
Ho chiesto sulla mailing list OpenSSL e sul canale PHP ## di Freenode nei giorni successivi, ma tutto inutilmente. Sto chiedendo la domanda sbagliata qui, o sta cambiando la passphrase in questo scenario semplicemente non è possibile senza chiamare OpenSSL direttamente tramite la funzione system() di PHP? –
Sei assolutamente ** non ** facendo la domanda sbagliata! È una grande domanda, e uno sono un po 'scioccato a nessuno ha risposto (direttamente, usando i binding OpenSSL per PHP) già. Spero che la mia risposta chiarisca tutto per te! – wally