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'가 인스턴스 레벨에 있다고 말할 수 있습니까? 그리고 왜 '비공개'제거가 효과가있는 것일까 요? 2)이 방법이 효과적인지 아닌지에 상관없이 왜 개인은 더 이상 그것을 보호하지 않을까요? 감사! – DanielNordby
나는이 오류를 더 자세히 읽어야했다. 메소드를 호출하고 그 결과를 attr_encrypted에 전달해야합니다. 그래서 당신은 할 수 있습니다 :'attr_encrypted : test_field, key : encryption_key'. 공지 기호를 제거하고 그냥 거기에 메서드 이름이 있습니다. 하지만 대신, 응용 프로그램이로드 될 때 한 번 호출하기 때문에 왜 메서드가 생깁니 까? 그래서 그냥 출력 env 내 대답을 업데이트했습니다. – agmcleod
두 번째 질문에 답하기 위해 컨트롤러 렌더링 호출에 노출시키지 않는 것이 안전 할 것입니다. 모델 내에서 액세스하는 한 괜찮습니다. ENV []에 있다고 가정하면 이미 앱의 어느 곳에서나 액세스 할 수 있습니다. – agmcleod