익명 사용자가 이벤트에 대한 세부 정보를 입력하고 내 데이터베이스에서 암호화되도록 할 수있는 레일 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와 키가 해독되고 메모리 내 개인 키가 삭제되며 관리자가 검색 할 수 있습니다 이벤트 데이터가 암호 해독됩니다.
그래서,이 일에 대한 내 디자인은, 내가 서버에서 이벤트 및 사용자 암호 암호화에 사용되는 개인 키를 저장하고, 개인 키 암호가 하드 코딩한다는 데 식별 한 현재 유일한 약점 앱에 그러나 하드웨어 기반 암호화 장비에 많은 돈을 들이지 않고도 그 방법을 볼 수는 없습니다. 누구나이 문제를 피하고 최종 사용자에게 모든 이벤트에 대해 별도의 인증서를 생성하고 개인 키를 제공함으로써 더 나은 방법을 제안 할 수 있다면 이벤트를 해독 할 때마다 다시 업로드하도록 강요합니다 데이터, 나는 그것보다 더 개방적이다.
그 외의 다른 문제가 발생하는 경우, 나는 또한 그것에 대해 듣기가 매우 흥미로 우며, 읽을 자료 나 문제의 설명과 내가 그것을 해결하기 위해 할 수있는 것에 대한 설명이 필요합니다. .
나는 대학 수준의 수학 지식을 갖고 있지 않으며 오히려 암호화를 이해하고자 함에도 불구하고 필자는 모든 종류의 암호화 분석을 할 수있는 수준에 미치지 못한다는 점에 유의하십시오. 이 프로젝트를 통해 나는 이해할 수있는 수준의 개요를 간단히 읽었으며 그 지식을 적용하려고 시도했습니다.