BOARD

자료·레퍼런스

PHP AES-256 암호화 및 복호화 구현 방법

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 12회 작성일 26-09-24 04:08

본문

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바이트로 관리
  • 다음 행동:
    1. openssl_encrypt 호출 시 4번째 인자를 true로 설정
    2. 암호화 결과에 base64_encode 적용 후 저장
    3. 복호화 시 base64_decode 선행 후 openssl_decrypt 호출

실전 FAQ

  • Q. openssl_encrypt() 실행 시 결과값이 깨져서 출력됩니다.
    • A. true(OPENSSL_RAW_DATA) 옵션 사용 시 바이너리 데이터가 반환되므로 정상입니다. 웹 화면 출력이나 DB 저장 전 base64_encode()를 적용하세요.
  • Q. 복호화 시 값이 정상적으로 복원되지 않습니다.
    • A. 암호화 시 사용한 키와 IV가 복호화 시에도 정확히 일치하는지 확인하십시오. 특히 base64_decode()를 거치지 않고 암호문을 바로 복호화 함수에 넣으면 데이터가 손상되어 복호화가 불가능합니다.
  • Q. 키와 IV는 어떻게 관리해야 하나요?
    • A. 키는 소스 코드 내 하드코딩을 피하고 환경 변수나 별도 설정 파일로 분리하십시오. IV는 고정값 사용 시 보안에 취약하므로, 매 암호화 시마다 무작위로 생성하고 암호문과 함께 저장하는 방식을 권장합니다.

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.