2013-07-18 6 views
9

전 인사 부서에서 전직 인원에 대한 기록을 저장하고 검색하는 데 필요한 보충 웹 기반 시스템을 연구하고 있습니다. 나는 그 요구 사항과 싸웠지 만, 결국 시스템은 완전한 SSN으로 검색을 할 수 있어야하고, 완전한 SSN을 검색 할 수 있어야한다는 결론을 내렸다. 이 데이터를 보호하기 위해 일부 단계를 수행하는 것은 나의 제스처를 제쳐두고 제쳐두고 실제로 지금하고있는 일 (당신은 알고 싶지 않음)에 비해 엄청난 개선이 될 것입니다.주민등록번호로 안전하게 저장하고 검색하십시오.

나는 많은 연구를 해왔으며 합리적인 계획을 세웠다. 그러나 모든 것이 암호화/보안과 관련하여 엄청난 복잡성을 가지고 있으며 실수를하는 것은 매우 쉽다.

응용 프로그램의 처음 실행에
  1. 이 큰 임의의 소금을 생성하고 사용하는 128 비트 AES 키는
  2. 응급 복구를위한 일반 텍스트 파일에이 두 가지를 쓰기 것은 RijndaelManaged 다음과 같이 내 거친 계획이다. 이 파일은 안전한 실제 위치에 오프라인으로 저장됩니다. 응용 프로그램은 파일의 존재 여부를 확인하고 경고가 아직 거기에 있으면 경고음을 울립니다.
  3. 소금과 열쇠를 어딘가에 안전하게 보관하십시오. 이것은 제가 훌륭한 대답을하지 못하는 부분입니다. DPAPI 사용을 계획하고 있었지만 실제로는 그 것이 얼마나 안전한지 알지 못합니다. 내가 일반 텍스트로 남겨두고 파일 시스템에 저장된 디렉토리에 대한 액세스를 제한하는 편이 낫겠습니까?
  4. 레코드를 데이터베이스에 쓸 때 위의 큰 소금 값과 함께 SSN을 해시하여 검색 가능한 필드를 생성합니다 (가능한 모든 SSN을 강제로 가져 오지 않고 복구 할 수는 없지만). AES는 원시 SSN을 암호화합니다 (동일한 키를 두 번 암호화하면 다른 결과가 나올 수 있기 때문에) 검색 가능한 (키/iv로) 검색 가능하지만 검색 할 수없는 필드를 생성하는 새 IV가있는 값 검색시
  5. 그냥 입수되면, 필요 이상/IV

기타를 AES 키를 이용하여 DB의 값을 해독 같은 염 검색 값을 해싱 ​​및 DB

  • 에서 찾아 볼 열쇠를 비교적 안전한 방법 (위의 3 번)으로 저장하는 방법은 충분히 견고합니다. 우리를 위해 작동하지 않습니다

    것들 :

    • 는 "이 중 하나를 수행하지 마십시오"는 옵션이 아닙니다. 이 작업을 수행해야하며 수행하지 않으면 a) 우리에게 화를 낼 것이며 b) 전자 메일을 통해 일반 텍스트 문서의 모든 번호를 전달하십시오.

    이 정보는 Google 네트워크의 내부 용이므로 여기에 구현 된 내용 위에 적어도 해당 보호 계층이 있습니다. 그리고 응용 프로그램 자체에 대한 액세스는 활성 디렉토리에 의해 제어됩니다.

    읽고 조언 해 주셔서 감사합니다.

    업데이트 # 1 : SSN 검색 필드에 대해 개인 IV를 유지하는 것은 의미가 없다는 것을 깨달았습니다. 각 레코드에 대해 새 IV를 올바르게 생성하고 암호화 된 값과 함께 저장하는 계획을 업데이트했습니다.

    업데이트 # 2 : 우리가 할 수없는 물건 목록에서 하드웨어를 제거합니다. 나는 약간의 연구를했는데, 생각했던 것보다 더 쉽게 접근 할 수있는 것처럼 보인다.USB 보안 토큰 중 하나를 사용하면 키 저장에 의미있는 보안이 추가됩니까?

  • +1

    는 [IT 보안 (http://security.stackexchange.com/)이 물어 좋은 곳 없었을까요? – Oded

    +1

    우리는 확실히 그들이 당신 – Jonesopolis

    +0

    처음에는 화를하지 않으 : http://security.stackexchange.com/ 더 많은 도움이 될 수 있습니다. 둘째 : SSN이 두 곳에서 동일하면 더 잘 될지 알 수 없도록 암호화 된 ssn과 함께 각 암호화와 함께 새로운 IV를 생성하고이를 암호화 된 SSN으로 저장한다고 생각합니다. 참고로, 저는 보안 전문가가 아닙니다. 구현하기 전에 해당 옵션을 철저히 조사하십시오. –

    답변

    1

    나는 최근에 유사한 문제를 해결해야하며 해싱에 HMAC를 사용하기로 결정했습니다. 이것은 단순한 해시보다 더 많은 보안을 제공합니다. 특히 소금을 칠 수 없으면 (그렇지 않으면 검색 할 수 없습니다).

    그렇다면 가역성 암호화를 위해 임의 소금으로 AES를 사용하십시오.

    아마도이 데이터를 암호화 할 필요는 없지만 선택의 여지가 없었으며 합리적인 해결책처럼 보였을 것입니다. 키 저장과 관련하여 IT 보안 https://security.stackexchange.com/questions/39017/least-insecure-way-to-encrypt-a-field-in-the-database-so-that-it-can-still-be-in

    0

    각 레코드에 대해 새 소금과 IV를 만듭니다. 어떤 이유로 든 데이터를 보고서에 덤프해야한다면 (내 SSN이 없으면) 고유 한 소금과 IV로 설명하는 방법을 사용할 수 있습니다. SSN에서 검색 만하면 가역 암호화 (더 안전한) 대신 실제로 해시 할 수 있습니다.

    +3

    SSN의 경우 데이터에 엔트로피가 거의 없기 때문에 가역 암호화와 거의 비슷하게 해시가되지 않습니까? 누군가 해시가 어떻게 수행되었는지 (소금이 무엇인지) 알았 으면 10 억 개의 가능한 SSN을 모두 해시하고 어떤 것이 일치하는지 확인하는 것이 쉽지 않을까요? –

    +0

    설명하는 것은 무지개 테이블 (해시 조회)입니다. 이것은 바로 나 자신과 다른 사람들이 독특한 소금으로 가치를 해싱하는 것을 제안하는 이유입니다. 이로 인해 이러한 유형의 테이블을 만드는 것이 매우 어렵습니다. 모든 레코드에 대해 가능한 모든 해시를 생성해야하는데 시간이 오래 걸립니다. 단순히 일반적인 소금/키 조합으로 암호화하거나 해싱하는 것은 매우 약합니다. – drz

    +1

    내 이해에서 레코드 당 고유 한 소금을 사용하지 않으면 나중에 SSN을 기반으로 검색 (일치) 할 수있는 능력이 떨어질까요? 또한 사회 보장 번호의 성격 때문에 무지개 테이블이 필요합니까? 공격자가 각 레코드 (고유 한 소금 또는 그렇지 않은 SSN에 대한 제한을 고려하여 가능한 모든 가능한)를 쉽게 계산할 수있는 것처럼 보입니다. –

    0

    나는 입력의 제한된 세트가 당신에게 절대적으로 아무것도 얻지 못하면 어딘가에 읽었을 것이라고 생각한다. 빠른 구글이 SO 유사한 경고와 함께 게시 켜져 :

    Hashing SSNs and other limited-domain information

    가 나는 또한 어떤 보안 전문가입니다 없다는 것을 인정해야하지만, 입력 가능한 숫자가 훨씬 적은 9^10 이상되는 어떤 점잖은 것을 제공 해커가 몇 시간 만에 바람을 피울 수 있어야합니다. SSN을 해싱하는 것은 실제 보안/난이도 장벽이 아니라 성가신 작은 계층을 추가하는 것처럼 보입니다.

    이렇게하는 것이 아니라 다른 것을 할 수 있습니까? 예를 들어, SSN은 이름에 숫자를 연결할 수있는 경우 공격자에게만 가치가 있습니다 (모든 사람이 모든 숫자를 쉽게 열거 할 수 있기 때문에). 이 경우 공격에 비실용적 인 방식으로 SSN이 연결되는 사용자 ID를 암호화 할 수 있습니까? 나는 당신의 직원 테이블에 어떤 종류의 ID가 있다고 가정하고 있지만 어쩌면 그 대신 전자 메일이나 일종의 guid에 해시를 할 수 있습니까? 그렇게하면 SSN 데이터를 얻더라도 해당 링크를 무차별 적으로 관리 할 때까지 직원의 상태를 알 수 없습니다.

    그런데도이 접근법에는 결함이 있습니다. 회사에 많은 직원이 없어야하기 때문입니다. 이 시점에서 모든 것을 달성하기 위해 회사 디렉토리를 추측하고 검사하는 것은 비교적 간단합니다. 아무리 잘게 자르더라도 SSN을 다른 식별 데이터와 함께 저장해야하는 경우이 보안 결함이 존재하게됩니다.

    +0

    예, 저는 해커가 해시 값을 사용하여 사회 보장 번호의 해시를 쉽게 되돌릴 수 있다는 결론에 도달했습니다. 소금 값을 비밀로 유지할 수 있다면 이것을 막을 수 있지만, 그 시점에서 나쁜 방식으로 대칭 암호화를 거의 수행하고있는 것입니다. 어떤 식 으로든 슬라이스하면 전체 시스템의 보안이 비밀 키를 보호합니다. –

    1

    내 질문은 당신이 Web.config의에서 AES 키를 저장하도록 선택할 경우 사용할 수있는 두 가지 방법이 있습니다. 첫 번째 방법은 언급 한대로 DPAPI를 사용하는 것입니다. 그러면 해당 상자의 web.config 응용 프로그램 설정이 암호화됩니다. 당신이 사용할 수있는 다른 방법은 RSA 키 (이것을 MSDN tutorial에서 확인)를 통해 가능합니다. 이것은 DPAPI와 마찬가지로 web.config를 암호화하지만 여러 상자에서 RSA 키를 사용할 수 있으므로 응용 프로그램이 클러스터 된 경우 RSA 키가 더 좋습니다 설정이 좀 더 복잡함).

    이 방법으로 응용 프로그램을 실행하는 컴퓨터가 아닌 응용 프로그램을 실행하기 전에 키를 생성하는 경우 디렉토리에 텍스트 파일을 남겨 둘 가능성이 없습니다. 다음과 같이 키를 생성해야합니다.

    1. RngCryptoServiceProvider
    2. 은 (Rfc2898DeriveBytes)

    는 키 유도 방법을 사용하는 이유는이다 PBKDF2으로 RngCryptoServiceProvider

  • 해시 두 값을 이용하여 임의의 소금 값을 생성하여 랜덤 값을 생성 난수 생성기에서 발생하는 RngCryptoServiceProvider가 불안정한 경우에 대비하여 사용자를 보호합니다.

    대신 AES 128의 사용 AES 256, 이유는 이러한 알고리즘은 거의 무료 높은 보안을 얻을 어쨌든 그래서 매우 빠르다입니다. 또한 CBC 또는 CTR 모드에서 알고리즘을 사용하고 있는지 확인하십시오 (CTR은 BouncyCastle 라이브러리에서 사용 가능). 누군가가 당신의 디렉토리에 영문 파일을 넣을 수 있다면

    지금이 키 절대 보호 기능을 제공하지 않습니다. 이 파일은 응용 프로그램의 일부가되므로 키를 포함한 해독 된 값에 액세스 할 수 있습니다. 이 말을하는 이유는 네트워크와 서버 보안이 최고 수준이어야하기 때문에 네트워크 보안 팀과 협력하여 누구도 해당 상자에 액세스 할 수 없도록해야합니다. 액세스가 필요한 HR 부서 (방화벽은 활성 디렉토리가 아님). 이 응용 프로그램을 어떤 방식 으로든 인터넷을 통해 공개적으로 액세스 할 수 없도록하십시오. 당신은 또한 당신의 HR 부서를 믿을 수

    누군가는 사회 공학 공격의 피해자가되고 보안 모델을 파괴하여 자신의 로그인을 포기 끝낼 수 있었다. 따라서 네트워크 팀과 협력하는 것 외에도 시스템에 들어가기위한 두 가지 요소의 인증 메커니즘을 통합해야하며 TOTP을 구현하는 대신 실제 RSA 키 또는 유사하게 진행하는 것이 좋습니다. 이 방법은 무료 ipad를 얻고 있다고 생각하여 부서원이 암호를 잊어 버린 경우에도 공격자는 응용 프로그램에 들어가기 위해 물리적 장치가 필요합니다.

    Log Everything 누군가가 SSN을 볼 때마다 정기적으로 보관되는 영구적 인 기록의 일부가 될 것입니다. 이렇게하면 신속하게 완화 할 수 있습니다. 또한 누군가가 특정 시간 프레임에서 볼 수있는 레코드 수에 제한을 두었습니다. 이렇게하면 누군가가 응용 프로그램 내에서 데이터를 마이닝 중인지 알 수 있습니다.

    는 다른 사용자가 테이블에 액세스 할 수없는,이 테이블에 액세스 특히 SQL 사용자를 만듭니다. 이렇게하면 특정 사용자 ID와 암호로만 테이블 데이터를 볼 수 있습니다.

    프로덕션 환경에 배포하기 전에 침투 테스트 팀을 고용하여 응용 프로그램을 테스트하고 얻을 수있는 것을 확인해야합니다. 이는 잠재적 인 공격자로부터 응용 프로그램을 강화하는 데 도움이 될 것이며 큰 충고를 줄 수 있습니다. 응용 프로그램의 보안을 강화하는 방법