BOARD

자료·레퍼런스

PHP crypt() 함수 및 암호화 방식 가이드

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 9회 작성일 26-09-25 15:51

본문

PHP crypt() 함수 및 암호화 방식 가이드

PHP crypt() 함수의 정의와 salt 인자, 지원되는 암호화 방식을 확인하고 그누보드 레거시 시스템 운영 및 기능 적용에 필요한 내용을 파악합니다.

PHP crypt() 함수의 암호화 방식과 동작 원리

단방향 알고리즘 특성

PHP의 crypt() 함수는 유닉스 표준인 DES 암호화 기법 및 관련 알고리즘을 사용하여 문자열을 암호화합니다. crypt()는 단방향(one-way) 알고리즘을 사용하므로, 한 번 암호화된 문자열을 다시 원문으로 되돌리는 복호화(decrypt) 함수는 존재하지 않습니다.

salt 인자의 역할과 작동 방식

  • crypt(string str [, string salt]) 함수는 암호화될 문자열과 선택적으로 암호화의 기본이 될 salt 문자열 인자를 받습니다.
  • salt 인자가 주어지지 않으면, PHP가 무작위로 생성합니다. 기본적인 DES 암호화인 경우 처음 두 문자가 salt인 문자열을 출력합니다.
  • salt 인수에 따라 암호화 타입이 유발되며, 시스템이 지원하는 암호화 방식에 따라 가용 여부가 결정됩니다. 만약 salt가 제공되지 않고 시스템 기본 암호화 타입이 MD5인 경우, MD5 호환 salt가 생성됩니다.
  • 제공된 salt를 사용할 경우 salt는 한 번만 생성된다는 점에 주의해야 하며, 함수를 재귀적으로 호출할 경우 보안이나 형태에 영향을 줄 수 있습니다.

지원되는 암호화 상수

crypt() 함수가 다양한 암호화 타입을 지원하는 시스템에서, 주어진 타입의 가용 여부에 따라 다음 상수가 0 또는 1로 지정됩니다.

  • CRYPT_STD_DES: 2문자 salt를 가지는 기본 DES 암호화 (표준 DES는 앞에서 8글자만 암호화됨)
  • CRYPT_EXT_DES: 9문자 salt를 가지는 확장된 DES 암호화
  • CRYPT_MD5: $1$로 시작하는 12문자 salt를 가지는 MD5 암호화
  • CRYPT_BLOWFISH: $2$로 시작하는 16문자 salt를 갖는 확장된 DES 암호화
  • CRYPT_SALT_LENGTH: 시스템에 2문자 salt를 적용할 것인지 혹은 더 긴 12문자 MD5 salt를 적용할 것인지를 알려주는 상수

crypt() 함수의 암호화 상수 판별 및 사용 방법

PHP의 crypt() 함수는 다양한 암호화 타입을 지원하는 시스템에서 주어진 타입의 가용 여부에 따라 상수를 0 또는 1로 지정하여 판별합니다. 시스템이 해당 암호화 방식을 지원하는지 확인하려면 아래의 상숫값을 통해 판별할 수 있습니다.

  • CRYPTSTDDES: 0 또는 1로 지정되며, 2문자 SALT를 가지는 기본 DES 암호화를 지원하는지 나타냅니다.
  • CRYPTEXTDES: 0 또는 1로 지정되며, 9문자 SALT를 가지는 확장된 DES 암호화를 지원하는지 나타냅니다.
  • CRYPT_MD5: 0 또는 1로 지정되며, $1$로 시작하는 12문자 SALT를 가지는 MD5 암호화를 지원하는지 나타냅니다.
  • CRYPT_BLOWFISH: 0 또는 1로 지정되며, $2$로 시작하는 16문자 SALT를 갖는 확장된 DES 암호화를 지원하는지 나타냅니다.

활용 예시

특정 알고리즘을 사용하기 전에 해당 상수가 1인지 조건문으로 확인하여 시스템 호환성을 체크할 수 있습니다. 예를 들어 MD5 암호화 방식의 지원 여부는 다음과 같이 확인할 수 있습니다.

if(CRYPT_MD5 == 1) {
 $crypt_str = crypt($my_str, $salt);
}

이와 같이 시스템이 지원하는 암호화 상수 값이 1인지 확인한 후, 각 방식에 맞는 규칙의 salt 문자열을 인자로 전달하여 crypt() 함수를 사용할 수 있습니다.

PHP crypt() 함수와 암호화 방식 개요

crypt() 함수는 유닉스 표준인 DES 암호화 기법을 사용하여 문자열을 단방향으로 암호화한다. 단방향 알고리즘의 특성상 암호화된 문자열을 다시 원문으로 되돌리는 복호화 함수는 존재하지 않는다.

인자 및 작동 방식

  • 인수 구조: string crypt ( string str [, string salt]) 형태로 사용하며, 암호화할 문자열과 선택적으로 두 문자(또는 그 이상)의 salt 문자열이 인자로 전달된다.
  • salt 인자: salt 인자가 주어지지 않으면 PHP가 무작위로 생성한다. 제공된 salt는 한 번만 생성되므로, 이 함수를 재귀적으로 호출할 때 보안이나 출력 형태에 영향을 줄 수 있다.
  • 시스템별 지원 상수: crypt()는 시스템이 지원하는 암호화 타입에 따라 다음과 같은 상수를 0 또는 1로 지정하여 가용 여부를 나타낸다.
    • CRYPT_STD_DES: 2문자 SALT를 가지는 기본 DES 암호화 (앞에서 8글자만 암호화됨)
    • CRYPT_EXT_DES: 9문자 SALT를 가지는 확장된 DES 암호화
    • CRYPT_MD5: $1$로 시작하는 12문자 SALT를 가지는 MD5 암호화
    • CRYPT_BLOWFISH: $2$로 시작하는 16문자 SALT를 갖는 확장된 DES 암호화

운영 및 유지보수 시 주의사항

  • 현재 PHP 최신 버전에서는 crypt() 대신 password_hash() 사용이 권장되므로 본 자료는 최신성 측면에서 한계가 있다.
  • 그누보드 등 레거시 시스템을 유지보수할 때는 config.php 파일의 G5_STRING_ENCRYPT_FUNCTION 설정값(sql_password 또는 create_hash)과 회원 테이블(mb_password)의 암호화 체계가 달라지면 로그인이 불가능해지는 등의 문제가 발생할 수 있으므로 임의로 설정을 변경하거나 암호화 방식을 혼용하지 않도록 주의해야 한다.

상황별 판단 및 행동 가이드

내 상황

  • PHP 환경에서 레거시 시스템 분석 또는 그누보드 회원 패스워드 처리 방식을 확인하려는 운영자·개발자

선택할 기준

  • crypt() 함수는 유닉스 표준 DES 및 관련 알고리즘을 사용하는 단방향 암호화 함수이므로, 복호화 함수가 존재하지 않으며 salt 인자에 따라 암호화 타입이 결정됨
  • 시스템이 지원하는 암호화 상수(CRYPT_STD_DES, CRYPT_EXT_DES, CRYPT_MD5, CRYPT_BLOWFISH)의 값이 1인지 확인하여 호환성을 판단해야 함
  • 그누보드 운영 시 config.php의 G5_STRING_ENCRYPT_FUNCTION 설정(sql_password 또는 create_hash)에 따라 암호화 로직이 달라지므로 임의 변경 시 로그인 오류가 발생할 수 있음에 유의

다음 행동

  1. 코드 내에서 crypt() 함수 사용 시 salt 인자 및 시스템 지원 상수(CRYPT_MD5 등)의 가용 여부를 조건문으로 체크
  2. 그누보드 레거시 시스템 유지보수 시 기존 설정(config.php)과 회원 테이블 암호화 체계를 유지하며 마이그레이션 또는 인증 로직 검토

실전 FAQ

Q. crypt() 함수를 사용할 때 salt 인자를 생략하면 어떻게 동작하나요?

  • 답변: salt 인자가 주어지지 않으면 PHP가 무작위로 생성합니다. 기본적인 DES 암호화의 경우 처음 두 문자가 salt인 문자열을 출력하며, 시스템 기본 암호화 타입이 MD5인 경우 MD5 호환 salt가 자동으로 생성됩니다. 단, 제공된 salt를 사용할 경우 salt는 한 번만 생성되므로 재귀적 호출 시 보안이나 출력 형태에 영향을 줄 수 있으므로 주의해야 합니다.

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.