5

J'utilise le module OpenSSL de PHP pour le chiffrement asymétrique; openssl_pkey_new(), openssl_pkey_export(), et openssl_pkey_get_details() pour créer la paire de clés, et openssl_public_encrypt et openssl_private_decrypt() pour crypter et décrypter les données. Comment puis-je modifier la phrase secrète associée à la clé privée? Est-ce possible avec le module OpenSSL, ou dois-je créer une nouvelle paire de clés? Cela serait extrêmement gênant et obligerait le serveur à rechiffrer potentiellement des milliers de fichiers sur une base régulière.Comment changer la phrase de passe d'une clé privée en utilisant le module OpenSSL de PHP?

Merci!

+0

J'ai demandé sur la liste de diffusion OpenSSL, et dans le canal ## PHP de Freenode sur les jours successifs, mais tout en vain. Est-ce que je pose la mauvaise question ici, ou est-ce que changer le mot de passe dans ce scénario n'est simplement pas possible sans appeler directement OpenSSL via la fonction system() de PHP? –

+1

Vous êtes absolument ** pas ** poser la mauvaise question! C'est une bonne question, et je suis un peu choqué que personne n'a répondu (directement, en utilisant les bindings OpenSSL pour PHP). J'espère que ma réponse éclaircira tout ça pour vous! – wally

Répondre

0

En utilisant 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

J'ai besoin de faire cela pour un petit projet, j'ai construit le soir.

Nous savons ce qui suit crée une nouvelle paire de clés (public/privé):

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() fait la magie de mot de passe. Donc, nous pouvons changer la phrase de passe comme suit:

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

J'espère que vous pouvez suivre ce que nous avons fait ici ...! (Il est évident que le lancement d'exception est purement facultative ... Je viens tiré le code verbatim de mon code de base.)

changePassphrase() prend la clé privée comme une chaîne , ainsi que les actuels et nouveaux mots de passe. Nous utilisons openssl_pkey_get_private() pour récupérer un handle sur la clé privée, en le déverrouillant avec l'ancienne phrase secrète.

(Il est à noter que la phrase secrète est littéralement utilisée pour crypter la clé privée, ce qui peut sembler un peu double-croche! [Crypter la clé de cryptage ...?!] Openssl_pkey_get_private() retourne FALSE si elle ne parvient pas à interpréter la clé - c'est-à-dire si la phrase secrète est incorrecte et la clé privée déchiffre une valeur invalide.)

Après avoir débloqué la clé privée avec l'ancienne phrase secrète, nous prenons la clé OpenSSL et la transmettons à openssl_pkey_export () - tout comme nous l'avons fait en premier lieu (via openssl_pkey_new()) en fournissant la nouvelle phrase secrète ... et hey-presto. J'espère que mon exemple de code lit proprement, j'ai essayé de l'écrire d'une manière facile à comprendre et à suivre, sans "compression" et raccourcis inutiles.

Bonne chance!

Questions connexes