シリアル化関数の関数は、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自体は暗号化メカニズムを提供しないため、保存されたデータは単純なテキストであり、犯罪者によって簡単に改ざんまたは盗まれます。
送信またはストレージ中に保存されたデータのセキュリティを確保するには、通常、シリアル化文字列を暗号化する必要があります。一般的な暗号化方法には、対称暗号化と非対称暗号化が含まれます。 PHPでは、 openssl_encrypt 、 natium_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を使用しないでください。
Aldoct_classesを使用して、 Unserializeクラスを制限できます。
$data = unserialize($encrypted_data, ["allowed_classes" => ["YourClass"]]);
機密データに安全なバックアップがあり、バックアップ自体を暗号化する必要があることを確認してください。データの損失や改ざんを避けるために、バックアップの有効性とセキュリティを定期的に確認してください。