key === '') { return $value; } $encrypter = service('encrypter'); $encrypted = $encrypter->encrypt($value); return 'ENC:' . base64_encode($encrypted); } catch (Throwable $e) { return $value; } } } if (! function_exists('pii_decrypt')) { function pii_decrypt(?string $value): string { if ($value === null || $value === '') { return ''; } if (strpos($value, 'ENC:') !== 0) { return $value; } try { $config = config('Encryption'); if ($config->key === '') { return $value; } $encrypter = service('encrypter'); $payload = substr($value, 4); // 현재 포맷: ENC: + base64(raw ciphertext) $raw = base64_decode($payload, true); if ($raw !== false) { try { return $encrypter->decrypt($raw); } catch (Throwable $e) { // legacy 포맷 재시도 } } // 레거시 포맷 호환: // - ENC: + encrypter 반환값(rawData=false 환경 등) 또는 // - ENC: + 기타 문자열 포맷 return $encrypter->decrypt($payload); } catch (Throwable $e) { return $value; } } } /** 암호화 대상 개인정보 필드 (member 테이블) */ if (! defined('PII_ENCRYPTED_FIELDS')) { define('PII_ENCRYPTED_FIELDS', ['mb_phone', 'mb_email']); }