결정론적 암호화의 필요성 및 작동 방식
결정론적 암호화는 동일한 키를 사용할 때 동일한 평문 입력에 대해 항상 동일한 암호문을 생성하는 암호화 방식입니다. 이러한 예측 가능성 덕분에 암호화된 데이터를 쿼리할 수 있게 됩니다. 이는 매번 다른 암호문을 생성하는 표준 암호화 방식으로는 불가능했던 기능입니다.
결정론적 암호화가 필요한 주요 사례는 다음과 같습니다.
-
이메일 조회: 암호화된 이메일 주소로 사용자 찾기
-
주민등록번호: 암호화된 주민등록번호로 기록 검색
-
전화번호: 암호화된 연락처 정보로 고객 조회
Rails에서의 설정 및 사용
Rails 애플리케이션에서 결정론적 암호화를 설정하는 단계는 다음과 같습니다.
-
Active Record Encryption 구성:
config/application.rb파일에 다음 키를 설정합니다.ruby config.active_record.encryption.primary_key = Rails.application.credentials.active_record_encryption[:primary_key] config.active_record.encryption.deterministic_key = Rails.application.credentials.active_record_encryption[:deterministic_key] config.active_record.encryption.key_derivation_salt = Rails.application.credentials.active_record_encryption[:key_derivation_salt] -
모델에 적용:
encrypts메서드에deterministic: true옵션을 사용하여 필드를 암호화합니다.ruby class User < ApplicationRecord encrypts :email, deterministic: true encrypts :ssn, deterministic: true end -
암호화된 필드 쿼리: 일반 필드처럼 암호화된 필드를 쿼리할 수 있습니다. Rails는 쿼리 중 암호화를 자동으로 처리합니다.
ruby # 암호화된 이메일로 사용자 찾기 user = User.find_by(email: "user@example.com") # 암호화된 SSN으로 검색 user = User.where(ssn: "123-45-6789").first
결정론적 암호화와 비결정론적 암호화 비교
| 특징 | 결정론적 암호화 | 비결정론적 암호화 |
|---|---|---|
| 암호문 생성 | 항상 동일한 평문에 동일한 암호문 생성 | 동일한 평문에 매번 다른 암호문 생성 |
| 쿼리/인덱싱 | 가능 | 불가능 |
| 보안 | 패턴 감지 가능성으로 인해 보안이 다소 낮음 | 패턴 분석에 더 강력한 보안 |
| 최적 사용처 | 검색이 필요한 필드 | 읽기/표시만 필요한 필드 |
예시:
ruby
class User < ApplicationRecord
encrypts :email, deterministic: true # 검색 가능
encrypts :credit_card_number # 검색 불가, 더 안전함
end
보안 트레이드오프 및 사용 시점
결정론적 암호화는 쿼리 기능을 제공하지만, 보안 트레이드오프를 고려해야 합니다.
- 사용 권장 시점:
- 검색 또는 인덱싱이 필요한 필드
- 중복될 때 민감한 패턴을 드러내지 않는 데이터
- 쿼리 편의성이 약간 감소된 보안보다 중요한 애플리케이션
- 사용 비권장 시점:
- 비밀번호와 같은 고도로 민감한 데이터 (적절한 비밀번호 해싱 사용)
- 패턴 감지가 심각한 위험을 초래하는 데이터
- 쿼리할 필요가 없는 필드