2011-10-23 2 views
0

나는 여기서 어떤 질문을할지 모른다. 내 문제는 간단합니다. 소금으로 DB에 암호를 저장하고, 저장된 암호와 입력 된 암호의 유효성을 검사하고 사용자가 로그온 할 때마다 임의의 시도 단어를 사용하여 암호를 인증해야합니다. 나는 PHP/자바 스크립트를 사용하고 있습니다.어떻게 암호를 인증하고 유효성을 검사합니까?

이 문제를 해결하기 위해 내가 겪고있는 문제는 HTML 양식에서 도전 단어를 전달한 다음 그 단어로 입력 된 암호를 해시하고 서버에서 암호를 인증 할 수 있다는 것입니다. 도전 단어와 암호를 구분할 수 없으므로 DB에 저장된 암호에 대해 유효성을 검사 할 수 있습니다. 암호를 서버에 전달하거나 챌린지 단어없이 해시로 해시하는 경우 유효성을 검사 할 수는 있지만 신뢰할 수있는 인증을받을 수는 없습니다.

암호로 유효성을 검사하면서 키를 암호화 할 수 있도록 일종의 2 웨이 알고리즘이 필요하다고 생각합니다. 어떻게해야합니까? 아니면 할 수 없다면 무엇을해야합니까?

+0

분명히 말하면, 임의 시도는 전송 중 암호를 보호하기위한 것입니까? 아니면 그들이 인간 또는 유사하다는 것을 증명하는 인증 메커니즘입니까? –

+0

이것을 파악하기 위해 "Geeklog - The Secure CMS"라는 PHP 블로그의 소스 코드를 살펴 보았습니다. Lo와 보라, 그들은 사용자 암호를 자유롭고 명확하게 보내며, 서버의 MD5를 사용하여 암호를 "암호화"합니다. 그래서 아마도 내 질문은 "어떤 유형의 시스템에 대해 소금 인증 및 인증 단어를 사용하여 인증 및 구현해야합니까?" – James

+0

또한 phpBB는 암호를 자유롭고 분명하게 보냅니다. 나는 그 문제를 생각하는 것이 끝났다 고 생각한다. – James

답변

0
  1. 암호를 저장하려면 임의의 소금을 생성하십시오. Store HASH(password+salt)salt. 서버 또는 클라이언트가이 계산을 수행 할 수 있습니다.

  2. 인증을 수행하려면 서버가 saltHASH(password+salt)을 찾습니다. 그런 다음 임의의 챌린지를 생성하고 소금과 챌린지를 클라이언트에 보냅니다.

  3. 클라이언트에서 암호를 입력하라는 메시지가 나타납니다. 계산 :
    HASH(HASH(password+salt) + challenge). 서버로 보냅니다.

  4. 서버에는 이미 HASH(password+salt)이 있고 challenge이 있습니다. 따라서
    HASH(HASH(password+salt) + challenge)을 계산할 수도 있습니다. 이것을 고객이 보낸 것과 비교하십시오. 일치하면 암호가 정확합니다.

이것은 MITM 공격에 취약하기 때문에 SSL 연결과 같이 MITM에서 자체적으로 보호되는 연결을 통해 사용해야합니다.

+0

2 단계 로그인 프로세스를 원합니다. 1) 사용자가 사용자 이름을 제출하고, 서버가 사용자를 검색하여 소금을 보냈다가 챌린지합니다. 2) 사용자가 암호를 입력하고 제출합니다. – James

+0

암호를 서버로 보내기 전에 클라이언트에서 암호를 해싱하는 것이 장점이 아닙니다. 이것은 클라이언트 코드를 불필요하게 복잡하게 만듭니다. – NotMe

+0

장점은 서버가 암호를 포기할 수 없다는 것입니다. 예를 들어, 서버는 종종 로깅 암호를 끊어 버리고 이러한 로그 파일이 손상되는 경우가 있습니다. 서버가 암호를 볼 수 없으면 암호를 기록하거나 손상시킬 수 없습니다. (그것이 노력할 가치가 있는지 여부는 또 다른 질문입니다.) –

2

클라이언트 측 스크립팅을 사용하여 비밀번호를 암호화하는 것은 일반적으로 좋지 않습니다. 이를 수행하는 적절한 방법은 SSL을 사용하는 것입니다.

또한 절대 암호를 일반 텍스트로 저장합니다. 의 경우과 같은 방법을 사용해야합니다. 암호를 두 번 해시합니다. 한 번은 데이터베이스에 저장하고 다른 한 번은 양방향 인증으로 저장합니다.

관련 문제