原文:
PHP函數參考06-加密擴展 - 9ong
PHP函數參考07-數據庫擴展 - 9ong
加密安全的隨機數字或字符
如果有需要加密安全的隨機數字或字符,官方建議使用random_int、random_bytes,而不是rand函數,當然他們都是偽隨機函數。
echo rand(-1000,1000)."<br />";
echo random_int(-1000, 1000)."<br />";
echo bin2hex(random_bytes(2));
//848
//-112
//5cf1
Hash哈希
哈希,其實是信息摘要。信息摘要引擎允許使用各種哈希算法直接或增量處理任意長度的信息。
- hash_aogos,在 PHP 7.4.0 中,hash_algos() 會返回下表所示的算法清單,目前大約有53種算法。比如常用的md5、sha256等
- hash,最常用的哈希函數,hash(算法 , 數據 , true返回二進制或false返回16進制字符串),默認返回16進制字符串。
- hash_file,除了數據是一個文件符外,其他和hash函數一樣,也就是將給定的文件內容生成哈希值
- hash_init,這里提到一個增量哈希,hash和hash_file都是一次性將數據或文件內容生成哈希值,增量哈希可以逐步多次通過hash_update等函數,增量填充要要計算哈希的數據或文件或數據流,hash_init,相當于先初始化設置本次哈希的算法等上下文信息,特別是對于hash_hmac需要提供密鑰的算法。
- hash_update,向活躍的哈希運算上下文中填充數據,在一次哈希運算上下文中,可以多次填充數據
- hash_update_file,hash_update_stream,同hash_update一樣,只是數據來源與文件或數據流
- hash_final,結束本次哈希運算上下文,并返回摘要信息結果。通常是hash_init初始化上下文,hash_update相關函數填充上下文數據,hash_final最后返回哈希摘要結果,同樣的有一個raw_output參數用于設置返回二進制或16進制字符串。
- hash_copy,可以復制一個哈希上下文,不影響上一次的哈希上下文,可以單獨用于另外的哈希計算,兩個上下文相互不影響。
- has_hmac,首先我們要了解下hmac是什么,hmac是利用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。hash_hmac就是使用 HMAC 方法生成帶有密鑰的哈希值。更多參考Hash, MAC,HMAC - Songhan - 博客園。
Mcrypt擴展
在php7之前,phper還是很喜歡用到這個擴展的,但:
官方警告:該特性在PHP 7.1.0中已棄用,在PHP 7.2.0中已刪除。
Mcrypt擴展大都是mcrypt_開頭的函數,比如mcrypt_encrypt 、mcrypt_decrypt 、mcrypt_create_iv 等
這里提出來,最重要的還是傳播給大家:
Warning:本函數已自 PHP 7.1.0 起廢棄并將自 PHP 7.2.0 起移除。強烈建議不要使用本函數。
Warning:本函數已自 PHP 7.1.0 起廢棄并將自 PHP 7.2.0 起移除。強烈建議不要使用本函數。
Warning:本函數已自 PHP 7.1.0 起廢棄并將自 PHP 7.2.0 起移除。強烈建議不要使用本函數。
mhash擴展
Note: This extension is obsoleted by Hash. 這個擴展已經過時。
請使用hash相關函數。
OpenSSL
本擴展使用 OpenSSL 庫來對稱/非對稱加解密,以及 PBKDF2、 PKCS7、 PKCS12、 X509 和其他加密操作。除此之外還提供了 TLS 流的實現。
openssl相關函數很多,涉及到對稱加密、非對稱加密,甚至ssl證書,要展開講可以寫好幾篇文章,現在通信都需要數據加密防被破解,需要簽名防篡改。
-
對稱加密算法
對稱加密常用的算法有:AES 、DES 、3DES 、 IDEA 、 RC2 、 RC5 等,比較常用的是 AES 和 DES 。
-
非對稱加密算法
非對稱加密常用的算法有:RSA 、Elgamal 、ECC 等,RSA 非常常用和普遍,SSL 和一些證書算法都是基于 RSA 。
非對稱的實現需要一對密鑰,也就是我們常說的公鑰和私鑰,比如通過openssl_pkey_new生成私鑰,而公鑰其實是從私鑰中抽取出來的,所以實際上我們進行非對稱加解密的時候,私鑰和公鑰加解密可以相互操作,公鑰加密再通過私鑰解密,或者私鑰加密再通過公鑰解密,也就是雙方通信都可以做到發送加密數據給對方,同時可以解密對方發送的數據,保證數據不暴露。
-
經典加密技術:數字信封
我們平常使用的加密技術,通常是數字信封的方式,就是利用對稱加密和非對稱加密方式各自的優點。非對稱加密的安全性高,但速度慢,而且數據量越大速度越慢,那么我們就用它來加密對稱加密的 key ,通常這個 key 不會很大。然后實際的數據實體使用這個對稱加密的 key 來進行對稱加密提升速度。這樣,我們發送給客戶端時,就包括兩個內容,一個是非對稱加密進行加密的 key ,一個使用對稱加密進行加密的數據內容。客戶端拿到信息后,首先使用非對稱加密的密鑰解碼出對稱加密的 key ,然后再使用這個 key 來解密最終的數據內容。
-
簽名與驗簽
為了保證數據通信過程中,不會被截獲篡改數據,我們需要一種技術來驗證數據是否被篡改過,那就是我們常用的簽名與驗簽。
我們可以通過哈希摘要的方式生成簽名并驗簽,同樣OpenSSL也提供了openssl_sign與openssl_verify等函數完成簽名與驗簽操作。
兩者的區別也可以叫做對稱與不對稱,但這里的對稱是指使用了相同密鑰或key(不能對外泄露),而openssl的簽名與驗簽還是通過私鑰與公鑰分別簽名與驗簽,比如使用公鑰簽名,對方使用私鑰驗簽,或者反過來也可以。
-
證書
x509 是標準的公鑰證書規范。通過 openssl_csr_sign() 這個函數,為 CSR 進行簽名后獲得的就是 x509 規范的一個證書內容。在這個證書中是可以提取出公鑰信息的,我們可以將這個證書頒發給用戶或者客戶端,然后由客戶端從證書中抽取公鑰信息來進行數據加密。
-
詳細的openssl函數使用
PHP的OpenSSL加密擴展學習(一):對稱加密 - 知乎
PHP的OpenSSL加密擴展學習(二):非對稱加密 - 知乎
PHP的OpenSSL加密擴展學習(三):證書操作 - 知乎
或者
密碼散列算法函數
password_hash() 使用足夠強度的單向散列算法創建密碼的散列。password_hash() 會為每個密碼散列自動生成隨機的鹽值。
$password = "chinese";
$pwdHash = password_hash($password, PASSWORD_DEFAULT);
//$pwdHash2 = password_hash($password, PASSWORD_BCRYPT);
if(password_verify($password, $pwdHash)){
echo "密碼正確";
}else{
echo "密碼錯誤";
}
sodium
Sodium一個易于使用的可為我們提供加密、解密、簽名,密碼哈希等功能的軟件庫。除了自身強大的功能外,它還為我們提供了一個兼容API和一個外部API,以進一步的幫助我們提高其可用性。Sodium的目標是提供構建更高級別加密工具所需的所有核心操作。
php也在第一時間支持了sodium模塊,但官方文檔正進一步完善中。
關于openssl與sodium:
PHP Encryption with Libsodium | Zend by Perforce
Replacing OpenSSL with Libsodium