2010-06-10 5 views
8

안녕하세요, 첫째, 이미에 대한 항목이 있습니다 나는 ... MD5 같은 것들 (MD5 (에 대해 물어 아니에요, 내가 가정 해 봅시다더블 해시 암호 - 클라이언트 및 서버

내 질문은 이것이다 :.

고객이 로컬에서 비밀번호를 저장할 수 있도록 허용합니다. 당연히 계획 텍스트에 저장하지 않으려 고하기 때문에 저장하거나 보내기 전에 로컬로 hmac합니다. 이제 괜찮습니다. 서버가 저장된 hmac를 가지고있을 것이고 일반 텍스트 암호가 아닌 hmac 만 보내야하기 때문에 공격자는 서버의 저장된 해시를 사용하여 누군가의 계정에 액세스 할 수 있습니다 (대참사 시나리오에서 누군가가 데이터베이스에 대한 액세스 권한을 얻을 수 있습니다. 물론, e).

우리의 생각은 hmac를 통해 클라이언트에 암호를 한 번 인코딩하고, 서버로 보내고, hmac를 통해 두 번째로 인코딩하고 저장된 두 번 hmac'ed 암호와 대조합니다. 이 있는지 확인합니다 :

  • 클라이언트는 일반 텍스트로 저장하지 않고 암호를 로컬에 저장할 수 있습니다
  • 다른 네트워크 파티에 대해 (너무) 걱정하지 않고 암호를 보낼 수있는 클라이언트
  • 서버는 누군가를 서버에서 훔쳐 가서 로그인 할 때 걱정할 필요없이 암호를 저장할 수 있습니다.

당연히 다른 모든 것들 (강력한 암호, 이중 염 등)도 적용되지만 그 질문에 정말로 관련이 없습니다.

실제 질문은 다음과 같습니다. 단단한 보안 디자인과 비슷합니까? 우리는 이러한 방식으로 어떤 결함을 간과 했습니까? 이런 종류의 보안 패턴이있을 수 있습니까?

부록 : 우리는 보통 슬픈 것처럼 많은 사람들이 여러 서비스에 동일한 암호를 사용하므로 '실제'암호를 얻으므로 클라이언트에 일반 텍스트로 암호를 로컬로 저장하고 싶지 않습니다. 해시가 도난당하는 것보다 사용자에게 더 큰 보안 위반이 될 수 있습니다.

+0

md5()는 안전하지 않습니다. 또한 이것은 안전한 프로토콜이 아닙니다. – rook

답변

5

다른 사람들이 말했듯이 클라이언트와 시스템을 분리하면 실제로는 아무 것도 사지 않습니다. 첫 번째 해시는 단순히 암호가됩니다.

클라이언트가 다른 시스템에서 동일한 암호를 사용하면 (가능한 경우) 값이옵니다. 이 경우 클라이언트 컴퓨터가 해킹 당하면 적어도 해시 된 암호의 로컬 복사본은 침입자가 다른 시스템에 액세스하는 것을 허용하지 않습니다. 분명히 클라이언트 의 공격자는 이제이 서버에 액세스 할 수있게됩니다. 결국 그들은 암호를 얻었습니다.

서버에서 이중 해시 값에 액세스하는 공격자는 단일 해시 (즉, "암호")를 얻기 위해이를 역전할 수 없으므로 아무 것도 구입하지 않습니다. 물론 공격자가 보안 데이터베이스를 읽을 수있는 위치에 있으면 다른 공격 경로를 사용할 수 있다고 의심됩니다.

또한 다른 포스터에서 말한 것처럼 두 해시에서 모두 소금을 사용하고 있는지 확인하십시오. 이렇게하지 않으면 패스워드가 강하지 않은 경우 실제로 해시를 되돌릴 수 있습니다.

EDIT - 실제로 암호를 해시를 암호로 사용하고 있으므로 실제로 서버에서 소금을 사용할 필요가 없습니다. 아무도 아무리 효과적인 무지개 테이블을 만들 수있을 것입니다 :) 그래도 클라이언트에 하나 필요합니다.

+0

이것은 거의 내가 서버에서 소금을 필요로하지 않는 것보다 짧게 생각하고 있다고 설명하지만, 어쨌든 하나를 사용하는 것은 단점이 없다고 생각합니다. 물론 암호를 저장하면 클라이언트가 손상되지 않도록 할 수있는 방법이 없습니다. 나는 그 암호를 찾고 있지 않았습니다. –

6

경고 : 저는 보안 전문가가 아닙니다. 나는 그가에 가입 공상 있는지 blowdart 핑 것이다.

를 클라이언트가 단지 해시를 저장하고 효과적으로 해시에 불과 기반 뭔가를 전송하는 경우, 그들은 일반 텍스트에 저장 효과적으로있어 . 첫 번째 해시가 제공하는 유일한 이점은 서로 다른 시스템에서 동일한 암호를 사용하면 해시가 공개 된 경우 다른 시스템이 해킹되지 않는다는 것입니다.

다른 식으로 말하자면 누군가가 서버에 저장된 해시를 가질 수 있으면 일반 텍스트 저장소처럼 시스템에 로그인하면됩니다.

+0

좋은 지적. 모든 해싱과 더블 해싱은 잠시 나 혼란을 일으켜 매우 안전하다고 생각하게되었습니다! :) – Sev

+0

나는 그것이 어떻게 작동 될지 모르겠다. 서버에 저장되어있는 해쉬를 가지고 있다고 가정 해 봅시다. 어떻게 해시를 사용하여 로그인합니까? –

+0

@J. Stoever : 글쎄, 해시가 클라이언트에 저장되었다는 의미가 더 많았지 만, 만약 그들이 똑같다면 중요하지 않습니다. 기본적으로 그 시점에서 당신은 클라이언트가 로그인하는데 사용하는 모든 것을 가지고 있습니다. 원래의 일반 텍스트 비밀번호를 가지고 있지 않아도 상관 없습니다. –

0

암호가 로컬에 일반 텍스트로 저장되는 것에 대해 무엇을 구입했는지 확실하지 않습니다.

로컬 암호화의 목적은 해커가 서버에 암호를 보낼 수 없게하는 것입니다. 그러나 암호화 된 양식을 보내려면 ... 아무 것도 구입하지 않은 것입니다.

대신 로컬 컴퓨터는 암호를 양방향 암호화 된 형식으로 저장해야합니다. 그것이 해독 될 수 있다는 것을 의미합니다. 전송하기 전에 당신이하는 일.db는 단 f 향 암호화 형식 (별도의 암호화 메커니즘 사용)을 저장할 수 있습니다. 비교하기 전에 수신 한 내용을 암호화 한 다음 확인하십시오.

+0

메시지 다이제스트 기능은 암호화 방법이 아닙니다. – rook

0

달성하려는 암호의 초기 해싱은 무엇입니까? 암호의 일반 텍스트 버전을 발견하지 못하도록 보호합니다. 해시 값을 사용하여 이중 해시 값을 계산할 수는 없습니다.

3

아니요, 이것은 안전하지 않습니다. 해시 된 값은 사실상 암호입니다. 암호가 암호로 생각되는 다른 것으로부터 파생되었다는 사실은 중요하지 않습니다. 이것은 사용자를 인증하는 비밀 값입니다. 맞습니까? 나에게 패스워드처럼 들린다.

성명서에 "자연스럽게 우리는 그 문자를 계획 텍스트에 저장하고 싶지 않으므로 저장 및/또는 보내기 전에 로컬로 hmac 처리해야합니다."라고 생각합니다. 해시 암호의 암호가 한 번 암호와 같도록 시스템이 변경된 경우 해시 암호와 동일한 수준의주의를 사용해야합니다.

+0

+1 모두가이 프로토콜을 중단했지만 이것은 잘 처리되었습니다. OP가 이해할 것으로 생각합니다. – rook

12

나는 문을 다 써 버렸지 만, Skeet은 ping을하고 Skeet을 망치지 않습니다.

암호를 다른 상수 값으로 바꾸는 것입니다. 여기서는 아무 것도 얻지 못합니다. 단 하나의 보안은 일반 텍스트 암호가 클라이언트 시스템에서 발견 될 수 없다는 것입니다.

그러면 HMAC를 치료하는 것으로 나타납니다 (HMAC를 의미합니까? 그렇다면 어디에서 키가 들어오고 저장 되나요?)라는 암호 자체를 암호로 사용합니다. 인증에 사용되는 서버로 전송합니다. 두 번째 HMAC 또는 해싱은 의미가 없습니다. 전송 된 값과 비교하면 다른 이름의 암호입니다. 따라서 암호를 훔치는 대신 공격자로서 클라이언트 컴퓨터에 저장된 HMAC를 훔쳐 내면됩니다. 아무것도 여기에서 얻지 않는다.

+2

+1 머리에 못을 박았습니다. – rook

+7

나는 다양한 장소에서 재사용 할 가능성이있는 실제 암호보다 내 해시를 잘 알고있다. –

+0

나는이 대답을 얻지 못한다. 클라이언트 측에 저장된 비밀번호는 일반 텍스트가 아닙니다. 서버에서 이중 해시 된 암호의 테이블에 액세스해도 침입자는 로그인 할 수 없으며 좋은 결과를 얻을 수도 있습니다. 클라이언트에 저장된 해시에 대한 액세스 권한으로 로그인 할 수 있으며 서버 테이블에 액세스하는 것이 큰 문제가 있음을 의미하지만 제안 된 아이디어로 전반적인 보안이 개선되었다고 생각합니까? – mafu

1

blowdart가 머리에 못을 박은 채로 - 당신은 아무것도 확보하지 않고 도둑질을하기 위해 세넷을 바꾸고 있습니다. 당신이 무엇 을 복제하려고 시도하는 것은 저의 인생을 위해 할 수없는 오래된 인증 프로토콜입니다.다음은 작동 방식입니다.

초기화시 서버는 암호를 얻으며 반복적으로 해시를 n 번 (F n (통과)) 표시합니다. 클라이언트는 암호와 번호 n을가집니다.

인증을 받고 서버에 n-1 (전달) - 즉, 암호 해시가 n-1 회 전송됩니다. 서버가 한 번 더 해쉬하고 F n (통과)과 비교하여 일치하면 액세스 할 수 있습니다. 그런 다음 서버가 F n (통과)을 F n-1 (통과)으로 바꿔서 n을 감소시킵니다.

다음에 인증을 받으러 갈 때 F n-2 (통과)을 보내면 프로세스가 반복됩니다.

  • MITM :

    의 보안 살펴 보자 프로토콜에 내장 아무 대한 저항을, 당신은 SSL 내부

  • 재생 공격을 레이어해야 할 것 : 그들은 작동하지 않는, 서버가 감소했기 때문에 해시 반복.
  • 도청 : 다음 인증은 F n-1 (합격)을 사용하여 인증됩니다. F n (합격)입니다. 당신은 클라이언트의 암호를 모르는, 없으며으로 인증 할 수 있습니다 : 서버를 소유 F 에 F N (패스)에서 N-1 (통과) 해쉬 함수의 정의에 의해,이다, 불가능
  • 가는 다시는 F N-1을해야하기 때문에 그들, 당신은 F가 N
  • 클라이언트를 소유있을 때 (통과) : (통과) (그래서 그들은이없는 당신이 F N-1을 저장하기 때문에 패스를 입력) - 클라이언트를 소유하면 공격자가 로그인하게됩니다. 암호를 저장하지 않고 n을 저장하는 경우이 작업은 방지되지만 암호를 저장하려고합니다.

그게 당신이 달성하려고하는 것입니다. 그러나이 프로토콜이 사용되지 않는 이유가 있습니다. 이것은 동기화하려는 거대한 암캐입니다. 반 완료 단계로 인해 클라이언트와 서버가 동기화되지 않으면 잠겨 있습니다. 이를 피하기 위해 내장 된 복원력은 재생 또는 도청에 대한 보안을 저하시킬 수 있습니다.

+1

이것은 RSA SecurID 및 S/KEY가 포함 된 일회용 암호 체계입니다. http://www.ietf.org/rfc/rfc2289.txt 및 http://en.wikipedia.org/wiki/One-time_password를 참조하십시오. –