PHP AES-256 암호화 및 복호화 구현 방법
페이지 정보

본문
PHP 환경에서 opensslencrypt와 openssldecrypt 함수를 활용하여 AES-256-CBC 방식의 암호화 및 복호화 기능을 구현하는 방법을 살펴봅니다.
PHP AES-256-CBC 암호화 및 복호화 구현 방법
PHP 5.3 이상 환경에서 openssl_encrypt()와 openssl_decrypt() 함수를 활용하여 AES-256-CBC 방식으로 문자열을 암호화하고 복호화할 수 있습니다.
1. 암호화 함수 구현 예제
평문을 aes-256-cbc 알고리즘으로 암호화한 뒤 base64_encode()를 통해 웹이나 데이터베이스에서 처리하기 쉬운 문자열로 변환합니다.
// AES 암호화
function AES_encrypt($plain_text, $key='') {
global $key;
$encryptedMessage = openssl_encrypt($plain_text, "aes-256-cbc", $key, true, str_repeat(chr(0), 16));
return base64_encode($encryptedMessage);
}
2. 복호화 함수 구현 예제
base64_decode()로 인코딩된 암호문을 원래의 바이트로 되돌린 후 openssl_decrypt()를 통해 평문으로 복호화합니다.
// AES 복호화
function AES_decrypt($base64_text, $key='') {
global $key;
$decryptedMessage = openssl_decrypt(base64_decode($base64_text), "aes-256-cbc", $key, true, str_repeat(chr(0), 16));
return $decryptedMessage;
}
3. 주요 파라미터 및 옵션 조건
- 알고리즘:
"aes-256-cbc" - options 매개변수:
true(또는OPENSSL_RAW_DATA)를 지정하여 원시 출력 데이터를 사용하며,false를 설정하면 비트별 분리를 하지 않아 문자가 깨지지 않는 차이가 있으나 복호화에는 영향을 주지 않습니다. - IV(초기화 벡터): 예제 코드에서는
str_repeat(chr(0), 16)을 사용하여 16바이트 크기의 고정된 초기화 벡터를 공통으로 사용하고 있습니다.
Base64 인코딩을 활용한 암호문 처리 방법
PHP 환경에서 openssl_encrypt() 함수로 생성한 암호화 결과물(바이너리 형태)을 데이터베이스나 웹에 안전하게 저장하고 전달하기 위해서는 Base64 인코딩을 거쳐 문자열 형태로 변환해야 합니다.
1. 암호화 시 Base64 인코딩 적용 (base64_encode)
openssl_encrypt() 함수의 반환값은 바이트 배열(바이너리)이므로 그대로 저장하면 문자 깨짐 현상이 발생할 수 있습니다. 따라서 base64_encode() 함수를 사용하여 아스키 코드에 해당하는 문자열로 변환합니다.
- 적용 예시 코드
function AES_encrypt($plain_text, $key='') {
global $key;
$encryptedMessage = openssl_encrypt($plain_text, "aes-256-cbc", $key, true, str_repeat(chr(0), 16));
return base64_encode($encryptedMessage);
}
2. 복호화 시 Base64 디코딩 적용 (base64_decode)
저장되거나 전달된 Base64 형태의 암호문을 다시 복호화하려면, 먼저 base64_decode() 함수를 통해 원래의 2진 데이터(바이너리)로 복원한 뒤 openssl_decrypt() 함수에 전달해야 합니다.
- 적용 예시 코드
function AES_decrypt($base64_text, $key='') {
global $key;
$decryptedMessage = openssl_decrypt(base64_decode($base64_text), "aes-256-cbc", $key, true, str_repeat(chr(0), 16));
return $decryptedMessage;
}
AES-256-CBC 암복호화 시 키와 IV 설정 방식
AES-256-CBC 방식을 사용할 때 키(Key)와 초기화 벡터(IV)는 정해진 규격에 맞춰 설정해야 복호화 오류와 보안 취약점을 예방할 수 있습니다.
권장 설정 조건
- 키(Key) 길이:
openssl_encrypt()함수의 세 번째 인자로 들어가는 키는 정확히 32바이트여야 합니다. 길이가 부족하거나 초과하면 잘릴 수 있으므로hash('sha256', 'your-secret-key', true)와 같은 방식을 사용하여 32바이트 키를 생성하는 것이 안전합니다. - IV(초기화 벡터) 길이: IV는 반드시 필요한 요소이며, 16바이트(128비트) 크기로 설정해야 합니다.
- IV 생성 및 관리: 고정된 IV를 사용하는 것은 보안상 취약할 수 있으므로, 실제 운영 환경에서는
openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'))함수를 사용하여 매번 무작위 IV를 생성하고 암호문과 함께 저장하거나 전송하는 방식을 권장합니다.
상황별 구현 및 판단 가이드
- 상황: PHP 5.3 이상에서 AES-256-CBC 암복호화 구현 및 그누보드 연동 시
- 선택 기준:
- 데이터 처리: 바이너리 데이터의 안전한 저장을 위해
base64_encode/decode필수 사용 - 보안 설정: 키는 32바이트(sha256 권장), IV는 16바이트로 관리
- 데이터 처리: 바이너리 데이터의 안전한 저장을 위해
- 다음 행동:
openssl_encrypt호출 시 4번째 인자를true로 설정- 암호화 결과에
base64_encode적용 후 저장 - 복호화 시
base64_decode선행 후openssl_decrypt호출
실전 FAQ
- Q.
openssl_encrypt()실행 시 결과값이 깨져서 출력됩니다.- A.
true(OPENSSL_RAW_DATA) 옵션 사용 시 바이너리 데이터가 반환되므로 정상입니다. 웹 화면 출력이나 DB 저장 전base64_encode()를 적용하세요.
- A.
- Q. 복호화 시 값이 정상적으로 복원되지 않습니다.
- A. 암호화 시 사용한 키와 IV가 복호화 시에도 정확히 일치하는지 확인하십시오. 특히
base64_decode()를 거치지 않고 암호문을 바로 복호화 함수에 넣으면 데이터가 손상되어 복호화가 불가능합니다.
- A. 암호화 시 사용한 키와 IV가 복호화 시에도 정확히 일치하는지 확인하십시오. 특히
- Q. 키와 IV는 어떻게 관리해야 하나요?
- A. 키는 소스 코드 내 하드코딩을 피하고 환경 변수나 별도 설정 파일로 분리하십시오. IV는 고정값 사용 시 보안에 취약하므로, 매 암호화 시마다 무작위로 생성하고 암호문과 함께 저장하는 방식을 권장합니다.
참고자료
기타 참고자료
- blockcodingnara.tistory.com — AES-256-CBC 방식의 암복호화 처리
- m.blog.naver.com — PHP AES-256 암호화, 복호화 openssl_encrypt, base64, rawurldecode : 네이버 블로그
- stackoverflow.com — cryptography - How to encrypt plaintext with AES-256 CBC in PHP using OpenSSL? - Stack…
- m.blog.naver.com — php 암호화, 복호화 opensslencrypt,openssldecrypt 사용하기 : 네이버 블로그
- 이전글제이쿼리 기반 모달 팝업 라이브러리 목록 및 그누보드 적용 가이드 26.09.24
- 다음글그누보드 폼 요소 디자인 개선을 위한 jQuery 플러그인 선택 및 적용 방법 26.09.24
댓글목록
등록된 댓글이 없습니다.