您好,登錄后才能下訂單哦!
php的openssl擴展可對數據進行簽名,也可對數據進行非對稱加密。非對稱加密使用私鑰加密,公鑰解密。
這里介紹openssl實現非對稱加密
可使用linux自帶的RSA密鑰生成工具openssl,獲取一對公私鑰,也可使用php openssl擴展函數生成一對公私鑰。
先說第一種:
執行以下命令:
openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem,第二條命令將原始 RSA私鑰轉換為 pkcs8格式,第三條生成RSA公鑰 rsa_public_key.pem
從上面看出通過私鑰能生成對應的公鑰,因此我們將私鑰private_key.pem用在服務器端,公鑰發放給android ios 桌面程序等客戶端
筆者生成的一對公私鑰如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFa
J1epFQXBmOsSWBKoXF5haWM6d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOT
gHvIceb5GHGBqqMawTjI71P69DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXn
PAN9jy21h+TfcXvDgwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFaJ1epFQXBmOsSWBKoXF5haWM6
d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOTgHvIceb5GHGBqqMawTjI71P6
9DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXnPAN9jy21h+TfcXvDgwIDAQAB
AoGAEkfZJp9sCrGy8dJOF2/l8It2HsGhvt7+k2pqPHNpLvDWOcDUPdsWJlT9QvI+
jbF++v3XCzMTfjqM32pAxiQXMfEDcF26wkZtB8E+QVtV0rR9I1OP0wTtfw1tWkd5
cEgfoIrEhaADrxDtLOSDJfDKTKB72H98Lu3iV2iF6igFnQECQQDfLv6eFbH1wmn1
yGq3mR5z1f2yGdSngcgcC53qW8gl6GjjXlyzepz3o+wQ2fk1sLQ+xVGRy7UQHszl
PIDIVaaBAkEA2oL4kQW8jtB+b086ItINyw08x8jCf6Wcmw/SUytdNAGFy8csifwD
FweY9mxH0Cy/ynF3NA+2LQZO0Bz2/DLQAwJAI1lCIq+0/APK3I7duC6cUCR4hhjp
QY6grzB31oKq9LYWxsxPSm4FJoPkA9dCTWqrYbXG8ZyeFOuL8FLg4toOAQJBAIjE
iUhcStUo8rpA4KaCy1dYhb6WjgbPZeI4WPDtp3yxp0kQ9XO4ZUa43qj+xUQrfi/8
LRxM6T3tQM9KEd1xAHkCQGR8bklYgPvgT6Aep/Nq7NZq24N3NC7FY8YxZ85rKpTl
Tnm0UJ8WBNg43uztQ4MJ1IFSwVEOlUVm5VYvV+IIunM=
-----END RSA PRIVATE KEY-----
示例代碼如下:
<?php /** * Created by PhpStorm. * User: chenxiaolong * Date: 2016/9/10 * Time: 16:31 */ $private_key_path = 'rsa_private_key.pem'; $public_key_path = 'rsa_public_key.pem'; $private_key = file_get_contents($private_key_path); $public_key = file_get_contents($public_key_path); //這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id,不可用返回false $pi_key = openssl_pkey_get_private($private_key); //這個函數可用來判斷公鑰是否是可用的,同上 $pu_key = openssl_pkey_get_public($public_key); $data = "hello";//原始數據 $encrypted = ""; $decrypted = ""; //私鑰加密,也可使用openssl_public_encrypt公鑰加密,然后使用openssl_private_decrypt解密,加密后數據在$encrypted openssl_private_encrypt($data,$encrypted,$pi_key); //加密后的內容通常含有特殊字符,需要編碼轉換下,在網絡間通過url傳輸時要注意base64編碼是否是url安全的 $encrypted = base64_encode($encrypted); //私鑰加密的內容通過公鑰可解密出來,公鑰加密的可用私鑰解密。不能混淆 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key); echo $decrypted; // hello //私鑰加密 openssl_private_encrypt($data,$encrypted,$pi_key); $encrypted = base64_encode($encrypted); //公鑰解密 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key); echo $decrypted; //hello
使用PHP自己也可生成一對公私鑰。代碼如下:
$config = array( "digest_alg" => "sha512", "private_key_bits" => 4096, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); // 創建公私鑰 $res = openssl_pkey_new($config); // 獲得私鑰 $privKey openssl_pkey_export($res, $privKey); // 獲得公鑰 $pubKey $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; $data = 'hello'; // 私鑰加密 openssl_private_encrypt($data, $encrypted ,$privKey); // 公鑰解密 openssl_public_decrypt($encrypted, $decrypted, $pubKey); echo $decrypted;
兩種方式沒有本質區別,只是生成公私鑰的方式不同。
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。如果既想有很快的加密速度又想保證數據比對稱加密更加安全,可對數據進行對稱加密,對秘鑰做非對稱加密,因為一般秘鑰的長度會小于數據的長度。
php openssl還可實現數字簽名。關于openssl實現數字簽名的內容請查看php.net官方網址。
參考博文:
數字簽名 http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
非對稱加密 http://www.cnblogs.com/jfzhu/p/4020928.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。