在接觸thinkphp5之后,知道thinkphp5作為API接口性能更加的友好,那么我們在為別人提供接口的時候需要考慮一些安全性問題,這時候我們就需要做一些數(shù)據(jù)的處理。
下面這是幾篇加密的介紹:
加密的意義在于數(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);