當前位置: 首頁> 最新文章列表> serialize 用於加密存儲:如何確保數據安全?

serialize 用於加密存儲:如何確保數據安全?

gitbox 2025-05-19

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本身並不提供加密機制,因此這個存儲的數據是明文的,容易被不法分子篡改或盜取。

2. 加密存儲

為了確保存儲的數據在傳輸或存儲時的安全性,通常需要對serialize後的字符串進行加密。常見的加密方法有對稱加密和非對稱加密。在PHP 中,我們可以使用如openssl_encryptsodium_crypto_secretbox等加密函數來加密數據。

使用OpenSSL 加密數據

以下是如何在使用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 數據結構。

3. 如何確保存儲數據的安全性?

存儲加密數據只是確保數據安全的一部分。要進一步提高安全性,我們還需要採取一些額外的措施:

1. 使用HTTPS

在傳輸敏感數據時,務必使用HTTPS 協議,這樣可以確保數據在傳輸過程中不被中途截獲。

2. 選擇強密碼和密鑰

加密所使用的密鑰必須強大且保密。避免使用簡單或容易被猜測的密鑰。你可以使用openssl_random_pseudo_bytes生成一個隨機密鑰:

 $key = bin2hex(openssl_random_pseudo_bytes(16));  // 生成16字節的密鑰

3. 定期更新密鑰

定期更換密鑰是一項最佳實踐。通過密鑰輪換,即使某個密鑰被洩漏,攻擊者也無法使用過期的密鑰訪問所有數據。

4. 數據訪問權限控制

確保只有授權的用戶或程序能夠訪問敏感數據。使用訪問控制列表(ACL)或角色管理系統來限制對存儲數據的訪問。

5. 防止PHP 對象注入攻擊

如果存儲的是PHP 對象,必須小心防範PHP 對象注入(POI)攻擊。在unserialize時,要避免不信任的輸入。如果可能,避免使用unserialize來處理來自不信任源的數據。

你可以通過使用allowed_classes來限制unserialize的類:

 $data = unserialize($encrypted_data, ["allowed_classes" => ["YourClass"]]);

6. 數據備份和恢復

確保敏感數據有安全的備份,並且備份本身也要加密。定期檢查備份的有效性和安全性,以避免數據丟失或被篡改。