5

我使用PHP的OpenSSL模塊進行非對稱加密; openssl_pkey_new(),openssl_pkey_export()和openssl_pkey_get_details()來創建密鑰對,openssl_public_encrypt和openssl_private_decrypt()來加密和解密數據。如何使用PHP的OpenSSL模塊更改私鑰的密碼?

如何更改與私鑰關聯的密碼?這對OpenSSL模塊是可行的嗎,還是我必須創建一個新的密鑰對?這將是非常不方便的,並且需要服務器在常規基礎上重新加密潛在的數千個文件。

謝謝!

+0

我已經在OpenSSL郵件列表和Freenode的## PHP頻道上連續詢問過,但都無濟於事。 我在這裏提出錯誤的問題,或者在這種情況下改變密碼短語根本不可能不通過PHP的system()函數直接調用OpenSSL? –

+1

你是絕對**不**問錯誤的問題!這是一個很好的問題,我有一點震驚沒有人回答(直接使用PHP的OpenSSL綁定)。我希望我的回答爲你清除它! – wally

回答

0

使用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

我需要一點點的項目,我已經建立在晚上做。

我們知道下面創建一個新的關鍵對(公/私):

​​

open_ssl_pkey_export()做密碼魔術。因此,我們可以將密碼更改爲:

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

我希望您可以按照我們在此處所做的操作...! (顯然,異常拋出純粹是可選的...我剛剛拉開代碼逐字從我的代碼庫。)

changePassphrase()將私鑰作爲字符串,與現有的和新的密碼短語一起。我們使用openssl_pkey_get_private()來檢索私鑰的句柄,並用舊口令解鎖它。 (值得注意的是密碼短語實際上是用來加密私鑰的,這聽起來有點雙重荷蘭![加密加密密鑰......?] openssl_pkey_get_private()返回FALSE如果它不能解釋密鑰 - 即密碼是否錯誤,私鑰解密爲無效值?)

解鎖了舊密碼的私鑰後,我們將OpenSSL密鑰句柄傳遞給openssl_pkey_export( ) - 就像我們在第一次創建它之後(通過openssl_pkey_new())提供新的密碼...和嘿 - presto一樣。

我希望我的代碼示例能夠乾淨地閱讀,我試圖以易於理解和遵循的方式編寫它,而不必進行不必要的「壓縮」和快捷方式。

祝你好運!

相關問題