PHP函數參考06-加密擴展



原文:
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加密擴展學習(三):證書操作 - 知乎

    或者

    php/PHP中OpenSSL擴展之對稱加解密

    php/PHP中OpenSSL擴展之非對稱加解密

    php/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


原文:
PHP函數參考06-加密擴展 - 9ong
PHP函數參考07-數據庫擴展 - 9ong

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容

  • 今天感恩節哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉變要...
    迷月閃星情閱讀 10,617評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,281評論 1 3
  • 表情是什么,我認為表情就是表現出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 126,131評論 2 7