在php開發中,數據加密應根據場景選擇合適算法。一、用戶密碼存儲推薦password_hash()和password_verify()函數;二、數據完整性校驗使用hmac;三、可逆加密選用aes對稱算法;四、數字簽名和身份認證采用rsa非對稱加密。密碼加密需避免md5或sha256,應使用password_default參數自動處理鹽值。aes加密需隨機iv并妥善保存密鑰。rsa適用于少量數據加密和簽名驗證,如接口調用和支付回調。合理加密能顯著提升系統安全性。
在PHP開發中,數據加密是保護敏感信息的重要手段。不管是用戶密碼、支付信息還是其他私密數據,加密存儲和傳輸幾乎是標配操作。實現方式并不復雜,但要選對算法、用對方法。
一、常見的加密場景與對應算法
PHP支持多種加密算法,不同的使用場景需要選擇合適的加密方式:
- 用戶密碼存儲:推薦使用password_hash()和password_verify()函數,它們默認使用BCrypt算法,安全且方便。
- 數據完整性校驗:例如驗證API請求來源,可以使用HMAC(如hash_hmac())來簽名和驗證。
- 數據加密傳輸或存儲:如果需要可逆加密,比如加密用戶的身份證號并能解密回來,可以選擇AES等對稱加密算法。
- 數字簽名和非對稱加密:適用于身份認證、電子合同等場景,常用RSA算法。
不同場景下使用的加密方式差別較大,不能混用。
立即學習“PHP免費學習筆記(深入)”;
二、如何安全地存儲用戶密碼?
用戶密碼是最常見的加密需求之一。很多人誤以為只要用MD5或者SHA256哈希一下就安全了,其實不然。
正確的做法是使用:
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
然后在登錄時驗證:
if (password_verify($inputPassword, $storedHash)) { // 驗證通過 }
關鍵點:
- PASSWORD_DEFAULT會自動選用當前最安全的算法(目前是BCrypt)
- 自動處理鹽值(salt),不需要手動干預
- 不建議自行拼接鹽或多次哈希
這種方式簡單又安全,PHP官方也推薦使用。
三、AES對稱加密的基本用法
如果你需要加密某些字段,并在之后還能解密出來,可以使用AES這類對稱加密算法。
一個簡單的例子:
function encrypt($data, $key) { $ivLength = openssl_cipher_iv_length('AES-256-CBC'); $iv = openssl_random_pseudo_bytes($ivLength); $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv); return base64_encode($iv . $encrypted); } function decrypt($data, $key) { $data = base64_decode($data); $ivLength = openssl_cipher_iv_length('AES-256-CBC'); $iv = substr($data, 0, $ivLength); $encrypted = substr($data, $ivLength); return openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv); }
注意事項:
- 密鑰必須妥善保存,不能硬編碼在代碼里
- 使用CBC模式時一定要隨機IV,每次加密都不同
- 加密結果要用base64編碼后再存儲或傳輸
這個方法適合用于加密數據庫中的敏感字段,比如手機號、身份證號等。
四、非對稱加密:RSA的典型應用
非對稱加密常用于接口簽名、身份認證等場景。生成一對公私鑰后,可以用公鑰加密、私鑰解密。
生成密鑰命令(使用OpenSSL):
openssl genrsa -out private_key.pem 2048 openssl rsa -pubout -in private_key.pem -out public_key.pem
PHP中使用:
// 加密(使用公鑰) openssl_public_encrypt($data, $encrypted, $publicKey); // 解密(使用私鑰) openssl_private_decrypt($encrypted, $decrypted, $privateKey);
適用場景:
- 用戶注冊時客戶端用公鑰加密密碼再發送
- 支付回調通知的簽名驗證
- 接口調用的身份簽名驗證
注意:RSA加密的數據長度受限,通常只用來加密少量數據(如密鑰本身),不適用于大段文本。
基本上就這些常見做法。加密不是萬能的,但合理的加密可以顯著提升系統安全性。關鍵是根據實際場景選擇合適的方法,并正確實現。