5

Używam modułu OpenSSL PHP do szyfrowania asymetrycznego; openssl_pkey_new(), openssl_pkey_export() i openssl_pkey_get_details() w celu utworzenia keypair, a openssl_public_encrypt i openssl_private_decrypt() do szyfrowania i odszyfrowywania danych.Jak zmienić hasło klucza prywatnego za pomocą modułu PHP OpenSSL?

Jak zmienić hasło skojarzone z kluczem prywatnym? Czy jest to możliwe dzięki modułowi OpenSSL, czy też muszę utworzyć nową parę kluczy? Byłoby to bardzo niewygodne i wymagałoby od serwera ponownego zaszyfrowania potencjalnie tysięcy plików na zwykłej podstawie.

Dzięki!

+0

Pytałem na liście mailingowej OpenSSL i na kanale ## PHP Freenode w kolejnych dniach, ale wszystko bez skutku. Czy zadaję tutaj niewłaściwe pytanie, czy też zmiana hasła w tym scenariuszu jest po prostu niemożliwa bez bezpośredniego wywoływania OpenSSL przez funkcję systemową PHP()? –

+1

Jesteś absolutnie ** nie ** zadając niewłaściwe pytanie! To jest świetne pytanie, a ja jestem trochę zszokowany, nikt nie odpowiedział (bezpośrednio, używając połączeń OpenSSL dla PHP) już. Mam nadzieję, że moja odpowiedź wyjaśni to wszystko dla Ciebie! – wally

Odpowiedz

0

Korzystanie 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

Mam potrzebne do zrobienia tego dla małego projektu Byłem budynek w godzinach wieczornych.

Wiemy dodaje tworzy nowy parę kluczy (publiczny/prywatny):

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() robi magię hasłem. Możemy zmienić hasło:

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

Mam nadzieję, że możesz śledzić to, co tutaj zrobiliśmy ...! (Oczywiście rzucanie Wyjątkiem jest jedynie opcja ... Ja po prostu wyciągnął kod dosłownie z moim kodzie.)

changePassphrase() pobiera klucz prywatny jako ciąg, wraz z obecnymi i nowymi hasło podczas. Używamy openssl_pkey_get_private(), aby pobrać uchwyt do klucza prywatnego, odblokowując go starym hasłem.

(Warto zauważyć, że hasło jest dosłownie używane do szyfrowania klucza prywatnego, co może brzmieć nieco podwójnie! [Szyfrowanie klucza szyfrowania ...?!] Openssl_pkey_get_private() zwraca FALSE, jeśli nie interpretuje klucz - tzn. jeśli hasło jest błędne, a klucz prywatny odszyfrowuje do nieprawidłowej wartości. Czy ma sens?)

Po odblokowaniu klucza prywatnego ze starym hasłem, bierzemy uchwyt klucza OpenSSL i przekazujemy go do opensl_pkey_export () - tak jak zrobiliśmy to po stworzeniu go w pierwszej kolejności (via openssl_pkey_new()), dostarczając nowe hasło ... i hej-presto.

Mam nadzieję, że mój przykładowy kod brzmi czysto, próbowałem napisać to w sposób łatwy do zrozumienia i śledzenia, bez zbędnej "kompresji" i skrótu.

Powodzenia!

Powiązane problemy