引言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 #那數十位天關境後期的驕子,皆是暴喝出聲,下一瞬間
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;
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協議數據管理