# 개인정보 암호화 (전화번호·이메일 등) > 비밀번호는 해시(일방향), 전화번호·이메일 등은 **암호화(양방향)** 로 저장해, 키가 없으면 개발자도 복호화할 수 없게 하는 방법. --- ## 1. 해시 vs 암호화 | 구분 | 비밀번호 | 전화번호·이메일 등 | |------|----------|---------------------| | **목적** | 로그인 시 “같은지”만 검사 | 화면·연락에 **다시 읽어서** 써야 함 | | **방식** | 해시(일방향) | 암호화(양방향) | | **저장** | 해시만 저장 | 암호문 저장, **키**로 복호화 | 그래서 개인정보는 **암호화**해서 저장하고, 읽을 때만 **복호화**합니다. --- ## 2. “개발자가 해독할 수 없게” 하려면 - 암호화/복호화는 **키(비밀키)** 로 합니다. - 키를 **앱/코드 밖**에 두면, 코드를 아는 개발자라도 키가 없으면 복호화할 수 없습니다. **권장:** - **암호화 키**를 `.env`(또는 환경 변수)에만 넣고, **저장소에는 올리지 않음** (`.env`는 `.gitignore`). - 운영 서버에서는 서버만 갖는 키를 두고, 개발 PC에는 키를 두지 않거나 테스트용 키만 둠. - 필요하면 AWS KMS, HashiCorp Vault 등 **키 관리 서비스**로 키를 분리할 수 있습니다. 이렇게 하면 “키가 없는 사람(예: 코드만 본 개발자)”은 DB에 저장된 암호문을 풀 수 없습니다. --- ## 3. 이 프로젝트에서의 구현 개요 - **대상 필드**: `member.mb_phone`, `member.mb_email` (선택: `mb_name`) - **방식**: 저장 전 암호화, 조회 후 복호화. CI4 `Encryption`(OpenSSL) 사용. - **키**: `app/Config/Encryption.php` → `.env`의 `encryption.key`. 키가 비어 있으면 암호화/복호화를 건너뛰어 기존 평문 데이터와 호환. - **저장 형식**: 암호문 앞에 `ENC:` 접두어를 붙여 “암호화된 값”인지 구분. 기존 평문 데이터는 그대로 두고, 새로 넣거나 수정할 때만 암호화해 저장. --- ## 4. 키 설정 방법 1. **키 생성** (32바이트): ```bash php -r "echo bin2hex(random_bytes(32));" ``` 2. **.env**에 추가 (저장소에 커밋하지 않음): ``` encryption.key = 위에서 나온 64자 hex 문자열 ``` 3. `app/Config/Encryption.php`에서 `$key`가 환경 변수에서 오도록 설정했는지 확인. (기본값은 빈 문자열이고, `.env`에서 덮어쓰면 됨.) 키를 넣지 않으면 암호화/복호화가 동작하지 않고, 값은 평문으로 저장·조회됩니다. --- ## 5. 구현 요약 (이 프로젝트) - **헬퍼**: `app/Helpers/pii_encryption_helper.php` — `pii_encrypt($value)`, `pii_decrypt($value)` - **대상 필드**: `member.mb_phone`, `member.mb_email` (상수 `PII_ENCRYPTED_FIELDS`) - **저장 형식**: 암호화 시 `ENC:` + base64(암호문). 미암호화(키 없음) 또는 기존 평문은 그대로 저장·조회. - **사용처**: `Auth::register` 저장 전 암호화, `Admin\User::store` / `update` 저장 전 암호화, `Admin\User::index` / `edit` 조회 후 복호화. - **설정**: `app/Config/Encryption.php` — `.env`의 `encryption.key`(64자 hex)를 읽어 사용. 키가 없으면 암호화/복호화 생략. --- ## 6. 정리 - 전화번호·이메일 등은 **암호화**해서 저장하고, **키**로만 복호화합니다. - 키를 **코드/저장소 밖**(`.env`·키 관리 서비스)에 두면, **개발자가 해독할 수 없게** 할 수 있습니다. - 비밀번호는 계속 **해시만** 저장하고, 개인정보 필드만 암호화하는 방식이 적절합니다.