5

मैं असममित एन्क्रिप्शन के लिए PHP के OpenSSL मॉड्यूल का उपयोग कर रहा; openssl_pkey_new(), openssl_pkey_export(), और openssl_pkey_get_details() कुंजी युग्म बनाने के लिए, और openssl_public_encrypt और openssl_private_decrypt() एन्क्रिप्ट और डेटा को डिक्रिप्ट करने।PHP के ओपनएसएसएल मॉड्यूल का उपयोग कर एक निजी कुंजी के पासफ्रेज को कैसे बदला जाए?

मैं निजी कुंजी के साथ जुड़े पदबंध कैसे बदल सकता हूँ? क्या यह ओपनएसएसएल मॉड्यूल के साथ संभव है, या क्या मुझे एक नया कीपैयर बनाना है? यह बेहद असुविधाजनक होगा और सर्वर को नियमित आधार पर संभावित रूप से हजारों फ़ाइलों को फिर से एन्क्रिप्ट करने की आवश्यकता होगी।

धन्यवाद!

+0

मैं कोई लाभ नहीं हुआ लगातार दिन पर Freenode के ## पीएचपी चैनल में OpenSSL मेलिंग सूची पर कहा है, और है, लेकिन सभी। क्या मैं यहां गलत प्रश्न पूछ रहा हूं, या इस परिदृश्य में पासफ्रेज बदल रहा हूं, ओपनएसएसएल को सीधे PHP के सिस्टम() फ़ंक्शन के माध्यम से कॉल किए बिना संभव नहीं है? –

+1

आप बिल्कुल ** नहीं हैं ** गलत सवाल पूछ रहे हैं! यह एक अच्छा सवाल है, और एक मैं थोड़ा चौंक गया हूं किसी ने जवाब नहीं दिया है (सीधे, PHP के लिए ओपनएसएसएल बाइंडिंग का उपयोग कर)। मुझे आशा है कि मेरा जवाब यह सब आपके लिए साफ़ कर देगा! – 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

मैं एक छोटे से परियोजना मैं शाम में निर्माण किया गया है के लिए ऐसा करने की जरूरत है।

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() पदबंध जादू करता है:

हम निम्नलिखित एक नई कुंजी युग्म (सार्वजनिक/निजी) बनाता है। इसलिए हम पासफ्रेज को इस प्रकार बदल सकते हैं:

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

मुझे आशा है कि आप यहां जो कुछ भी कर चुके हैं उसका पालन कर सकते हैं ...! (जाहिर है अपवाद फेंक विशुद्ध रूप से वैकल्पिक है ... मैं बस अपना codebase से शब्दशः कोड खींच लिया गया है।)

changePassphrase() वर्तमान और नए पासफ्रेज के साथ साथ, एक स्ट्रिंग के रूप में निजी कुंजी ले जाता है। हम निजी कुंजी पर एक हैंडल पुनर्प्राप्त करने के लिए openssl_pkey_get_private() का उपयोग करते हैं, इसे पुराने पासफ्रेज़ से अनलॉक करते हैं।

(यह ध्यान देने योग्य है कि पासफ्रेज का उपयोग शाब्दिक रूप से निजी कुंजी को एन्क्रिप्ट करने के लिए किया जाता है, जो थोड़ा डबल-डच लग सकता है! [एन्क्रिप्शन कुंजी एन्क्रिप्ट करना ...?!] Openssl_pkey_get_private() false देता है अगर यह व्याख्या करने में विफल रहता है कुंजी - यानी अगर पासफ्रेज गलत है, और निजी कुंजी अमान्य मान को अस्वीकार करती है। समझ में आता है?)

पुराने पासफ्रेज़ के साथ निजी कुंजी अनलॉक करने के बाद, हम ओपनएसएसएल कुंजी हैंडल लेते हैं और इसे openssl_pkey_export पर पास करते हैं () - जैसे हम पहली जगह में इसे बनाने के बाद किया था (openssl_pkey_new के माध्यम से()) नए पासफ़्रेज़ ... और हे-Presto प्रदान करते हैं।

मुझे आशा है कि मेरे कोड उदाहरण सफाई से लिखा है, मैं, एक फैशन को समझते हैं और पालन करने के लिए आसान है कि में यह लिखने के लिए अनावश्यक "संपीड़न" और छोटी काटने के बिना कोशिश की है।

गुड लक!

संबंधित मुद्दे