6

전체적인 요점은 사용자가 암호화 된 메시지를 보낼 수있는 간단한 시스템을 설계하는 것입니다 (서버 지원).사용자가 선택한 암호를 사용한 공개 키 암호화?

클라이언트에는 로컬 저장소이 없으므로 사용자가 필요할 때 선택하고 기억하고 입력 할 수있는 암호를 사용해야합니다. 는 (나는이 전체 시스템을 약화 알고 있지만이 하드 요구 사항입니다)

또 다른 요구 사항은 서버가 일반 텍스트 개인 키 또는 메시지를 (예 : 해독하는 데 사용할 수있는 다른 데이터 저장할 수 있다는 것입니다 만 사용자는 암호화 된 메시지를 읽을 수 있습니다. 서버 관리자는을 사용할 수 없습니다.

내 비대칭 키 쌍을 클라이언트에서 생성하고 개인 키의 암호화 된 복사본 (사용자 암호로 암호화 됨)과 함께 서버의 공개 키를 게시하는 것이 좋습니다. 사용자는받는 사람이 게시 한 공개 키를 사용하여 암호화 된 메시지를 다른 사용자에게 보낼 수 있습니다. 사용자가 메시지의 암호를 해독해야하는 경우 자신의 (암호화 된) 개인 키가 서버에서 클라이언트에서 가져와지고 사용자가 제공 한 암호로 해독 된 다음 메시지 암호를 해독하는 데 사용됩니다.

이 말이 맞는가요? 이 시스템 설계에 결함이 있습니까? (짧거나 잘못된 암호를 선택하는 사용자로부터 파생 된 약점은 제외) 이 방법은 유사한 시나리오에서 이미 사용됩니까?

감사합니다 :)

바와 같이
+0

설명과 같이 hushmail.com과 비슷한 소리가납니다. 그들은 사이트에서 보안을 설명하는 백서를 가지고 있습니다. –

+0

감사합니다. 나는 그들을 살펴볼 것입니다. – Patonza

답변

2

제대로 이해하면 신뢰할 수없는 서버를 통해 두 명의 사용자가 개인 통신을 시작할 수있는 시스템을 만들고 싶습니다.

이것은 작동하지 않습니다.

배치 한 시나리오에서 서버는 자체 키 쌍을 생성하고 사용자의 공개 키를 공개 할 수 있습니다. 사용자가 파트너에게 보내는 메시지를 암호화하면 서버가 공개 키로 대체되었음을 감지 할 수 없습니다.서버는 메시지를 암호 해독하고이를 서버 관리자에게 제시하고 실제 파트너 공개 키를 사용하여 메시지를 다시 암호화하고 목적지로 전달합니다.

여기에 누락 된 부분은 인증 기관입니다. 이것은 공개 키와 사용자 이름 간의 바인딩에 디지털 방식으로 서명하는 신뢰할 수있는 제 3 자입니다. 이 바인딩을 인증서라고합니다. 이렇게하면 서버가 암호화에 사용할 공개 키를 클라이언트에 제공하면 클라이언트는 CA의 공개 키를 사용하여 인증서를 확인하고 암호화 할 공개 키가 의도 된 수신자에게 속해 있다는 것을 확신 할 수 있습니다. 공격자가 아닙니다.

사용자는 서버 관리자를 신뢰하는 것보다 더 맛있는 CA를 신뢰해야합니다. 그러나 CA 인증서를 저장하는 변조 방지 방법도 있어야합니다. 실제로 이는 암호 기반 MAC (메시지 인증 코드)을 사용하여 수행됩니다. 또는 CA는 사용자의 개인 키로 디지털 서명 할 수 있습니다 (이 작업은 수행 된 적이 없지만 작동합니다). 그러나 까다로운 부분은 신뢰할 수없는 서버를 우회하여 신뢰할 수있는 출처에서 CA 인증서를 가져 오는 것입니다.

개인 키를 암호로 암호화하는 것은 매우 자주 수행되며 선택한 암호만큼 안전합니다.

사용자가 대역 외 서로 암호를 공유 할 수 있으면 공개 키 암호화가 필요하지 않습니다. 클라이언트는 사용자가 선택한 암호로 공유 암호를 암호화하고 암호 텍스트를 서버에 저장할 수 있습니다.

+0

예, 작동하지 않는 것으로 보입니다. 신뢰할 수있는 CA를 사용하는 방법을 찾아야 할 것 같습니다. 조언 해 주셔서 감사합니다. 어쨌든 서버가 변경되지 않았다고 가정하면 서버에 대한 읽기 권한 만 얻을 수있는 공격자는 아무 것도 가로 채지 못합니다. 또한 다른 시스템 (예 : 신뢰할 수있는 CA를 확인할 수있는 클라이언트 사용)으로 트러스트를 한 번 할당 한 다음 서버에 저장하고 암호화하면 작동하지 않아야합니까? – Patonza

+0

@Patonza - 신뢰할 수있는 CA로 처음 트러스트를 설정 한 경우 클라이언트는 파트너의 공개 키를 자신의 암호로 * 인증 (* 암호화 *)하지 않은 서버 *에 저장할 수 있습니다. 저장된 데이터는 MAC으로 보호되기 때문에 서버가이를 조작 할 수 없습니다. – erickson

+0

공격에 서버에 대한 읽기 액세스 권한 만있는 경우 공격자가 의미하는 것이어서 공격을 통과 한 메시지를 변경할 수 없습니다. 그러나 내가 설명하는 공격은 서버 자체가 손상된 부분이었습니다. – erickson

1

, 계획은 누군가 다른 사람에게받는 사람 만 읽을 수있는 메시지를 보낼 수 있도록해야한다는 점에서 합리적인 것 같다.

  • 개인 키를 암호화, 소금, 그것이 반복 일부 상당히 많은 수의 PBKDF2 같은 것을 사용 : 당신은 이미 생각하지만, 간결함을 위해 밖으로 남아있는 수 있음을 마음에 와서 몇 가지 항목이 있습니다.
  • 이것은 아마도 암시되지만 공개 키를 사용하여 암호화하는 것이 아니라 무작위 키 (예 : AES-256과 같은 경우 32 바이트 임의의 데이터)를 생성하는 것이 좋습니다. 해당 키를 사용하여 메시지를 암호화하고 공개 키로 키를 암호화 한 다음 두 부분을 모두 보냅니다.
  • 설명 된 바와 같이 발신자를 식별 할 수 없습니다. 그것은 순전히 익명의 메시지를 보낼 수 있습니다. 이것은 의도 될 수 있지만 그렇지 않다면 어떤 종류의 식별/인증이 필요할 것입니다.
  • 이전 항목과 다소 비슷하지만 메시지 인증은 설명되지 않습니다. 공격자는 암호화 된 메시지를 변경할 수 있으며받는 사람은 메시지가 변경되었다는 것을 알 수 없습니다. 텍스트 메시지 인 경우 텍스트가 바뀌었기 때문에 텍스트가 수정되었다는 것이 분명합니다. 그러나 일부 유형의 데이터는 수정 된 경우 알려주지 않을 수 있습니다.
+0

보낸 사람 식별/메시지 인증에 대한 요점은이 특정 디자인에서 우선 순위는 아니지만 흥미 롭습니다. 아마도 다른 키 쌍으로 메시지를 서명 할 수 있으며 클라이언트는 서버에 알 ㄴ/신뢰할 수있는 보낸 사람의 키의 암호화 된 디렉터리를 저장할 수 있습니다 - 내가 살펴볼거야. PBKDF2에 대한 귀하의 조언을 따르 겠지만 핵심 강화를위한 업계 표준 인 것으로 보입니다. :) – Patonza

+0

@Patonza - 인증을받지 않으면 개인 정보를 가질 수 없습니다. 프라이버시는 "누군가"로부터 비밀을 지키는 것을 의미합니다. 당신이 누구와 얘기하고 있는지 모를 경우 어떻게 "누군가"가 아닌지 어떻게 알 수 있습니까? – erickson

+1

P. 이 대답이 잘못된 것 같아서 (제안 된 시스템이 의도 된 수신자 만 메시지를 해독 할 수 있음을 의미 함), 각 글 머리 기호의 조언은 매우 뛰어나므로 실제 시스템을 구현하는 경우 신중하게 고려해야합니다. – erickson

1

hushmail이 한 것처럼 들립니다. 그러나 사용자의 개인 키 (암호화 된)가있어 해킹 된 자바 애플릿을 내려야 만 서버의 사용자 비밀번호를 서버로 전송하게되어 큰 문제가있었습니다.

더 나은 해결책은 서버에서 개인 키를 전혀 사용하지 않는 것입니다. 로컬 저장소가 필요하지 않으므로 그만한 것입니다.

사전 공유 암호를 통해 대칭 암호화를 사용하지 않는 이유는 무엇입니까? 그것은 클라이언트 측에 저장 장치없이 할 수 있습니다. 나는 이것이 그의 마지막 단락에서 @erickson이 말한 것이라고 믿는다.

+0

서버에서 클라이언트 코드를 다운로드해야한다고 가정하지 않습니다. 클라이언트에 읽기 전용으로 저장할 수 있습니다. 대칭 암호화는 사용자가 데이터를 공유하기 전에 "충족"해야하기 때문에 선택 사항이 아닙니다. 어쨌든 조언 주셔서 감사합니다 :) – Patonza

1

주요 문제는 암호 해독 코드가 서버에서 다운로드 된 경우 서버 관리자 나 해커가이 코드를 바꿀 수 있다는 것입니다. 클라이언트 측의 사용자는 서버를 신뢰해야하지만 신뢰하기 위해 서버를 확인할 방법이 없습니다.

관련 문제