中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP怎么使用OpenSSL加密中的非對稱加密

發布時間:2021-06-03 11:38:47 來源:億速云 閱讀:160 作者:小新 欄目:編程語言

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

PHP的OpenSSL加密擴展學習:非對稱加密

生成私鑰

通過之前的學習,我們知道非對稱加密是分別需要一個公鑰和一個私鑰的。我們就先來生成一個私鑰,也就是存放在我們這一端一個密鑰。請記住,在任何時候,私鑰都是不能給別人的哦!

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

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

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

非常簡單的一個函數 openssl_pkey_new() ,它接收一個參數,這個參數是可配置項并且是可選參數。生成的結果是一個私鑰句柄,不是我們能直接讀取的內容,所以我們再使用 openssl_pkey_export() 來提取可輸出的字符串。

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

抽取公鑰

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

$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() 抽取出來的內容包含很多內容。不過我們所需要的最主要的內容就是 key 下面的這個公鑰。

大家再回過頭來好好看一下公鑰和私鑰的內容,是不是和我們去申請的 HTTPS 證書中的公私鑰內容長得一樣,而且也和我們自己在系統中使用 openssl 命令行生成的本機的密鑰證書一樣。它們本身就是一樣的東西啦,只是在不同的場景應用的不同而已。HTTPS 證書除了非對稱加密的密鑰之外,還包含有 CA 信息,如果 CA 不通過,瀏覽器也會認為證書是無效的,因此,我們使用自己生成的證書來充當 HTTPS 證書是不可以的。而本身生成的一般會用在 SSH 免密登錄上,或者是 GitHub 的免密代碼倉庫操作上。

加密解密數據

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

$data = '測試非對稱加密';

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

// 私鑰解密數據
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
var_dump($decrypted);
// string(21) "測試非對稱加密"

在這里,我們使用的就是最標準的公鑰加密,私鑰解密來進行的測試。其實反過來也是可以的,OpenSSL 分別都為我們提供了公鑰的加解密和私鑰的加解密函數。

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

而 HTTPS 是通過 CA 頒發的證書來獲取公鑰的,瀏覽器通過公鑰加密請求數據傳輸給服務器,服務器也是通過相同的原理來向瀏覽器客戶端發送密文數據。因此,在數據傳輸過程中,使用 HTTPS 的傳輸會更加地安全,即使被截獲了,對方也沒有證書提供的密鑰來進行解密。這就是現在所有 App 和 小程序 應用都要求使用 HTTPS 的原因,當然,我們如果做網站開發也最好使用 HTTPS ,就連百度對 HTTPS 的收錄也有相應的調整。

簽名及驗證

接下來我們再接觸一個簽名的概念。當兩端進行通信時,我們怎么知道當前傳輸過來的數據一定是對端發送過來的的呢,中間有沒有黑客進行了篡改呢?這個就可以通過簽名機制來進行驗證。

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

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

我們通過 openssl_sign() 來生成一個對原始數據的私鑰簽名,然后就可以使用 openssl_verify() 通過公鑰驗證數據簽名是否一致。

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

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

// 假設通過網絡請求發送了數據
// ……
// 接收到獲得簽名及原始數據
// $signature = $_POST['sign'];
// openssl_private_decrypt($_POST['data'], $data, $privateKey); 

$responseSign = base64_decode($signature);
// 驗證數據有沒有被篡改
$r = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($r);
// int(1)

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“PHP怎么使用OpenSSL加密中的非對稱加密”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

常德市| 海阳市| 洛扎县| 舟曲县| 花莲市| SHOW| 西和县| 上饶市| 上栗县| 伊吾县| 遂平县| 洛隆县| 大庆市| 习水县| 建平县| 南召县| 黄陵县| 泽普县| 临猗县| 青浦区| 黄山市| 北票市| 东宁县| 南宫市| 西藏| 阿巴嘎旗| 包头市| 斗六市| 宁明县| 苍山县| 海门市| 景宁| 饶平县| 宁阳县| 闻喜县| 榆中县| 莎车县| 安庆市| 延边| 吉首市| 澳门|