5

Sto usando il modulo OpenSSL di PHP per la crittografia asimmetrica; openssl_pkey_new(), openssl_pkey_export() e openssl_pkey_get_details() per creare la coppia di chiavi e openssl_public_encrypt e openssl_private_decrypt() per crittografare e decrittografare i dati.Come modificare la passphrase di una chiave privata usando il modulo OpenSSL di PHP?

Come posso modificare la passphrase associata alla chiave privata? È possibile con il modulo OpenSSL o devo creare una nuova coppia di chiavi? Ciò sarebbe estremamente sconveniente e richiede al server di ricodificare potenzialmente migliaia di file su una base regolare.

Grazie!

+0

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? –

+1

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

risposta

0

Utilizzando phpseclib, a pure PHP RSA implementation:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
$rsa->setPassword('old_password'); 
$rsa->loadKey('...'); 

$rsa->setPassword('new_password'); 
$privatekey = $rsa->getPrivateKey(); 
$publickey = $rsa->getPublicKey(); 
?> 
6

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!

Problemi correlati