PHP的openssl加密擴充套件使用小結

2021-09-07 17:38:49 字數 3542 閱讀 5164

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

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

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

對稱加密演算法是訊息傳送者和接收者使用同乙個密匙,傳送者使用密匙加密了檔案,接收者使用同樣的密匙解密,獲取資訊。常見的對稱加密演算法有:des/aes/3des.

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

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

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

為了保證資料的完整性,還需要通過雜湊函式計算得到乙個雜湊值,這個雜湊值被稱為數字簽名。其特點有:

常見的數字簽名演算法有md5,hash1等演算法。

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

其中$data為其要加密的資料,$method是加密要使用的方法,$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(); //

從證書匯出私匙;

它們都只需要傳入證書檔案(一般是.pem檔案);

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_public_decrypt(); //

使用公匙解密;

openssl_private_decrypt — decrypts data with private

keyopenssl_private_encrypt — encrypts data with

private

keyopenssl_public_decrypt — decrypts data with

public

keyopenssl_public_encrypt — encrypts data with

public

key

還有簽名和驗籤函式:

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 ] )

簽名函式:$data為要簽名的資料;$signature為簽名結果的引用變數;$priv_key_id為簽名所使用的私匙;$signature_alg為簽名要使用的演算法,其演算法列表可以使用openssl_get_md_methods ()得到,形如:

array

( 0 => md5,

1 => sha1,

2 => sha256,

...)

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

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

//

獲取公匙

$pub_key = openssl_get_publickey('test.pem');

$encrypted = '';

//對資料分塊加密

for ($offset = 0, $length = strlen($raw_msg); $offset

< $length; $offset += $key_size

) else

return

$encrypted;

而對稱加密就非常簡單了,直接使用ssl_encrypt()函式即可;

當然一些介面可能會對加密方法進行不同的要求,如不同的padding,加密塊大小等等,這些就需要使用者自己調整了。

因為我們是在http協議之上處理的資料,所以資料加密完成後,就可以直接傳送了,不用再考慮底層的傳輸,使用curl或soap擴充套件方法,就可以直接請求介面啦。

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

轉 :

PHP的openssl加密擴充套件使用小結

網際網路的發展史上,安全性一直是開發者們相當重視的乙個主題,為了實現資料傳輸安全,我們需要保證 資料 非偽造請求 資料完整性 沒有被人修改過 資料私密性 密文,無法直接讀取 等。雖然現在已經有ssl tls協議實現的https協議,但是因在客戶端上依賴瀏覽器的正確實現,而且效率又很低,所以一般的敏感...

PHP的openssl加密擴充套件使用小結

對稱加密 salt 123456 flag function exists openssl encrypt yy openssl get cipher methods var dump yy vv 你好 tt openssl encrypt vv,yy 58 salt var dump tt jie...

PHP的openssl加密擴充套件使用小結

網際網路的發展史上,安全性一直是開發者們相當重視的乙個主題,為了實現資料傳輸安全,我們需要保證 資料 非偽造請求 資料完整性 沒有被人修改過 資料私密性 密文,無法直接讀取 等。雖然現在已經有ssl tls協議實現的https協議,但是因在客戶端上依賴瀏覽器的正確實現,而且效率又很低,所以一般的敏感...