2009-10-28 3 views
12

많은 양의 중요한 데이터를 저장해야하는 레일 응용 프로그램을 만들고 있습니다. 고객에게 데이터가 보호되고 있음을 보장하기 위해 사용자별로 암호화하고 싶습니다. 나는 이것을 성취 할 수있는 보석을 찾는 연구를 해왔다. 지금까지 나는 strongboxsafe을 발견했습니다. 함께하면 이것이 나를위한 해결책을 제공하는 것 같습니다.Rails를 사용하여 데이터베이스의 사용자 데이터를 보호하는 방법은 무엇입니까?

그러나 이것이 일반적인 관행인지 궁금합니다. 대부분의 레일 애플리케이션에는 사용자와 관련하여 저장할 중요한 데이터가있는 것으로 보입니다. 이 비밀번호 암호화를 처리하지만 전자 메일 및 기타 개인 데이터도 중요합니다. 이러한 항목을 데이터베이스에 암호화되지 않은 상태로 두어 절대로 손상되지 않는다고 가정하는 것이 일반적입니다. 데이터베이스가 외부 세계와 통신 할 수없는 영역에 있다는 것을 알고 있지만 결정된 공격자는 쉽게이 문제를 해결할 수 있습니다. Rails 개발자가 데이터를 암호화되지 않은 상태로두고 단순히 웹 서버의 보안을 신뢰하는 것이 일반적인 관행입니까?

+0

이 질문은 레일 또는 구현과 관련이 없습니다. –

+0

@Rory :이 질문은 거의 2 살이기 때문에 다른 사이트로 마이그레이션되지 않습니다. –

+0

@Bill - wups - 나는 그 점을 발견하지 못했습니다. 나는 방금 보안 태그를 탐색하고 있었고 날짜에주의를 기울이지도 않았다. 죄송합니다. –

답변

12

데이터베이스를 암호화 할 때의 문제점은 암호화 한 모든 것을 SQL 쿼리에서 사용할 수 없으며 사용하기 전에 암호를 해독해야한다는 것입니다. 즉, 데이터베이스에 가까운 곳에 해독 키를 배치해야하며, 대부분의 경우 누군가가 데이터베이스를 손상시킬 수있는 경우 해독 키가 동시에 손상되었음을 의미합니다. 따라서 암호화 단계는 당신을 거의 사지 못했습니다. 암호를 사용하면 실제로 해시 함수이기 때문에 암호 해독이 필요하지 않습니다. 처음부터 데이터베이스가 절대로 손상되지 않도록하는 것이 훨씬 낫습니다.

해커가 보안의 일부를 손상시킬 수있는 경우 항상 모든 보안 위협이 침입 할 수 있다고 가정합니다. 체인은 가장 약한 링크와 모든 것만 큼 강력합니다.

신용 카드 번호와 사회 보장 번호 (다행스럽게도 일반적으로 색인을 생성 할 필요가 없음)는 아마도 이것에 대한 가장 명백한 예외 일 수 있지만이 질문을해야한다면, 처음부터 항목. 그 물건을 망쳐 놓는 것에 대해 얻을 수있는 모든 종류의 법적 문제가 있습니다.

+4

저는 계층화 된 보안 메커니즘을 사용하는 산업 표준에 반하는 것이 좋지 않다고 생각합니다. 가장 약한 링크만큼 강한 체인에 대한 참조는 방어 메커니즘의 계층화에 적용되지 않습니다. 그러나 필요하지 않으면 민감한 정보를 저장하지 말라는 조언은 좋습니다. – Peder

+2

Bob -보다 유용하고 정확한 가정은 다음과 같습니다. 충분한 시간이 주어지면 공격자가 특정 보안 기능을 손상시킵니다. 이런 이유로 여러 층을 사용하여 방어력을 사용합니다.이를 통해 공격을 볼 수있는 지점까지 공격 속도를 늦추고 대응할 수 있습니다. –

+0

심층 방어가 좋은 생각이지만 데이터베이스 필드를 암호화한다는 것은 해독해야 함을 의미합니다. 어떤 암호화/해독 기법을 사용하면 서버를 합법적 인 목적으로 안전하게 액세스 할 수 있습니다. 또한 보호하려는 위협이 이미 자신의 소유인 해커 인 경우 상자? –

6

신용 카드 번호, SSN 등은 항상 암호화되어 저장되어야합니다.

암호는 단방향 해시를 사용하여 항상 암호화되어 저장되어야합니다. 즉, 사용자가 암호를 제공하면 DB에 저장된 것과 일치하는지 확인할 수 있지만 DB에 암호화 된 표현 만 제공하면 무차별 공격/사전 공격이 아닌 암호를 확인할 수 없습니다.

내 앱에서 암호화되지 않은 표현을 다루기 위해 암호화되지 않은 _ **** 독자와 작성자를 수업에 추가하는 것을 좋아합니다.

class User 
    # has db column encrypted_cc_number 
    def unencrypted_cc_number 
    WhateverEncryptionClassYouUse.decrypt(encrypted_cc_number) 
    end 
    def unencrypted_cc_number=(val) 
    self.encrypted_cc_number = WhateverEncryptionClassYouUse.encrypt(val) 
    end 
end 
3

많은 양의 중요한 데이터를 저장하는 경우 계층 보안 메커니즘과 강력한 암호화를 사용하는 것이 좋습니다. 지불 카드 업계의 데이터 보안 표준 (PCI DSS)이 필요합니다. 다음 지침 문서를 읽어 보시기 바랍니다 : https://www.pcisecuritystandards.org/pdfs/pci_fs_data_storage.pdf.

"절대 해킹 당하지 않을 것이라고 가정해야합니다"

관련 문제