OpenSSL使用小結

引言php

  互聯網的發展史上,安全性一直是開發者們至關重視的一個主題,爲了實現數據傳輸安全,咱們須要保證:數據來源(非僞造請求)、數據完整性(沒有被人修改過)、數據私密性(密文,沒法直接讀取)等。雖然如今已經有SSL/TLS協議實現的HTTPS協議,可是因在客戶端上依賴瀏覽器的正確實現,並且效率又很低,因此通常的敏感數據(如交易支付信息等)仍是須要咱們使用加密方法來手動加密。算法


加密基礎瀏覽器

學習如何使用加密以前,咱們須要瞭解一些加密相關的基礎知識。安全

加密算法通常分爲兩種:對稱加密算法和非對稱加密算法。ide

對稱加密

對稱加密算法是消息發送者和接收者使用同一個密匙,發送者使用密匙加密了文件,接收者使用一樣的密匙解密,獲取信息。常見的對稱加密算法有:DES/3DES/AES.函數

對稱加密算法的特色有:速度快,加密先後文件大小變化不大,可是密匙的保管是個大問題,由於消息發送方和接收方任意一方的密匙丟失,都會致使信息傳輸變得不安全。工具

非對稱加密

與對稱加密相對的是非對稱加密,非對稱加密的核心思想是使用一對相對的密匙,分爲公匙和私匙,私匙本身安全保存,而將公匙公開。公鑰與私鑰是一對,若是用公鑰對數據進行加密,只有用對應的私鑰才能解密;若是用私鑰對數據進行加密,那麼只有用對應的公鑰才能解密。發送數據前只須要使用接收方的公匙加密就好了。常見的非對稱加密算法有RSA/DSA:學習

非對稱加密雖然沒有密匙保存問題,但其計算量大,加密速度很慢,有時候咱們還須要對大塊數據進行分塊加密。測試

數字簽名

爲了保證數據的完整性,還須要經過散列函數計算獲得一個散列值,這個散列值被稱爲數字簽名。其特色有:編碼

  • 不管原始數據是多大,結果的長度相同的;
  • 輸入同樣,輸出也相同;
  • 對輸入的微小改變,會使結果產生很大的變化;
  • 加密過程不可逆,沒法經過散列值獲得原來的數據;

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


 

PHP的openssl擴展

首先安裝 openssl,開啓php的 php_openssl 擴展;openssl擴展使用openssl加密擴展包,封裝了多個用於加密解密相關的PHP函數,極大地方便了對數據的加密解密。

對稱加密相關

string openssl_encrypt string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string&$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )

以指定的方式和 key 加密數據,返回原始或 base64 編碼後的字符串或者在失敗時返回 FALSE

data     待加密的明文信息數據

method    加密算法方式。openssl_get_cipher_methods() 可獲取有效密碼方式列表。

options          是如下標記的按位或: OPENSSL_RAW_DATA 、 OPENSSL_ZERO_PADDING

iv      非 NULL 的初始化向量,在使用aes加密時,密鑰長度128:iv 16bit;192:iv 24bit;256:iv 32bit

tag      使用 AEAD 密碼模式(GCM 或 CCM)時傳引用的驗證標籤。

aad       附加的驗證數據。

tag_length  驗證 tag 的長度。GCM 模式時,它的範圍是 4 到 16。

 string openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] )

實例:

1 $encryptString = '那數十位天關境後期的驕子,皆是暴喝出聲,下一瞬間';
2 echo '<pre>';
3 $ss = openssl_encrypt($encryptString, 'AES-128-CBC', '1234567887654321',0,'1234567812345678');
4 #3d/Gei0wiCwSjj3pmS5DF0ZHOesVqLglnAcr3l8+Hjy84/iEyGOIYaTBOgwnth+BsjtOvv1F//dtfRJL71tsv2sxu1OiPSgTTS3/o1mxXCI=
5 
6 echo $ss,PHP_EOL;
7 
8 echo (openssl_decrypt($ss, 'AES-128-CBC', '1234567887654321',0,'1234567812345678'));
9 #那數十位天關境後期的驕子,皆是暴喝出聲,下一瞬間

 

非對稱加密相關

生成 RSA 密鑰對

命令:

openssl  genrsa [-out filename] [-passout arg] [-f4] [-3] [-rand file(s)] [-engine id] [-des|-des3|-idea] [numbits]

實例:

#簡化方式
#生成私鑰
openssl genrsa -out rsa_private_key.pem 1024

#將原始私鑰轉換爲pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

#根據私鑰生成公鑰
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

#----------------------------------------------------------------------------------
#生成1024位rsa私鑰,使用3des算法加密它(不加密使用明文保存密鑰),口令爲trousers
#輸出到文件 rsaprivatekey.pem
openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

#使用私鑰生成公鑰,生成的公鑰輸出到rsapublickey.pem
openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapublickey.prm

 實例:簡單的加密解密類

 1 <?php
 2 
 3 class RsaCrypt {
 4 
 5     const PRIVATE_KEY_FILE_PATH = 'C:/Users/lenovo/rsa_private_key.pem';
 6     const PUBLIC_KEY_FILE_PATH = 'C:/Users/lenovo/ras_public_key.pem';
 7 
 8    
 9     public static function encode($orignData) 
10     {
11         //密鑰文件的路徑
12         $privateKeyFilePath = self::PRIVATE_KEY_FILE_PATH;
13         extension_loaded('openssl') or die('php須要openssl擴展支持');
14         (file_exists($privateKeyFilePath)) or die('密鑰的文件路徑不正確');
15         //生成Resource類型的密鑰,若是密鑰文件內容被破壞,openssl_pkey_get_private函數返回false
16         $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
17      
18         ($privateKey) or die('密鑰不可用');
19         //加密之後的數據,用於在網路上傳輸
20         $encryptData = '';
21         ///////////////////////////////用私鑰加密////////////////////////
22         if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) {
23             return base64_encode($encryptData);
24         } else {
25             die('加密失敗');
26         }
27     }
28    
29     public static function decode($encryptData) 
30     {
31         //公鑰文件的路徑
32         $publicKeyFilePath = self::PUBLIC_KEY_FILE_PATH;
33         extension_loaded('openssl') or die('php須要openssl擴展支持');
34         (file_exists($publicKeyFilePath)) or die('公鑰的文件路徑不正確');
35         //生成Resource類型的公鑰,若是公鑰文件內容被破壞,openssl_pkey_get_public函數返回false
36         $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
37         ($publicKey) or die('公鑰不可用');
38         //解密之後的數據
39         $decryptData = '';
40         ///////////////////////////////用公鑰解密////////////////////////
41         if (openssl_public_decrypt(base64_decode($encryptData), $decryptData, $publicKey)) {
42             return $decryptData;
43         } else {
44             die('解密失敗');
45         }
46     }
47 }
48 
49 $rsa = new RsaCrypt();
50 
51 $en = $rsa->encode('你好');
52 $de = $rsa->decode($en);
53 
54 echo $en;
55 echo $de;

 

OpenSSL 命令總覽

version    用於查看版本信息

enc          用於加解密

ciphers    列出加密套件

genrsa    用於生成私鑰

rsa          RSA密鑰管理(例如:從私鑰中提取公鑰)

req          生成證書籤名請求(CSR)

crl           證書吊銷列表(CRL)管理

ca           CA管理(例如對證書進行簽名)

dgst        生成信息摘要

rsautl       用於完成RSA簽名、驗證、加密和解密功能

passwd    生成散列密碼

rand        生成僞隨機數

speed      用於測試加解密速度                    

s_client    通用的SSL/TLS客戶端測試工具

X509         X.509證書管理

verify        X.509證書驗證

pkcs7        PKCS#7協議數據管理

pkcs8        PKCS#8協議數據管理

pkcs12       PKCS#12協議數據管理

詳細參考 http://blog.csdn.net/as3luyuan123/article/list/3

相關文章
相關標籤/搜索