2016-09-02 6 views
0

attr_encrypted에 데이터를 저장하기 전에 일부 데이터를 숨기려고합니다. 나중에 로거 출력을 처리해야하지만, 제출 된 양식에서 필드 데이터를 가져 와서 암호화하고 저장하고 싶습니다. 내가 주석 때 private 모든 것이 예상대로 작동하는 것 같다 것을 알 수attr_encrypted를 사용하여 개인용 메서드에 액세스하는 레일

class Agreement < ApplicationRecord 
    attr_encrypted :test_field, key: :encryption_key 

    private 

    def encryption_key 
     ENV['super_secret_key'] 
    end 
end 

:

여기 내 모델입니다. 하지만 분명히 그 정보 (나중에 알고 : 슈퍼 비밀 키)에 공개 액세스를주고 싶지 않아, 그래서 내가 개인 수 싶습니다. 그러나 private을 포함하면 오류가 발생합니다. 구체적으로는 NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)입니다. 내가 뚫어야 할 것은 attr_encrypted이 개인 메서드가 제대로 액세스되지 않기 때문에 전달 된 키를 가져 오지 못하기 때문에 오류가 발생한다는 것입니다.

이론상으로는 attr_encrypted 비트로 메소드를 호출하는 대신 key: ENV['super_secret_key']을 설정할 수 있지만 실제로 목표는 해당 키 테이블을 저장하고 저장하고 회전 할 수있는 새 클래스를 만드는 것입니다. 이는 보안의 추가 레이어를위한 환경 변수에 의해 난독 화됩니다.

제 개인적인 방법으로 어떤 일이 벌어지고 있으며 private은 모델 범위 내 에서조차도 실망스러운 이유가 무엇입니까? 나는 내가 근본적으로 잘못된 것을하고 있다고 생각한다. 그러나 나는 이것을 수행하는 다른 사람들의 사례도 뒤쫓아 왔기 때문에, 나의 실수에 대한 어떤 지침도 크게 감사 할 것이다!

답변

1

문제는 attr_encrypted 호출이 클래스 수준이고 encryption_key 메서드가 인스턴스 수준이라는 점입니다. 대신 다음을 시도하십시오.

class Agreement < ApplicationRecord 
    attr_encrypted :test_field, key: ENV['super_secret_key']] 
end 

틀림없이 테스트되었지만 작동해야합니다.

정말 개인이 더 이상 보안을 설정하지는 않지만. 구성 파일에서 env를 통해로드하면됩니다. 저장소에 하드 코딩되지 않은 한 주로 작업을 수행해야합니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도 그렇게하지 않는 것 같습니다. 1) 나는 무엇을 여기에서 놓치고 있는가? 어떻게'attr_encrypted'가 클래스 레벨에 있고'encryption_key'가 인스턴스 레벨에 있다고 말할 수 있습니까? 그리고 왜 '비공개'제거가 효과가있는 것일까 요? 2)이 방법이 효과적인지 아닌지에 상관없이 왜 개인은 더 이상 그것을 보호하지 않을까요? 감사! – DanielNordby

+0

나는이 오류를 더 자세히 읽어야했다. 메소드를 호출하고 그 결과를 attr_encrypted에 전달해야합니다. 그래서 당신은 할 수 있습니다 :'attr_encrypted : test_field, key : encryption_key'. 공지 기호를 제거하고 그냥 거기에 메서드 이름이 있습니다. 하지만 대신, 응용 프로그램이로드 될 때 한 번 호출하기 때문에 왜 메서드가 생깁니 까? 그래서 그냥 출력 env 내 대답을 업데이트했습니다. – agmcleod

+0

두 번째 질문에 답하기 위해 컨트롤러 렌더링 호출에 노출시키지 않는 것이 안전 할 것입니다. 모델 내에서 액세스하는 한 괜찮습니다. ENV []에 있다고 가정하면 이미 앱의 어느 곳에서나 액세스 할 수 있습니다. – agmcleod