今天,我們對信息安全越來越受重視,WEB開發中的各種加密也變得更加重要。通常跟服務器的交互中,為確保數據傳輸的安全性,避免被人抓包篡改數據,除了 https 的應用,還需要對傳輸數據進行加解密。今天我們來了解下有哪些常見的加密方式。
單向散列加密
單向散列(hash)加密是指把任意長的輸入串變化成固定長的輸出串,並且由輸出串難以得到輸入串的加密方法,這種方法稱為單項散列加密。廣泛應用於對敏感數據加密,比如用戶密碼,請求參數,文件加密等。我們開發中存儲用戶密碼就用到了單向散列加密算法。
常見的單向散列加密算法有:
- MD5
- SHA
- MAC
- CRC
單向散列加密算法的優點有(以MD5為例):
- 方便存儲:加密后都是固定大小(32位)的字符串,能夠分配固定大小的空間存儲。
- 損耗低:加密/加密對於性能的損耗微乎其微。
- 文件加密:只需要32位字符串就能對一個巨大的文件驗證其完整性。
- 不可逆:大多數的情況下不可逆,具有良好的安全性。
單向散列加密的缺點就是存在暴力破解的可能性,最好通過加鹽值的方式提高安全性,此外可能存在散列沖突。我們都知道MD5加密也是可以破解的。
對於PHPer來說,不推薦使用md5()簡單加密,而是推薦大家使用password_hash()對數據加密存儲,該函數使用足夠強度的單向散列算法創建密碼的哈希(hash),使加密后的數據更加安全可靠。對於用戶密碼的加密存儲和驗證支持相當好。
示例代碼:
//密碼加密 $password = '123456'; $passwordHash = password_hash( $password, PASSWORD_DEFAULT, ['cost' => 12] ); //密碼驗證 if (password_verify($password, $passwordHash)) { //Success } else { //Fail }
對稱加密
同一個密鑰可以同時用作數據的加密和解密,這種方法稱為對稱加密。應用於相對大一點的數據量或關鍵數據的加密的場景。我們開發中常用到接口參數簽名驗證服務就用到了對稱加密算法。
常見的對稱加密算法有:
- DES
- AES
AES 是 DES 的升級版,密鑰長度更長,選擇更多,也更靈活,安全性更高,速度更快。
對稱加密優點是算法公開、計算量小、加密速度快、加密效率高。
缺點是發送方和接收方必須商定好密鑰,然后使雙方都能保存好密鑰,密鑰管理成為雙方的負擔。
對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。
PHP示例
//DES加密 $key = '123kils1321dshfdsvcxpUsdaq23'; //安全密鑰 $data = 'name=iphone11&order_id=201233232323123&price=3357&num=2';//加密明文 $decodeData = openssl_encrypt($data, 'DES-ECB', $key, 0);
使用PHP自帶的openssl_encrypt加密方法,對數據進行DES加密結果如下:
oc3PdhugNue/t3i8HfXjd9YUP9BnTLg0Re9R1u2fsZr0jU2hIpCIjR0bruAwNSIGkqulrNHGYm8=
另外一方在拿到密文后,再使用相同的密鑰,使用openssl_decrypt()對密文進行DES解密:
$key = '123kils1321dshfdsvcxpUsdaq23'; //安全密鑰 $decodeData = 'oc3PdhugNue/t3i8HfXjd9YUP9BnTLg0Re9R1u2fsZr0jU2hIpCIjR0bruAwNSIGkqulrNHGYm8='; $de = openssl_decrypt($decodeData, 'DES-ECB', $key, 0); echo $de;
運行代碼,最后得到解密后的結果:
name=iphone11&order_id=201233232323123&price=3357&num=2
DES-ECB是加密方式,可以到php官方文檔上查看更多加密方式:https://www.php.net/manual/zh/function.openssl-get-cipher-methods.php
非對稱加密
非對稱加密是指需要兩個密鑰來進行加密和解密,這兩個秘鑰分別是公鑰(public key)和私鑰(private key),這種方法稱為非對稱加密。非對稱加密適合於對安全性要求很高的場景,適合加密少量數據,比如支付數據、CA數字證書等。
常見的非對稱加密算法有RSA,RSA2。
非對稱加密的優點是與對稱加密相比,安全性更好,加解密需要不同的密鑰,公鑰和私鑰都可進行相互的加解密。
缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。
非對稱加密算法的RSA2比RSA有更強的安全能力。螞蟻金服,新浪微博 都在使用 RSA2 算法。
創建公鑰和私鑰:
openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem
執行上面命令,會生成private_key.pem和public_key.pem 兩個文件。
具體示例代碼我們在后續的文章專門會講解,敬請留意。
前端加密
前端的朋友可能會關注前端js加密,我們在做 WEB 的登錄功能時一般是通過 Form 提交或 Ajax 方式提交到服務器進行驗證的。為了防止抓包,登錄密碼肯定要先進行一次加密(RSA),再提交到服務器進行驗證。一些大公司都在使用,比如淘寶、京東、新浪 等。
前端加密也有很多現成的js庫,如:
JS-RSA: 用於執行OpenSSL RSA加密、解密和密鑰生成的Javascript庫,https://github.com/travist/jsencrypt
MD5: 單向散列加密md5 js庫,https://github.com/blueimp/JavaScript-MD5
crypto-js: 對稱加密AES js庫,https://github.com/brix/crypto-js
https://www.helloweba.net/news/629.html
