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!
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()? –
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