안전한 PHP 애플리케이션을 구축 할 때 개발자는 종종 데이터 저장 암호화, 사용자 암호 보호, 데이터 전송 암호화 등을 포함하여 암호화 요구에 직면합니다. PHP는 다양한 암호화 방법을 지원합니다. Crypt () 기능은 비밀번호 해싱에 적합한 반면, OpenSSL_* 시리즈 기능은 Symmetric 및 Assymmetric Encryption에 적합합니다.
이 기사에서는 Crypt () 및 OpenSSL_* 기능을 사용하여 암호 해시 보안 및 데이터 암호화 유연성을 모두 고려하기 위해 사용자 정의 암호화 프로세스를 구축합니다.
우리는 다음과 같은 목표를 달성하기를 희망합니다.
사용자 비밀번호 해싱 - crypt ()를 사용하여 돌이킬 수없는 해싱을 수행하십시오.
데이터 암호화 - OpenSSL 대칭 암호화 알고리즘을 사용하여 사용자 민감한 데이터 암호화;
키 보호 - 암호화 프로세스의 보안을 보장하기 위해 키를 생성하고 관리합니다.
데이터 암호 해독 - 올바른 키가 있다면 암호 텍스트를 일반 텍스트로 복원 할 수 있습니다.
crypt () 는 해싱 비밀번호의 기능입니다. 암호 해싱을위한 입증 된 알고리즘 인 BCrypt 알고리즘을 사용하는 것이 좋습니다.
function hash_password($password) {
$salt = '$2y$10$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
return crypt($password, $salt);
}
비밀번호 확인 :
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
이메일 및 ID 번호와 같은 사용자 민감성 데이터를 암호화하기 위해 AES-256-CBC 와 같은 OpenSSL의 대칭 암호화 방법을 사용합니다.
function encrypt_data($plaintext, $key) {
$iv_length = openssl_cipher_iv_length('AES-256-CBC');
$iv = openssl_random_pseudo_bytes($iv_length);
$ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $ciphertext);
}
function decrypt_data($encrypted, $key) {
$data = base64_decode($encrypted);
$iv_length = openssl_cipher_iv_length('AES-256-CBC');
$iv = substr($data, 0, $iv_length);
$ciphertext = substr($data, $iv_length);
return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
OpenSSL_RANDOM_PSEUDO_BYTES ()를 사용하여 보안 키를 생성 할 수 있습니다.
function generate_secure_key($length = 32) {
return base64_encode(openssl_random_pseudo_bytes($length));
}
실제 프로젝트에서는 코드에서 하드 코딩되지 않고 환경 변수 또는 키 관리 서비스 사용과 같은 키를 저장하는 안전한 방법을 사용해야합니다.
$password = 'myStrongPassword123!';
$hashed = hash_password($password);
if (verify_password('myStrongPassword123!', $hashed)) {
echo "비밀번호 확인이 통과되었습니다\n";
}
$key = base64_decode('pL2u0xJNzYX2+x5sK8Xt5c34BLTPWhMHn0h0snA4MlQ='); // 샘플 키
$secret = '사용자 이메일: user@example.com';
$encrypted = encrypt_data($secret, $key);
$decrypted = decrypt_data($encrypted, $key);
echo "암호화 된 데이터: $encrypted\n";
echo "해독 된 데이터: $decrypted\n";
데이터 전송에 HTTPS를 사용하고 암호화 된 데이터는 일반 텍스트 채널을 통해 전송되어서는 안됩니다.
키 관리는 시스템 보안의 핵심이며 Hashicorp Vault와 같은 보안 모듈과 협력하는 것이 좋습니다.
키와 알고리즘을 정기적으로 회전시킵니다.
암호화 키를 GIT 저장소 또는 프론트 엔드 코드로 하드 코딩하지 마십시오.
정기적으로 암호화 프로세스와 알려진 취약점을 적시에 감사합니다.
이 crypt () 과 elssl_* 의 조합은 사용자 인증 및 민감한 데이터 암호화가 필요한 시나리오에 적합합니다.
은행 카드 번호 및 ID 카드의 암호화 된 저장;
사용자 채팅 기록 또는 개인 정보를 보호합니다.
사용자 비밀번호와 데이터를 분리하기 위해 다층 보안 메커니즘을 구축합니다.
배경에서 암호화 된 데이터를 정기적으로 자동 해독하고 분석합니다 (주요 누설 문제에 대해 매우 신중함).
Crypt () 의 돌이킬 수없는 해싱 함수와 OpenSSL의 대칭 암호화 기능을 결합함으로써 사용자 암호 관리에 적합한 비교적 완전하고 안전한 암호화 시스템을 설정하고 데이터 암호화 저장소의 요구를 충족시킬 수 있습니다. 비즈니스 요구와 보안 위협의 발전 으로이 솔루션은 확장 성이 우수합니다.
보다 관련된 구현 계획 및 모범 사례를 보려면 공식 문서 또는 커뮤니티 토론 플랫폼을 방문 할 수 있습니다.