2009-04-02 2 views
6

나 자신에게 건네주고있는 메시지가 중간자 공격의 대상이됩니다. 그 때문에 메시지를 보내는 시점과 메시지를 다시받는 시점 사이에 유지되는 메시지의 무결성에 대해 우려하고 있습니다.메시지 무결성 유지하기

나에게 메시지를 보내면 보낸 메시지에 대한 정보를 나중에 사용할 수 없다고 가정해야합니다. 메시지는 완전히 독립적입니다.

그 목적을 위해 메시지 내용을 해시하고 메시지를 보내기 전에 해시를 비교해야하며 메시지를 보낸 후에 차이가 있다면 메시지가 변조되었음을 알고 있습니다.

물론 man-in-the-middle이 해시가 실제로 메시지 내용의 해시라는 것을 알고 있다면 메시지가 자체 포함되어 있기 때문에 그는 새로운 내용을 만들 수 있으며 동일한 해시 알고리즘을 내용에 적용하십시오.

질문 : 해시를 생성 할 때 메시지 내용을 임의 화하려면 어떤 길이를 사용해야합니까? 언제 그것은 수익을 줄이는 시점에 도달합니까?

이 시나리오에서는 일련의 키/값 쌍이 있습니다. 이를 위해 내가 취해야 할 조치는 다음과 같습니다.

  1. 메시지에 소금을 추가하십시오. 소금은 세계 다른 나라의 비밀입니다. 해시되기 전에 메시지의 내용에 첨부됩니다.
  2. 해시를 생성하기 전에 일관된 방식으로 키/값 쌍을 정렬하십시오.
  3. 은 직접적으로은 아니지만 재생 공격을 방지하기 위해 해시하기 전에 각 메시지의 내용에 타임 스탬프가 추가됩니다.

    1. 를 내가 그들을 주문하기 전에 키를 변형 :

    이 내가 고려하고 선택적인 단계입니다. 나는 그들을 뒤집어 놓고 count/key로 순서를 매긴다 고 생각했다.

  4. 키/값 쌍을 구분하는 구분 기호 (키/값의 구분 기호와 쌍의 구분 기호 모두)로 재생합니다.

참고

메시지의 개인 정보 보호 여기 하지 요구 사항, 그래서 암호화를 찾고 있지 않다. 값은 일반 텍스트로으로 전송해야합니다.

마지막으로, 어떤 해싱 알고리즘을 피해야합니까?


구체적인

I는 I 입력 검증 및 지속성을 처리하는 제어기를하는 ASP.NET MVC 사이트를 가지고있다.

입력이 자동 스팸 시도로 판단되면 입력 값을 사용하여 IDictionary<string, string> 모델이 생성되고 ViewResult가 일반 CAPTCHA 페이지로 전송됩니다 (휴리스틱에 따라 중요하지 않음).

CAPTCHA 컨트롤이 포함 된 양식에서 IDictionary<string, string>의 내용은 숨겨진 입력 필드에 기록되고 양식의 동작은 내용이 처음 게시 된 것과 동일한 동작이됩니다. 이 방법으로 MVC는 양식을 다시 제출할 때 값을 선택할 수 있습니다.

키/값 쌍을 암호화 할 수 없기 때문에 (또는 어쩌면 내가 할 수 있고, 왜, 어떻게 말해?).

물론 해시 된 메시지 내용을 포함하는 값을 하나 더 추가해야합니다. 그 값이 있으면 컨트롤러는 메시지 무결성이 유지되는지 확인하고 입력이 있으면이를 유지합니다.

솔루션

나는 CMS/PKCS # 7 메시지의 signging 및 검증을 나타내는 System.Security.Cyrptography.Pkcs 네임 스페이스의 SignedCms 클래스로 이동하기로 선택했습니다. 이 경우, 지금

http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx

:

디지털 데이터 서명을 나는 Makecert.exe를 가진 자체 발급 된 인증서를 생성 한 다음 내 코드에서, 내가 여기 예를 사용, 정교한하려면 내 보낸 개인 키의 암호는 물론 서버의 보안을 유지해야 프로그래밍에 대한 부담이 줄어 듭니다.

재생 공격을위한 타임 스탬프에 여분의 키를 추가해야하지만 너무 어렵지는 않습니다.

Kalium에 대한 대답은 initial post이 아니지만 디지털 서명 방법을 지적한 후속 의견과 결국 .NET에서이를 활용하는 방법을 찾았습니다.

기여한 모든 분들께 감사드립니다.

답변

6

저는 PGP/GPG가 당신이 원하는 곳이라고 생각합니다.

+0

@Kalium : 아니요, 메시지 개인 정보는 문제가되지 않으며 조금 과장됩니다. 사실 메시지 투명성이 요구됩니다. – casperOne

+1

메시지 무결성을 보장하는 데 여전히 최상의 옵션 일 수 있습니다. 암호화 할 필요없이 서명 만하면됩니다. 공개 키를 보낼 수도 있습니다. – Kalium

+0

@Kalium :이를 위해 .NET에서 좋은 PGP/GPG 리소스에 대한 링크가 있습니까? 또한 "공유 된 비밀"문제는 무엇입니까? 비대칭 키로 해시에 서명한다는 사실은 비공개 키를 비밀로 만들고 해시 할 데이터를 다르게 정렬해야 할 필요성을 없애 줍니까? – casperOne

1

당신은 Digitally Signed message을 원합니다. GPG를 사용하면 암호화없이 메시지에 서명 할 수 있습니다. 은 해시를 생성 할 수 없기 때문에 해시가 개인 키을 사용하기 때문에 사용자가 할 수 있기 때문에 아무도이 키를 조작 할 수 없습니다.

0

메시지에 디지털 서명을해야합니다 (따라서 Kalium에서 권장하는 PGP/GPG는 옵션으로 적합합니다). 만들 수있는 순수한 해시는 공격자가 다시 만들 수 있습니다. 디지털 서명 - 개인 키를 사용하여 공개 키를 사용하여이를 확인합니다 - 솔루션입니다. 다른 것은 무의미하다. 당신이 "안전한"채널 (즉, 해시)를 통해 정보를 전달할 수 있다고 가정

0

여기 당신이 그것을 할 것입니다 방법은 다음과 같습니다

  1. 해시 메시지가, 다음의 개인 키와 해시에 서명. 서명 된 해시를 메시지에 포함 시키십시오.
  2. 메시지를 받으면 공용 키를 사용하여 서명 된 해시를 해독하고 메시지의 실제 해시와 일치하는지 확인하십시오.

공격자는 새 해시를 암호화하기 위해 개인 키가 있어야하므로 메시지를 "가짜"로 만들 수 없습니다. 다른 언급으로

,이/응용 프로그램이 자신의 메시지가 손상되지 않았 음을 확인할 수 있도록 가장 정직 접근 GPG

2

그냥 일반 바닐라 디지털 서명과 PGP 같은 것을 처리 할 수 ​​있습니다 키순 해시 메시지 인증 코드를 사용하는 것입니다. 메시지는 암호화되지 않은 상태로 전송되지만 변조를 방지하기위한 해시도 포함됩니다. 해시는 메시지 내용과 비밀 키에 따라 다릅니다. 중간에있는 사람은 키를 모른 채로 변경된 메시지에서 해시를 위조 할 수 없습니다. 응용 프로그램이 메시지를 작성하고 확인하기 때문에 비밀 키를 공개 할 필요가 없습니다.

나는 특히이 조심스럽게 가능성이 함정의 대부분을 피하기 위해를 통해 생각하고있다으로 RFC-2104 http://www.ietf.org/rfc/rfc2104.txt에 기술 구현을 추천 할 것입니다.

메시지는 신뢰할 수없는 당사자 진위 확인해야하는 경우, 당신은 디지털 서명 방식을 대신 사용해야합니다.

.Net 라이브러리에서 둘 다 지원할 가능성이 있습니다. Miles는 SHA1 해시를 사용하여 키가있는 HMAC를 구현하는 .Net 라이브러리 함수에 대한 MSDN 웹 페이지에 대한 링크를 (주석으로) 유용하게 제공했습니다 : http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx.

+0

+1 HMAC. 대부분의 다른 대답에 의해 제안 된 비대칭 디지털 서명은이 문제에 대해 과도합니다. – Miles

+0

http://en.wikipedia.org/wiki/HMAC - http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.aspx – Miles