PHP實(shí)現(xiàn)公鑰加密私鑰解密機(jī)制

在接觸thinkphp5之后,知道thinkphp5作為API接口性能更加的友好,那么我們在為別人提供接口的時候需要考慮一些安全性問題,這時候我們就需要做一些數(shù)據(jù)的處理。

下面這是幾篇加密的介紹:

支付寶公鑰加密機(jī)制文檔

數(shù)字簽名是什么?

加密的意義在于數(shù)據(jù)的傳輸過程中,即使被第三方獲取到傳輸?shù)臄?shù)據(jù),第三方也不能獲取到數(shù)據(jù)的具體含義

加密方式分為對稱加密和非對稱加密,對稱加密只使用一個秘鑰,加密和解密都使用該秘鑰;非對稱加密則使用一對秘鑰,使用公鑰加密,私鑰解密。

公鑰加密機(jī)制是現(xiàn)在比較安全的一種加密方式,用這一組密鑰中的一個來加密數(shù)據(jù),可以用另一個解開。公鑰和私鑰都可以用來加密數(shù)據(jù),相反用另一個解開,公鑰加密數(shù)據(jù),然后私鑰解密的情況被稱為加密解密,私鑰加密數(shù)據(jù),公鑰解密一般被稱為簽名和驗(yàn)證簽名。

加密和解密

A將自己的公鑰告訴B

B通過公鑰加密數(shù)據(jù)傳輸給A

A再通過自己的私鑰解密得到數(shù)據(jù)

因?yàn)橹挥蠥知道自己的私鑰,所以別人即使知道加密數(shù)據(jù)也無法知道具體內(nèi)容

數(shù)字簽名和驗(yàn)證

A使用自己的私鑰生成數(shù)字簽名發(fā)送給B

B使用A的公鑰驗(yàn)證數(shù)字簽名

在PHP還有兩種常用的數(shù)字簽名分別是sha1和md5。?其中,sha1通常是對一段內(nèi)容或者一個文件進(jìn)行簽名,以判斷信息在傳輸?shù)倪^程中沒有被修改過;md5則常用在登錄驗(yàn)證,將簽名的結(jié)果保存到數(shù)據(jù)庫中,每次登錄進(jìn)行簽名的驗(yàn)證。

Rsa算法的實(shí)現(xiàn)

要實(shí)現(xiàn)RSA算法,我們首先要生成一對秘鑰(公鑰和私鑰),我們可以使用openssl的方法生成,該工具在windows下使用很不方便,如果服務(wù)器真是widows環(huán)境,可以在linux下生成公鑰和私鑰文件,拷貝到windows下的服務(wù)器進(jìn)行操作,這樣要比在windows下配置各種環(huán)境簡單多了。

首先,安裝openssl工具,這個可以采取編譯方式安裝,也可以使用安裝包安裝

1、mkdir key

2、cd key #進(jìn)入工作目錄

3、apt-get install openssl #安裝openssl

4、openssl #進(jìn)入openssl工作環(huán)境

5、OpenSSL> genrsa -out rsa_private_key.pem 1024 #生成私鑰

6、OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公鑰

7、OpenSSL> exit #退出OpenSSL程序

補(bǔ)充:這里我們使用的事apt-get的方式,但是這種方式的話是必須在ubuntu下使用,所以如果大家并未使用ubuntu的話,可以使用homebrew安裝和更新OpenSSL,至于homebrew的安裝,大家可以在網(wǎng)上找到很多教程,這里就不多bb了,安裝了homebrew,我們通過命令brew --version查看是否安裝成功,如下


而后我們就可以順利的安裝openssl

brew install openssl

等待過后即可安裝成功。


例:

####公鑰加密####

function rsaEncrypt($content,$public_key_path){?

?????????$pubKey = file_get_contents($public_key_path);

????????$res = openssl_get_publickey($pubKey);

? ? ? ? //把需要加密的內(nèi)容,按128位拆開解密? ? ? ??

????????$result? = '';

? ? ? ? for($i = 0; $i < strlen($content)/128; $i++? ) {

? ? ? ? ? ? $data = substr($content, $i * 128, 128);

? ? ? ? ? ? openssl_public_encrypt ($data, $encrypt, $res);

? ? ? ? ? ? $result .= $encrypt;

? ? ? ? }

? ? ? ? $result = base64_encode($result);

? ? ? ? openssl_free_key($res);

? ? ? ? return $result;

? ? }

###私鑰解密######

function rsaDecrypt($content,$private_key_path){?

????????$priKey = file_get_contents($private_key_path);

? ? ? ? $res = openssl_get_privatekey($priKey);

? ? ? ? //用base64將內(nèi)容還原成二進(jìn)制? ? ? ??

????????$content = base64_decode($content);

? ? ? ? //把需要解密的內(nèi)容,按128位拆開解密? ? ? ??

????????$result? = '';

? ? ? ? for($i = 0; $i < strlen($content)/128; $i++? ) {

? ? ? ? ? ? $data = substr($content, $i * 128, 128);

? ? ? ? ? ? openssl_private_decrypt($data, $decrypt, $res);

? ? ? ? ? ? $result .= $decrypt;

? ? ? ? }

? ? ? ? openssl_free_key($res);

? ? ? ? return $result;

? ? }


#####數(shù)字簽名####

function rsaSign($content,$public_key_path){?

????????$pubKey = file_get_contents($private_key_path);

????????$res = openssl_get_privatekey($pubKey);

????????//把需要加密的內(nèi)容,按128位拆開解密

????????$result = '';

????????for ($i = 0; $i < strlen($content) / 128; $i++) {

? ? ????????$data = substr($content, $i * 128, 128);

? ? ????????openssl_sign($data, $encrypt, $res);

? ? ????????$result .= $encrypt;

????????}

????????$result = base64_encode($result);

????????openssl_free_key($res);

????????return $result;

}

####驗(yàn)證數(shù)字簽名######

function rsaVerify($data,$public_key_path,$sign){?

? ? ? ? $pubKey = file_get_contents($public_key_path);

? ? ? ? $res = openssl_get_publickey($pubKey);

? ? ? ? $result = (bool)openssl_verify($data, base64_decode($sign), $res);

? ? ? ? openssl_free_key($res);

? ? ? ? return $result;

? ? }


####PHP中調(diào)用####

header("Content-type:text/html;charset='utf-8");

define("PRIVATE_KEY",__DIR__."/key/rsa_private_key.pem");

define("PUBLIC_KEY",__DIR__."/key/rsa_public_key.pem");

$msg = "My love is coincidence.";

$rsa = new Rsa(); //rsa加密演示

$encrypt = $rsa->rsaEncrypt($msg,PUBLIC_KEY);? // 通過公鑰加密

//rsa解密演示

$decrypt = $rsa->rsaDecrypt($encrypt,PRIVATE_KEY);? // 通過私鑰解密


//rsa生成數(shù)字簽名演示

$sign =? $rsa->rsaSign($msg,PRIVATE_KEY);? ?// 通過私鑰生成數(shù)字簽名

//rsa驗(yàn)證數(shù)字簽名演示

$verify = $rsa->rsaVerify($msg,PUBLIC_KEY,$sign);? // 通過公鑰驗(yàn)證數(shù)字簽名

var_dump($verify);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容