serialize函數的作用是將一個PHP 數據結構(例如數組、對象)轉換成一個字符串。通過這個函數,我們可以將復雜的數據轉化為可以存儲的格式。
$data = array("username" => "admin", "password" => "123456");
$serialized_data = serialize($data);
echo $serialized_data;
輸出的字符串如下:
a:2:{s:8:"username";s:5:"admin";s:8:"password";s:6:"123456";}
這個字符串可以安全地存儲在文件或數據庫中。但如前所述, serialize本身並不提供加密機制,因此這個存儲的數據是明文的,容易被不法分子篡改或盜取。
為了確保存儲的數據在傳輸或存儲時的安全性,通常需要對serialize後的字符串進行加密。常見的加密方法有對稱加密和非對稱加密。在PHP 中,我們可以使用如openssl_encrypt 、 sodium_crypto_secretbox等加密函數來加密數據。
以下是如何在使用serialize的基礎上進行加密存儲的示例代碼:
$data = array("username" => "admin", "password" => "123456");
$serialized_data = serialize($data);
// 生成密鑰(一般情況下應該保密存儲)
$key = "secretkey123";
// 使用 OpenSSL 進行加密
$encrypted_data = openssl_encrypt($serialized_data, "AES-128-ECB", $key);
// 存儲加密後的數據
echo "Encrypted: " . $encrypted_data;
在上面的代碼中,首先將數據使用serialize轉化為字符串,然後通過openssl_encrypt函數進行加密。這裡使用了對稱加密算法AES-128-ECB(在實際應用中,你可以選擇其他加密方式)。加密後,數據將變得無法直接讀取。
當我們需要使用存儲的加密數據時,我們可以使用openssl_decrypt來解密:
$decrypted_data = openssl_decrypt($encrypted_data, "AES-128-ECB", $key);
$unserialized_data = unserialize($decrypted_data);
// 輸出解密後的數據
print_r($unserialized_data);
通過openssl_decrypt解密後,我們就可以使用unserialize函數將加密的數據恢復成原始的PHP 數據結構。
存儲加密數據只是確保數據安全的一部分。要進一步提高安全性,我們還需要採取一些額外的措施:
在傳輸敏感數據時,務必使用HTTPS 協議,這樣可以確保數據在傳輸過程中不被中途截獲。
加密所使用的密鑰必須強大且保密。避免使用簡單或容易被猜測的密鑰。你可以使用openssl_random_pseudo_bytes生成一個隨機密鑰:
$key = bin2hex(openssl_random_pseudo_bytes(16)); // 生成16字節的密鑰
定期更換密鑰是一項最佳實踐。通過密鑰輪換,即使某個密鑰被洩漏,攻擊者也無法使用過期的密鑰訪問所有數據。
確保只有授權的用戶或程序能夠訪問敏感數據。使用訪問控制列表(ACL)或角色管理系統來限制對存儲數據的訪問。
如果存儲的是PHP 對象,必須小心防範PHP 對象注入(POI)攻擊。在unserialize時,要避免不信任的輸入。如果可能,避免使用unserialize來處理來自不信任源的數據。
你可以通過使用allowed_classes來限制unserialize的類:
$data = unserialize($encrypted_data, ["allowed_classes" => ["YourClass"]]);
確保敏感數據有安全的備份,並且備份本身也要加密。定期檢查備份的有效性和安全性,以避免數據丟失或被篡改。