真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP怎么使用OpenSSL加密中的非對(duì)稱加密

這篇文章主要介紹了PHP怎么使用OpenSSL加密中的非對(duì)稱加密,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括滎陽(yáng)網(wǎng)站建設(shè)、滎陽(yáng)網(wǎng)站制作、滎陽(yáng)網(wǎng)頁(yè)制作以及滎陽(yáng)網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,滎陽(yáng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到滎陽(yáng)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

PHP的OpenSSL加密擴(kuò)展學(xué)習(xí):非對(duì)稱加密

生成私鑰

通過(guò)之前的學(xué)習(xí),我們知道非對(duì)稱加密是分別需要一個(gè)公鑰和一個(gè)私鑰的。我們就先來(lái)生成一個(gè)私鑰,也就是存放在我們這一端一個(gè)密鑰。請(qǐng)記住,在任何時(shí)候,私鑰都是不能給別人的哦!

$config = array(
    "private_key_bits" => 4096, // 指定應(yīng)該使用多少位來(lái)生成私鑰
);

$res = openssl_pkey_new($config); // 根據(jù)配置信息生成私鑰

openssl_pkey_export($res, $privateKey); // 將一個(gè)密鑰的可輸出表示轉(zhuǎn)換為字符串
var_dump($privateKey); 
// -----BEGIN PRIVATE KEY-----
// MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDFMLW+9t3fNX4C
// YBuV0ILSyPAdSYVXtE4CLv32OvNk9yQZgF2nL/ZuIbBGRcYo2Hf5B31doGrAFDGu
// NoTR+WA7CBjKROFr/+yValsMFIeiKNtttWMkmBciysDJoEoyd6wjDD+kcHQdoJVo
// ……
// -----END PRIVATE KEY-----

非常簡(jiǎn)單的一個(gè)函數(shù) openssl_pkey_new() ,它接收一個(gè)參數(shù),這個(gè)參數(shù)是可配置項(xiàng)并且是可選參數(shù)。生成的結(jié)果是一個(gè)私鑰句柄,不是我們能直接讀取的內(nèi)容,所以我們?cè)偈褂?openssl_pkey_export() 來(lái)提取可輸出的字符串。

注釋中的內(nèi)容就是我們生成的私鑰信息了,私鑰信息一般會(huì)相對(duì)多些,所以省略了后面的內(nèi)容。

抽取公鑰

接下來(lái)就是生成公鑰了,其實(shí),公鑰是從私鑰中抽取出來(lái)的。所以我們使用進(jìn)行加解密的時(shí)候,都可以使用私鑰或者公鑰互相操作。

$publicKey = openssl_pkey_get_details($res); // 抽取公鑰信息
var_dump($publicKey);
// array(4) {
//     ["bits"]=>
//     int(4096)
//     ["key"]=>
//     string(800) "-----BEGIN PUBLIC KEY-----
//   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtOIImDdS0W0vAr5Ra1+E
//   hR2AJwQQwxntYKgTku8EmJRBX2vU+x8th8W8SnoGiVM/sOItG0HIe4Egf1UxoZHt
//   gI6r+jpAp7JbTN0sD/VTPDE09F21+hFGjIVBqrkcLPjuEbf7+tjmgAx8cG8WLGId
//   G8Hsub70kRANKJe1bCXIBUggRFk0sQGllxA/hxiG5wANqHTrdpJgJba+ahSi2+4H
//   UWnyCV1O3AaPyz6a12HNUsG4Eio/tWv/hOB9POt6nAqwPHuIbhp56i5bv1ijMJZM
//   jwRen5f/kwdZ01Ig2fi0uBoTR2y/EEaus7xBYpF/gGzZ/uM7cNUXcDyG5YluM/4R
//   MEv4msPMVGB72izItED+C6Cqftxl98iBFRDc+PISFbRSgOU/HsuBhKkM5SYzyi3I
//   Ypaej25++qLPqcA+EDr3JNDhNZ0GOhofCRtPq4dsr7iLLLRnZ0TnhIYe9wAbmO49
//   uthABNBkM54bG+omOfY4Bkn5n39CKpELbhIiXgOd+lA684XUS/2Aw3Dvelc9Gbag
//   oIFvb/wljPYsd0Zmd64CXBpTWbfwXC8K4vCKvFLjytcz2Yp4T6fVjbLT5RA6u8su
//   E0WwE4QTFNKhnM5OvfiMN+NMc3Y/esVfcin3eyvotdz4N6Tt45dkybkf6aQE3Scg
//   E/JBLIEEA+gjGTveY4cNUiECAwEAAQ==
//   -----END PUBLIC KEY-----
//   "
//     ["rsa"]=>
// ……

$publicKey = $publicKey['key'];

使用 openssl_pkey_get_details() 抽取出來(lái)的內(nèi)容包含很多內(nèi)容。不過(guò)我們所需要的最主要的內(nèi)容就是 key 下面的這個(gè)公鑰。

大家再回過(guò)頭來(lái)好好看一下公鑰和私鑰的內(nèi)容,是不是和我們?nèi)ド暾?qǐng)的 HTTPS 證書(shū)中的公私鑰內(nèi)容長(zhǎng)得一樣,而且也和我們自己在系統(tǒng)中使用 openssl 命令行生成的本機(jī)的密鑰證書(shū)一樣。它們本身就是一樣的東西啦,只是在不同的場(chǎng)景應(yīng)用的不同而已。HTTPS 證書(shū)除了非對(duì)稱加密的密鑰之外,還包含有 CA 信息,如果 CA 不通過(guò),瀏覽器也會(huì)認(rèn)為證書(shū)是無(wú)效的,因此,我們使用自己生成的證書(shū)來(lái)充當(dāng) HTTPS 證書(shū)是不可以的。而本身生成的一般會(huì)用在 SSH 免密登錄上,或者是 GitHub 的免密代碼倉(cāng)庫(kù)操作上。

加密解密數(shù)據(jù)

好了,公鑰和私鑰都生成完成了,那么我們就要進(jìn)行最重要的加密和解密操作了。

$data = '測(cè)試非對(duì)稱加密';

// 公鑰加密數(shù)據(jù)
openssl_public_encrypt($data, $encrypted, $publicKey);
var_dump($encrypted);
// string(512) 

// 私鑰解密數(shù)據(jù)
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
var_dump($decrypted);
// string(21) "測(cè)試非對(duì)稱加密"

在這里,我們使用的就是最標(biāo)準(zhǔn)的公鑰加密,私鑰解密來(lái)進(jìn)行的測(cè)試。其實(shí)反過(guò)來(lái)也是可以的,OpenSSL 分別都為我們提供了公鑰的加解密和私鑰的加解密函數(shù)。

就像上篇文章的圖示那樣,對(duì)方獲得我們的公鑰,然后加密數(shù)據(jù)傳輸過(guò)來(lái),我們通過(guò)自己的私鑰解密數(shù)據(jù)獲得原文。而我方也可以獲得對(duì)方的公鑰,并將返回的數(shù)據(jù)加密后傳輸給對(duì)方,然后對(duì)方使用自己的私鑰進(jìn)行解密獲得我們傳遞給它的原文數(shù)據(jù)。

而 HTTPS 是通過(guò) CA 頒發(fā)的證書(shū)來(lái)獲取公鑰的,瀏覽器通過(guò)公鑰加密請(qǐng)求數(shù)據(jù)傳輸給服務(wù)器,服務(wù)器也是通過(guò)相同的原理來(lái)向?yàn)g覽器客戶端發(fā)送密文數(shù)據(jù)。因此,在數(shù)據(jù)傳輸過(guò)程中,使用 HTTPS 的傳輸會(huì)更加地安全,即使被截獲了,對(duì)方也沒(méi)有證書(shū)提供的密鑰來(lái)進(jìn)行解密。這就是現(xiàn)在所有 App 和 小程序 應(yīng)用都要求使用 HTTPS 的原因,當(dāng)然,我們?nèi)绻鼍W(wǎng)站開(kāi)發(fā)也最好使用 HTTPS ,就連百度對(duì) HTTPS 的收錄也有相應(yīng)的調(diào)整。

簽名及驗(yàn)證

接下來(lái)我們?cè)俳佑|一個(gè)簽名的概念。當(dāng)兩端進(jìn)行通信時(shí),我們?cè)趺粗喇?dāng)前傳輸過(guò)來(lái)的數(shù)據(jù)一定是對(duì)端發(fā)送過(guò)來(lái)的的呢,中間有沒(méi)有黑客進(jìn)行了篡改呢?這個(gè)就可以通過(guò)簽名機(jī)制來(lái)進(jìn)行驗(yàn)證。

// 利用私鑰生成簽名
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
var_dump($signature);

// 公鑰驗(yàn)證簽名
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(1)

我們通過(guò) openssl_sign() 來(lái)生成一個(gè)對(duì)原始數(shù)據(jù)的私鑰簽名,然后就可以使用 openssl_verify() 通過(guò)公鑰驗(yàn)證數(shù)據(jù)簽名是否一致。

在使用的時(shí)候,發(fā)送方通過(guò)自己的私鑰生成簽名,由于簽名內(nèi)容是亂碼的,我們可以將它 base64_encode() 一下,然后連同加密數(shù)據(jù)一起傳遞給接收方。然后接收方使用公鑰并根據(jù)簽名內(nèi)容來(lái)驗(yàn)證原文數(shù)據(jù)是否被篡改過(guò)。

// 發(fā)送方簽名
$resquestSign = base64_encode($signature);

// 假設(shè)通過(guò)網(wǎng)絡(luò)請(qǐng)求發(fā)送了數(shù)據(jù)
// ……
// 接收到獲得簽名及原始數(shù)據(jù)
// $signature = $_POST['sign'];
// openssl_private_decrypt($_POST['data'], $data, $privateKey); 

$responseSign = base64_decode($signature);
// 驗(yàn)證數(shù)據(jù)有沒(méi)有被篡改
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(1)

// 假設(shè)被篡改
$data = '我被修改了';
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(0)

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PHP怎么使用OpenSSL加密中的非對(duì)稱加密”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!


本文標(biāo)題:PHP怎么使用OpenSSL加密中的非對(duì)稱加密
URL鏈接:http://weahome.cn/article/gohhhe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部