2012-09-11 3 views
1

익명 사용자가 이벤트에 대한 세부 정보를 입력하고 내 데이터베이스에서 암호화되도록 할 수있는 레일 3 웹 앱을 작성 중입니다. 해당 사용자 또는 사용자가 결정한 이벤트 별 비밀번호가있는 사람 만 검색 할 수 있습니다. 그것을 창조한다.내 암호화 키 암호화 방법이 안전합니까?

나는 암호화와 해싱으로 프로그래밍에 대한 내 머리를 터뜨리기 위해이 모든 것을하고있다. 그래서 약간 과잉이라고할지 모르지만, 나는 '가장 안전한'방식의 작업 모델을 원하고있다. 두 가지 요소가있는 인증이나 지구의 지각 아래 30km 떨어진 비밀 금고에 숨겨져있는 네트워크에 연결되어 있지 않은 컴퓨터에 들어 가지 않고도 (나는 이미 2 개가 있습니다.)

내가 저장하고있는 현재 데이터와 그 암호화는 모두 다음과 같습니다. 나는 안전하지 않은 방법을 사용하고 있는지, 아니면 내 응용 프로그램을 약화 시킬지에 대한 의견을 듣고 싶습니다. 데이터)를 공격합니다.

모든 이벤트는 투명한 데이터 암호화를 사용하여 Oracle 데이터베이스에 저장된 다음과 같은 필드가 있습니다

  • ID
  • EVENT_DATA
  • password_hash
  • encrypted_iv
  • encrypted_key
  • admin_retrievable_event_data
  • 을 광고 min_encrypted_iv
  • admin_encrypted_key

웹 서버에서 패치를 완벽하게 제한된 시스템 권한으로 실행되며, 웹 서버 프로세스는 사이트의 디렉토리 구조의 외부 검색 할 수 없습니다. 웹 서버는 HTTPS 만 실행합니다.

사용자가 이벤트를 만들면 일반 텍스트 데이터를 event_data 필드에 입력하고 비밀번호를 사용하여 데이터를 보호합니다. 데이터를 검색하려면 양식을 제출 한 후 주어진 비밀번호와 함께 제공된 ID 번호 만 입력하면됩니다. 이벤트를 생성하는 동안 사용자는 상자를 선택하여 관리자가 검색 할 수있는 데이터가 생성되도록 허용 할 수 있습니다. 이 옵션은 기본적으로 false로 설정됩니다.

이벤트의이 일반 텍스트는 나중에 설명하는 바와 같이 관리 검색을 위해 메모리에 보관됩니다.

이벤트 데이터는 안전하게 생성 된 임의의 IV 및 키를 사용하여 AES256 CBC 암호화를 사용하여 보호됩니다. IV와 키는 모두 서버에 저장된 공개 키 (RSA 2048 비트)를 사용하여 암호화됩니다. IV와 키는 모두 사용자가 제공 한 암호의 SHA-256 해시와 XOR됩니다. 둘 다 DB에 저장됩니다.

다음으로 사용자 암호는 256 비트의 안전한 무작위로 생성 된 토큰을 소금으로 사용하여 SHA-256으로 해시되고 해시와 소금을 포함하는 콜론 구분 기호로 문자열이 만들어지고 공개 키로 암호화됩니다 이전과 동일) 데이터베이스 password_hash 필드에 저장됩니다.

일반 텍스트 이벤트 데이터는 새로 생성 된 키와 관리자 검색을위한 IV와 같은 프로세스를 거치며 키와 IV는 다른 공개 키 (admin 검색에만 사용됨)로 암호화됩니다. 어떤 것과도 XOR되지 않고 데이터베이스에 저장됩니다.

데이터를 검색하려면 사용자가 이벤트 ID와 암호를 입력하십시오. 먼저 password_hash는 개인 키 (웹에 액세스 할 수없는 디렉토리의 서버에 저장 됨)를 사용하여 암호화되지 않은 상태로 저장됩니다 (개인 키의 비밀번호는 앱에 하드 코딩 됨). 그러면 사용자가 입력 한 비밀번호는 salt가 암호화되지 않은 데이터베이스 항목에서 가져온 암호이고 저장된 암호가 해시 된 암호의 해시와 일치하는 경우 프로세스가 계속됩니다 (그렇지 않으면 "이벤트 ID를 찾을 수 없거나 암호가 잘못되었습니다"오류가 반환됩니다).

암호화 된 키와 IV는 사용자 암호의 새로 생성 된 무염화 된 해시와 XOR되고 암호 해시와 동일한 개인 키/암호로 해독됩니다. 이것들은 이후에 event_data를 해독하고 사용자에게 데이터를 반환하는 데 사용됩니다.

관리자가 데이터를 검색하려면 개인 키를 업로드하고 개인 키의 암호를 입력해야합니다.이 경우 관리자 IV와 키가 해독되고 메모리 내 개인 키가 삭제되며 관리자가 검색 할 수 있습니다 이벤트 데이터가 암호 해독됩니다.


그래서,이 일에 대한 내 디자인은, 내가 서버에서 이벤트 및 사용자 암호 암호화에 사용되는 개인 키를 저장하고, 개인 키 암호가 하드 코딩한다는 데 식별 한 현재 유일한 약점 앱에 그러나 하드웨어 기반 암호화 장비에 많은 돈을 들이지 않고도 그 방법을 볼 수는 없습니다. 누구나이 문제를 피하고 최종 사용자에게 모든 이벤트에 대해 별도의 인증서를 생성하고 개인 키를 제공함으로써 더 나은 방법을 제안 할 수 있다면 이벤트를 해독 할 때마다 다시 업로드하도록 강요합니다 데이터, 나는 그것보다 더 개방적이다.

그 외의 다른 문제가 발생하는 경우, 나는 또한 그것에 대해 듣기가 매우 흥미로 우며, 읽을 자료 나 문제의 설명과 내가 그것을 해결하기 위해 할 수있는 것에 대한 설명이 필요합니다. .

나는 대학 수준의 수학 지식을 갖고 있지 않으며 오히려 암호화를 이해하고자 함에도 불구하고 필자는 모든 종류의 암호화 분석을 할 수있는 수준에 미치지 못한다는 점에 유의하십시오. 이 프로젝트를 통해 나는 이해할 수있는 수준의 개요를 간단히 읽었으며 그 지식을 적용하려고 시도했습니다.

답변

1

체계가 매우 복잡해 보이며 악마가 항상 세부 사항에 있습니다. 응용 프로그램이 사용자의 허가없이 데이터를 검색 할 수 있다면 추가 한 모든 암호화 설탕은별로 가치가 없을 것입니다. 공격은 응용 프로그램 계층을 통해 이루어질 수 있기 때문입니다.

(좋은) 전체 디스크 암호화 소프트웨어가 어떻게 작동하는지 살펴보십시오. 세부 사항에 너무 많이 신경 쓰지 않고 사용자의 암호를 가져 와서 (원하는 해시 기능을 사용하여) 해시 한 다음 데이터를 암호화 할 때이를 대칭 키로 사용하십시오. 사용자가 비밀번호를 잊어 버리면 데이터가 거의 쓸모가 없습니다. , 관리자에게 이메일 보내기,

당신은 사전 공격을 방지하기 위해 거기에 약간의 소금을 추가 할 수 있습니다,하지만 당신은 어딘가에 소금을 저장해야 ... 관리자 액세스의

, 임의의 암호를 생성 해시 한 다음 해시로 해독하고 데이터베이스에 별도로 저장하십시오.

http://blog.cryptographyengineering.com/2011/11/how-not-to-use-symmetric-encryption.html을 살펴보면 IV 및 암호화 모드를 가장 잘 처리하는 방법에 대해 자세히 설명합니다.