RSA 加密傳輸 (php)
阿新 • • 發佈:2017-08-29
ring string 加密傳輸 可能 16px cer div static pen
RSA加密傳輸:
對於初接觸RSA加密的童鞋來說,很可能會被繞進去。最近寫了一個RSA加密傳輸的需求,總結一下。希望能對你有點幫助。
首先要明白以下幾點:
1:公鑰和私鑰一定是成對的才可以
2:私鑰是保密的,公鑰是公開的
3:公鑰和私鑰,可以互為加密和解密
4:用其中一個密鑰加密數據,則只有對應的那個密鑰才能解開
主要有兩種用法
1:公鑰加密
A傳輸數據給B
(1),A用公鑰加密數據,傳輸給B
(2),B用私鑰解密
2:公鑰認證
A傳輸數據給B
(1),A用私鑰加密數據(也就是私鑰簽名),傳輸給B
(2),B用公鑰解密(也就是驗簽)
示例:證書,公鑰認證的過程
簽名:
/** signing 簽名 password 私鑰證書需要密碼 */ public function get_signing_str($data){ //$data=$this->get_request_string(); $certs=array(); // dump(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx")); openssl_pkcs12_read(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx"), $certs, "password"); if(!$certs) return; $signature = ‘‘; openssl_sign($data, $signature, $certs[‘pkey‘],‘sha256‘); //dump(base64_encode($signature)); return base64_encode($signature); }
驗簽:
public function verify_signing($rest){ $rest=json_decode($rest,true); $sign=$rest[‘sign‘]; $sign = base64_decode($sign);//簽名參數 unset($rest[‘sign‘]); unset($rest[‘sign_type‘]); $verifystr=$this->get_request_str($rest);//驗簽明文字符串 $pkeyid = openssl_pkey_get_public(file_get_contents(ROOT_PATH."public/static/"."public_key.cer")); $verify = openssl_verify($verifystr,$sign,$pkeyid,‘sha256‘); //驗簽 (明文/簽名/key) // $msg = openssl_error_string(); // dump($msg); // dump($verify); openssl_free_key($pkeyid); if($verify==1){ echo ‘驗簽通過‘; // $data=json_encode($rest); // return $data; }else{ return ‘驗簽失敗‘; } }
RSA加密過程
$privateKeyStr=file_get_contents(ROOT_PATH."public/static/"."pkcs1_key.pem"); $pi_key=openssl_pkey_get_private($privateKeyStr); $encryptSign=""; openssl_private_encrypt($sign_str,$encryptSign,$pi_key); //(待加密字符串/加密後的字符串/key)
SHA加密過程
$sign = hash(‘sha256‘,$source); //(算法/待加密字符串)
RSA 加密傳輸 (php)