網際網路的發展史上,安全性一直是開發者們相當重視的乙個主題,為了實現資料傳輸安全,我們需要保證:資料**(非偽造請求)、資料完整性(沒有被人修改過)、資料私密性(密文,無法直接讀取)等。雖然現在已經有ssl/tls協議實現的https協議,但是因在客戶端上依賴瀏覽器的正確實現,而且效率又很低,所以一般的敏感資料(如交易支付資訊等)還是需要我們使用加密方法來手動加密。
學習如何使用加密之前,我們需要了解一些加密相關的基礎知識。
加密演算法一般分為兩種:對稱加密演算法和非對稱加密演算法。
對稱加密演算法是訊息傳送者和接收者使用同乙個密匙,傳送者使用密匙加密了檔案,接收者使用同樣的密匙解密,獲取資訊。常見的對稱加密演算法有:des/aes/3des.
對稱加密演算法的特點有:速度快,加密前後檔案大小變化不大,但是密匙的保管是個大問題,因為訊息傳送方和接收方任意一方的密匙丟失,都會導致資訊傳輸變得不安全。
與對稱加密相對的是非對稱加密,非對稱加密的核心思想是使用一對相對的密匙,分為公匙和私匙,私匙自己安全儲存,而將公匙公開。公鑰與私鑰是一對,如果用公鑰對資料進行加密,只有用對應的私鑰才能解密;如果用私鑰對資料進行加密,那麼只有用對應的公鑰才能解密。傳送資料前只需要使用接收方的公匙加密就行了。常見的非對稱加密演算法有rsa/dsa:
非對稱加密雖然沒有密匙儲存問題,但其計算量大,加密速度很慢,有時候我們還需要對大塊資料進行分塊加密。
為了保證資料的完整性,還需要通過雜湊函式計算得到乙個雜湊值,這個雜湊值被稱為數字簽名。其特點有:
常見的數字簽名演算法有md5,hash1等演算法。
openssl擴充套件使用openssl加密擴充套件包,封裝了多個用於加密解密相關的php函式,極大地方便了對資料的加密解密。 常用的函式有:
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_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 ] )
簽名函式:$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,加密塊大小等等,這些就需要使用者自己調整了。
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協議,但是因在客戶端上依賴瀏覽器的正確實現,而且效率又很低,所以一般的敏感...