2013-07-01 2 views
5

레일즈 애플리케이션에서 필드 레벨 암호화를 위해 attr_encrypted 보석을 사용할 것을 고려하고 있습니다. 이 보석과 함께 사용할 암호화 키는 어떻게 생성합니까?attr_encrypted와 함께 사용할 암호화 키를 생성하는 방법

업데이트 :

attr_encrypted에서 사용하는 기본 암호화입니다 Encryptor에 대한 문서는 다음과 같은 상태 (사용에서 | 기본을) :

secret_key = Digest::SHA256.hexdigest('a secret key') 
encrypted_value = Encryptor.encrypt('some string to encrypt', :key => secret_key) 

내가 a secret key은 임의 될 수 있음을 추측 할 -length random string이고 hexdigest에 대한 호출은 적절한 고정 길이 문자열을 계산합니다. 이것을하는 것이 권장되는 방법입니까?

+0

답변을 시도했지만 질문이 있습니다. 누가 (또는 어떤 시나리오가) 평문 데이터를 비밀로 유지하려고합니까? –

+0

데이터베이스의 특정 필드는 주로 오프 사이트 백업 용도 (오프 사이트 백업 시스템에서 암호화 키에 액세스 할 수없는 경우)를 위해 안정적으로 암호화되어야합니다. –

+0

그런 경우, 오프 사이트 시스템이 데이터에 액세스 할 수 있지만 구성 또는 소스 코드에 액세스하지 못했을 것이라고 추측 할 수 있습니까? 아마도 키의 적어도 일부를 저장하는 설정을 잘못하고, 올바른 키를 가져 오는 방법으로 전화를 걸 수있는 보석의 기능을 사용합니다. 그러나 소스 코드가 백업 데이터와 독립적으로 보호되는 경우 , 필드 당 암호화 키의 하드 코딩도 실행 가능합니다. –

답변

6

키는 단지 문자열이며 모든 문자열이 수행하므로 일반 텍스트 데이터를 볼 수없는 사람들로부터 키를 멀리두고 싶습니다. SecureRandom.base64을 사용하여 키를 간단히 생성 할 수 있습니다. 그것은 당신에게 거의 아무런 노력을하지 않고도 무차별 한 힘에 의해 사실상 헤아릴 수 없을 것입니다.

흥미로운 것은 키 관리입니다. 이 젬의 옵션은 다음과 같습니다 :

  • 응용 프로그램에 키를 하드 코드하십시오. 이렇게하면 민감한 데이터를 예기치 않게 읽을 수 없게됩니다. DBA 또는 지원 엔지니어이지만 소스 코드와 데이터베이스에 모두 액세스 할 수있는 경우 보석 작동 방식을 아는 사람은 안전하지 않습니다.

  • 참조 키를 결정하는 명명 된 메소드를 참조하십시오. 이것은 더 흥미 롭지 만주의해야 할 점은 키를 데이터베이스에 넣는 것이 실제로 많은 보안을 추가하지는 않는다는 것입니다. 데이터베이스 및 코드에 액세스 할 수있는 사람은 값이 하드 코딩 된 것처럼 거의 동일하게 수행 할 수 있습니다.

당신은 약간의 일을 개선, 또는 적어도, 응용 프로그램이 위치에서 키의 적어도 일부를 읽을함으로써 암호화 된 데이터에서 분리 된 개발 팀을 얻을 수 개발자 (또는 개발자의 아마 단지 대부분) 프로덕션 환경에서 액세스 할 수 없습니다. 응용 프로그램이 암호화/암호 해독 키에 대한 액세스 권한을 가지고 실행해야하므로이 보석을 그대로 유지하는 것이 더 어렵습니다.

이것이 좋은지 여부는 데이터를 암호화하는 이유에 따라 다릅니다.

+0

+1. 고마워, 닐. 필자의 경우 암호화의 주된 목적은 오프 사이트가되고 키와 물리적으로 분리 된 데이터베이스 백업의 나머지 데이터 암호화입니다.키는 코드와 별도로 보관됩니다. 대부분 프로덕션 서버의 프로덕션 키 값으로 만 설정되는 환경 변수를 통해 설정됩니다. 키는 응용 프로그램의 소스 코드에 포함되지 않습니다. –

+0

생성 된 키의 길이는 얼마입니까? –

+0

'SecureRandom.base64'의 기본 출력은 적절할 것입니다 (~ 22 가지의 가변 문자). 20 문자 더하기를 선택하는 것 외에는 입력하기가 어색한 것을 가질 여유가 있습니다. 여분의 시간을 길게 설정해도 실제로 보안이 강화되지는 않습니다. –

관련 문제