2010-03-25 4 views
3

은 (물론, 살균 후) 사용자 이름과 암호를 사용하여 데이터베이스를 조회하기 위해 암호를 확인하고 실패한 시도를 기록하는 어떤 이유/값이 있습니까 대 사용자 이름을 사용하여 데이터베이스를 쿼리하고 반환 비밀 번호 문자열을 비교?비밀번호 확인

EDIT : 아래에서 언급 한 사람에게는 암호가 데이터베이스에 해시됩니다.

+0

+1 hash_hmac 나에게 완벽하게 유효한 방법 질문처럼 보인다. 나는 downvote을 이해하지 않는다 – Dathan

+1

어떤 사람들은 어리 석었기 때문에? – animuson

답변

1

여기에 2 개의 질문이 있습니다.

  1. 데이터베이스에 대한 정보를 확인하는 일반적인 방법은 데이터베이스가이를 수행하도록하는 것입니다. 따라서 로그인과 비밀번호를 모두 쿼리에 넣으십시오. 특히 암호가 아닌 해시를 저장하는 경우
  2. 암호 추측 보호는 모든 인증 시스템에 중요한 추가 항목입니다. 나는 그것을하는 것이 좋습니다 있습니다 것

    $results = mysql_query("SELECT name FROM users WHERE name = $properlyEscapedName AND pass = $properlyEscapedPassword"); 
    if (mysql_num_rows($result) == 1) 
        $authenticated = true; 
    

    $results = mysql_query("SELECT name, pass FROM users WHERE name = $properlyEscapedName"); 
    $array = mysql_fetch_assoc($results); 
    if ($array["pass"] == $unescapedPass) 
        $authenticated = true; 
    

    대 : 내가 제대로 이해 해요 경우
+0

데이터베이스가 PHP보다 비교가 용이합니까? – Young

+0

@ SpawnCxy 예, 일반적입니다. 이 특별한 경우에는 중요하지 않습니다. –

+1

나는 그것을 말하지 않을 것이다. 솔직히 암호가 저장되는 방식에 따라 MySQL 및 PHP에서 비교할 때 이상한 결과가 발생할 수 있습니다. 문자열은 비 이진 데이터 정렬로 저장되기 때문에 "A"= "a"또는 "ß"= "ss"와 같은 "느슨한"비교가 가능합니다. 그러나 암호의 해시 만 16 진수와 같은 별개의 문자 집합으로 저장하면 괜찮습니다. – Gumbo

4

의 결과를 비교 사이에 차이가 있다면, 당신은 궁금 보안상의 이유로 일반 텍스트 암호보다 암호 해시를 저장해야하지만 그렇지 않으면 첫 번째 경우에는 적은 수의 필드를 반환하므로 서버와 데이터베이스 간의 대역폭을보다 효율적으로 사용할 수 있습니다. 반면에 쿼리는 몇 바이트 더 커지기 때문에 작은 결과 집합의 작은 이점을 완화 할 수 있습니다.

+0

예, 올바르게 이해하고 있습니다. – Humpton

+1

OMG, "더 작은 결과 집합의 이점" –

0

기본적으로 두 가지 방법의 차이점은 없습니다. 두 가지 방법 모두 암호가 이름과 일치하지 않는 경우 알려줍니다.

0

더 많은 작업을 수행하면할수록/실패한 로그인 시도 후에도 연결을 열면 길수록 더 많은 DOS 공격을받을 수 있습니다. OTOH 당신은 무차별 대항력 (brute force) 검색을 방지하기 위해 이것을 균형을 잡아야합니다.

더 똑똑한 해결책은 암호화 된 쿠키에서 클라이언트 측의 실패한 시도 횟수를 밀어 넣는 것입니다 (사용자가 로그인 페이지에 도달하기 전에 쿠키를 삭제하십시오 - 쿠키없이 사용자 이름과 비밀번호를 게시하려고 시도하면 자동으로 실패합니다) - 쿠키가 활성화되어야한다는 메시지와 함께). 3 회 연속 시도가 실패한 경우 로그인 실패시 새 쿠키를 삭제하도록 실패를 증가시키고 다시 암호화하십시오.

완전히 무차별 공격을 막지는 못하지만 훨씬 어렵게 만듭니다.

1

사용자에게 제공되는 정보와 공격으로부터 보호해야합니다.

데이터베이스를 쿼리하여 해당 로그인과 비밀번호를 확인했지만 실패하면 로그인 또는 비밀번호가 잘못되었다는 사실 만 사용자에게 알릴 수 있습니다. 그가 "Arkh01", "arkh"또는 "Arkh1"이었던 로그인을 기억하지 못하면 도움이되지 않습니다.

로그인을 위해 데이터베이스를 쿼리하면 해시 및 소금을 가져 와서 로그인이 잘못되었거나 암호인지 사용자에게 알릴 수 있습니다. 사용자는 행복합니다. 그러나 귀하의 웹 사이트를 공격하는 누군가는 "aa"라는 사용자는 존재하지 않지만 "ab"라는 사용자는 쉽게 알 수 있습니다.많은 웹 사이트가 사용자 목록에 대한 액세스 권한을 부여하므로 거의 항상이 문제를 무시할 수 있습니다.

bruteforce를 방지하려면 IP 또는 로그인에 대한 시도 횟수를 기록하고 5ish 오류 이후에 추가 시도를 차단하십시오. 계정이 아닌 사용 된 IP를 차단하는 것이 좋습니다. 해시 암호를 저장하는 약

는 PHP에서 염 및 HMAC + SHA512를 사용

관련 문제