搜尋
首頁php教程PHP开发PHP的openssl加密擴充功能使用小結

引言

網路的發展史上,安全性一直是開發者們相當重視的一個主題,為了實現資料傳輸安全,我們需要保證:資料來源(非偽造請求)、資料完整性(沒有被人修改過) 、資料私密性(密文,無法直接讀取)等。雖然現在已經有SSL/TLS協議實現的HTTPS協議,但是因在客戶端上依賴瀏覽器的正確實現,而且效率又很低,所以一般的敏感資料(如交易支付資訊等)還是需要我們使用加密方法來手動加密。

雖然對於一般的WEB開發人員來說,大可不必深入了解一些安全相關的底層技術,但學習加密基礎知識,使用現有加密相關工具卻十分必要。由於工作需要,自己看了些加密相關文章,結合自己的使用經歷,完成此文。

加密基礎

學習如何使用加密之前,我們需要先了解一些加密相關的基礎知識。

加密演算法一般分為兩種:對稱加密演算法和非對稱加密演算法。

對稱加密

對稱加密演算法是訊息發送者和接收者使用同一個密匙,發送者使用密匙加密了文件,接收者使用同樣的密匙解密,獲取資訊。常見的對稱加密演算法的特點有:des/aes/3des.

對稱加密演算法的特點有:速度快,加密前後文件大小變化不大,但是密匙的保管是個大問題,因為訊息發送方和接收方任意一方的密匙遺失,都會導致訊息傳輸變得不安全。

非對稱加密

與對稱加密相對的是不對稱加密,非對稱加密的核心思想是使用一對相對的密匙,分為公匙和私匙,私匙自己安全保存,而將公匙公開。公鑰與私鑰是一對,如果用公鑰對資料進行加密,只有用對應的私鑰才能解密;如果用私鑰對資料進行加密,那麼只有用對應的公鑰才能解密。發送資料前只需要使用接收方的公匙加密就行了。常見的非對稱加密演算法有RSA/DSA:

非對稱加密雖然沒有密匙保存問題,但其計算量大,加密速度很慢,有時候我們還需要對大塊資料進行分塊加密。

數位簽章

為了確保資料的完整性,還需要透過雜湊函數計算得到一個雜湊值,這個雜湊值稱為數位簽章。其特點有:

•無論原始資料是多大,結果的長度相同的;
•輸入一樣,輸出也相同;
•對輸入的微小改變,會使結果產生很大的變化;
•加密過程不可逆,無法透過雜湊值得到原來的資料;

常見的數位簽章演算法有md5,hash1等演算法。

PHP的openssl擴充

openssl擴充使用openssl加密擴充包,封裝了多個用於加密解密相關的PHP函數,極大地方便了對資料的加密解密。 常用的函數有:

對稱加密相關:

string openssl_encrypt ( string $data , string $method , string $password)

其中$data為其要加密的數據,$methodod是加密要使用的方法,是加密要使用的方法,為加密要使用$ password是要使用的密匙,函數傳回加密後的資料;

其中$method列表可以使用openssl_get_cipher_methods()來獲取,我們選取其中一個使用,$method列表形如:

Array(
  0 => aes-128-cbc,  // aes加密
  1 => des-ecb,    // des加密
  2 => des-ede3,   // 3des加密
  ...
  )

解密函數為string openssl_encrypt ( string $data , string $method , string $password)

非對稱加密相關:

openssl_get_publickey();openssl_pkey_get_public();   // 从证书导出公匙;
openssl_get_privatekey();openssl_pkey_get_private();  // 从证书导出私匙;

   

openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )

   


使用公匙加密資料,其中$data是要加密的資料;$crypted是一個引用變量,加密後的資料會被放入這個變數中;$key是要傳入的公匙資料;由於被加密資料分組時,有可能不會剛好為加密位數bit的整數倍,所以需要$padding(填充補齊),$padding的可選項有OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分別為PKCS1填充,或不使用填充;

與此方法相對的還有(傳入參數一致):

openssl_private_encrypt(); // 使用私匙加密;
openssl_private_decrypt(); // 使用私匙解密;
openssl_private_decrypt(); // 使用公匙解密;

   

還有簽章和檢查函數:

bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )

   

還有簽章與檢查函數:

array(
  0 => MD5,
  1 => SHA1,
  2 => SHA256,
  ...
)

   

也為簽名函數要為已簽署的資料;$signature為簽章結果的參考變數;$priv_key_id為簽章所使用的私匙;$signature_alg為簽章要使用的演算法,其演算法清單可以使用openssl_get_md_methods ()得到,形如:

// 获取公匙
$pub_key = openssl_get_publickey('test.pem');
 
$encrypted = '';
// 对数据分块加密
for ($offset = 0, $length = strlen($raw_msg); $offset < $length; $offset += $key_size){ 
  $encryptedBlock = &#39;&#39;;
  $data = substr($raw_msg, $offset, $key_size)
  if (!openssl_public_encrypt($data, $encryptedBlock, $pub_key, OPENSSL_PKCS1_PADDING)){
    return &#39;&#39;;
  } else {
    $encrypted .= $encryptedBlock;
 }
 return $encrypted;

   

 


驗簽函數:與簽名函數相對,只不過它要傳入與私匙對應的公匙;其結果為簽名驗證結果,1為成功,0為失敗,-1則表示錯誤;

加密實例

以下是一個非對稱加密使用的小例子:
rrreee

   

而對稱加密就非常簡單了,直接使用ssl_encrypt())不同的要求,如不同的padding,加密區塊大小等等,這些就需要使用者自己調整了。

因為我們是在HTTP協定之上處理的數據,所以數據加密完成後,就可以直接發送了,不用再考慮底層的傳輸,使用cURL或SOAP擴展方法,就可以直接請求接口啦。

結語

密碼學是一個十分高深的學科,它理論艱深,概念繁多,作為一個WEB開發人員,雖然不需要我們去研究其底層實現,但是學會使用封裝好的方法很有利於我們開發。甚至了解其基本實現,也可以觸類旁通,對演算法等有新的理解。

以上這篇PHP的openssl加密擴充使用小結(推薦)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多PHP的openssl加密擴充使用小結相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版