문제

좋아, 그냥 작은 게임 :

프로젝트에 대한 사양이 있습니다. 어느 시점에서 그들은 다음과 같이 인터넷을 통해 비밀번호를 암호화하도록 요청하여 도전 대응 프로토콜이라고 말합니다.

CLIENT ----------------------------- SERVER

(1)ask for challenge -------------->

(2)    <---------------------------- send SHA1 taken from the time
                                       (this is the challenge)
(3) make SHA1 xor PASSWORD --------> if it's equal to SHA1 xor stored password

(4)    <---------------------------- Grant access

그것을 모르는 사람들에게 SHA는 암호화의 표준 알고리즘 인 안전한 해싱 알고리즘을 나타냅니다.

분명하기를 바랍니다. 질문은 : 패킷 2와 3 ( "챌린지"및 "챌린지 XOR 비밀번호"를 스니핑한다면, 둘 다 사이에 다른 XOR이있는 실제 비밀번호가 있습니다!?!? 이런 종류의 프로토콜을 구현하는 다른 방법이 있습니다. ??

도움이 되었습니까?

해결책

다음은 어떻습니까 :

  1. 서버는 임의의 도전을 보냅니다
  2. 클라이언트는 SHA1 체크섬 (Challenge+Password)을 보냅니다.
  3. 서버는 SHA1 체크섬 (Challenge+저장 비밀번호)과 비교합니다.

다른 팁

비밀번호를 리버스 엔지니어링 할 수 있습니다. 비밀번호 자체가 아니라 비밀번호의 SHA를 보내려고합니다. 자신의 보안 프로토콜을 굴리는 것은 거의 좋은 생각이 아닙니다. SSL이나 동등한 것을 사용할 수 없습니까?

http://en.wikipedia.org/wiki/cryptographic_nonce

그것은 꽤 끔찍한 프로토콜입니다. 이것이 누군가가 당신이 구현하기를 원하는 것이라면, 거절하십시오. 이러한 유형의 사물에 대한 기존의 심사 프로토콜이 있습니다. 이것이 모든 결함을 지적하는 게임이라면 - 좋아.

  • 2와 3 단계를 듣는 사람은 누구나 암호를 알고 있습니다.
  • 3 단계를 듣고 시간이 지남에 따라 서버의 시간 정밀도에 대한 아이디어가 있으면 암호를 무차별 할 수 있습니다.
  • 서버 (ARP 중독, DNS 실시 등) 인 척하고 암호를 얻을 수 있습니다. 4 단계를 완료하지 못하고 타임 아웃을 시작
  • 클라이언트/서버 또는 서버의 인증서간에 공유 비밀이 없기 때문에 중간 공격의 Man에게 취약합니다.
  • SHA1 (시간)을 저장하고 응답을 기다리는 서버에 의존하므로 도전에 대한 요청으로 서버에 과부하가 걸리고 응답하지 않을 수 있습니다.

그리고 나는 확실히 더 많이 빠졌습니다.

당신이 맞습니다 - 챌린지를 캡처하고 (도전 XOR 비밀번호) 비밀번호를 추출하는 것이 쉽습니다.

XOR이 아닌 3 단계에서 적절한 암호화를 사용해야합니다. 암호로 도전을 암호화합니다.

공격자의 삶을 어렵게 만들려면 암호화 된 것에 임의의 데이터를 추가 할 수 있습니다. 서버는 패딩이 무엇인지 신경 쓰지 않고 도전을 찾을 곳을 알고 있지만 공격자는 전체 일반 텍스트가 무엇인지 알지 못한다는 것을 의미합니다.

상대방이 지적했듯이, 당신은 정확합니다. 또한 누군가가 커뮤니케이션을 가로 채고 (3)를 가로 채고 잠재적으로 재판을받을 수 있음을 명심하십시오. 실제 사용자가 네트워크 문제 (예 : DDOS)를 경험하는 동안 사기꾼은 로그인하고 종종 비밀번호를 변경하기에 충분합니다 (즉. , 많은 시스템에서는 로그인 한 후에는 암호를 변경할 필요가 없습니다).

HMAC (Keyed-Hash 메시지 인증 코드)를 고려할 수 있습니다. 나는 그것에 대해 자세히 설명했다. http://blog.ciscavate.org/2007/09/creating-a-secure-webauth-system-part-1-hmac.html 그리고 아래의 간단한 요약을하겠습니다.

HMAC는 공유 비밀에 액세스 할 수있는 사람이 메시지를 생성하는 방법입니다. HMAC는 메시지와 함께 비밀을 암호화하기 위해 일종의 일원 해싱 함수 (MD5 또는 SHA-1)를 사용합니다. 이것은 메시지+비밀 조합의 지문 역할을하는 16-20 바이트의 짧은 다이제스트를 생성합니다. 다이제스트가 메시지와 함께 전송되면 수신기 (서버)는 동일한 HMAC 계산으로 해시를 재생하고 로컬에서 생성 된 다이제스트를 메시지와 함께 제공 한 다이제스트와 비교할 수 있습니다. 기억하십시오 : 서버에는 비밀이 있으므로 다이제스트를 확인하기에 충분한 정보가 있습니다. (이것은 메시지의 원점을 확인하는 문제 만 고려하지만 동일한 접근 방식을 사용하여 전체 메시지를 암호화 할 수 있습니다. 다른 비밀을 사용하는 경우 공개 키 세트를 말하십시오.)

내가 이것을하는 방법은 다음과 같습니다.

  1. 서버에 도전하십시오.
  2. 서버는 공개 키로 응답합니다 (예 : RSA 암호화)는 디지털로 서명했습니다.

  3. 클라이언트는 PK를 확인하고 키로 암호를 암호화 한 다음 암호화 된 암호에 디지털로 서명합니다.

  4. 서버는 서명을 확인하고 비밀번호를 저장/확인하기 위해 암호를 암호화합니다.

디지털 서명은 중간 공격에서 사람을 예방하는 시작 역할을하므로 여기서 중요합니다.

다른 사람들이 지적했듯이, 이것은 도전적인 도전 응답 알고리즘입니다.

당신은 아마 체크 아웃하고 싶을 것입니다 소화 인증, HTTP에서 사용하는대로. 실제로 프로토콜이 HTTP를 초과하는 경우 자신의 글을 쓰고 사용하거나 구현할 수 있습니다.

공개 키 암호화? 서버의 공개 키를 사용하여 암호를 암호화하십시오.

자신의 암호화 프로토콜을 출시하는 것은 좋은 솔루션이 아니지만 제가 제안하지 않는 것입니다 ....

당신이 직면하고있는 문제를 극복하기 위해 ... F- 암호를 취하는 함수와 의사로 단조롭게 값을 증가시키고 숫자를 반환합니다. 예를 들어 해시 (해시 (암호) ^ timestamp)

  1. 서버 : 도전을 요청하고 보내십시오 (타임 스탬프). 보낸 마지막 타임 스탬프를 기억하십시오.
  2. 클라이언트, 응답 보내기 (F (비밀번호, 타임 스탬프) 및 타임 스탬프 보내기)
  3. 서버 : 클라이언트가 보낸 해시 (비밀번호) 및 타임 스탬프를 사용하여 클라이언트를 점검하십시오 (> 도전에서 보낸 타임 스탬프).
  4. 클라이언트가 올바른 경우 액세스 권한을 부여하십시오.
  5. 현재 타임 스탬프가 다음 도전 전에 재생 공격을 방지하기 전에 모든 클라이언트가 보낸 타임 스탬프보다 더 큰지 확인하십시오.

친절한, Ashish Sharma

나는 Diffie-Hellman이 잘 알려진 견고한 키 교환 프로토콜이라고 생각합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top