직렬화 함수의 기능은 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 , 나트륨_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를 통해 해독 한 후, 비 서식 기능을 사용하여 암호화 된 데이터를 원래 PHP 데이터 구조로 복원 할 수 있습니다.
암호화 된 데이터 저장은 데이터 보안 보장의 일부일뿐입니다. 보안을 더욱 향상 시키려면 몇 가지 추가 조치를 취해야합니다.
민감한 데이터를 전송할 때 HTTPS 프로토콜을 사용하여 전송 중에 데이터가 가로 채지 않도록하십시오.
암호화에 사용되는 키는 강력하고 기밀이어야합니다. 간단하거나 쉽게 추측하는 키를 사용하지 마십시오. OpenSSL_RANDOM_PSEUDO_BYTES를 사용하여 임의의 키를 생성 할 수 있습니다.
$key = bin2hex(openssl_random_pseudo_bytes(16)); // 생성하다16바이트 키
정기적 인 키 교체는 모범 사례입니다. 키 회전을 통해 키가 유출 되더라도 공격자는 만료 된 키를 사용하여 모든 데이터에 액세스 할 수 없습니다.
공인 사용자 또는 프로그램 만 민감한 데이터에 액세스 할 수 있는지 확인하십시오. ACL (Access Control List) 또는 역할 관리 시스템을 사용하여 저장된 데이터에 대한 액세스를 제한하십시오.
PHP 객체를 저장하는 경우 PHP 객체 주입 (POI) 공격을 방지해야합니다. 비조화 되면 신뢰할 수없는 입력을 피하십시오. 가능하다면 불신 소스에서 데이터를 처리하기 위해 비 제외신을 사용하지 마십시오.
allend_classes를 사용하여 비 제외 클래스를 제한 할 수 있습니다.
$data = unserialize($encrypted_data, ["allowed_classes" => ["YourClass"]]);
민감한 데이터에 안전한 백업이 있고 백업 자체를 암호화 해야하는지 확인하십시오. 데이터 손실이나 변조를 피하기 위해 백업의 효과와 보안을 정기적으로 확인하십시오.