2011-07-05 2 views
33

나는 작은 커뮤니티 웹 사이트를 가지고 있으며 잊혀진 암호 기능을 구현해야합니다. 현재 MD5으로 암호화 된 DB에 암호를 저장합니다.PHP Forgot Password 기능

'암호 해독'을 정렬하여 이메일로 보내거나 암호 재설정 페이지가 있어야합니까?

+5

인코딩 된 암호 MD5를 저장하는 전체 아이디어는 암호를 해독 할 수 없다는 것입니다. 누군가가 시스템에 침입하여 DB를 덤프하더라도 암호가 약해지기 전에는 암호를 얻을 수 없습니다. 그러나 다른 이야기입니다 ... –

답변

127

MD5 해시 암호는 되돌릴 수 없습니다. (MD5는 해싱을하고 있으며 실제로는 암호화하지 않기 때문에 미묘한 차이가 있습니다). 비밀번호를 이메일로 전송하는 것이 아니라 비밀번호 재설정 프로세스를 제공하고 싶을 것입니다. 사용자가 자신의 암호를 다시 요청하면

  • 는 이메일이 경우 표시하지 마십시오 그들의 이메일 주소를 입력 할

      당신에게 안전한 암호 재설정에 대한 높은 수준의 워크 플로우를 제공하기 위해 ... 주소가 유효하거나 아님 (이메일이 발송되었음을 알려주십시오). 공개 토론은 유용성을 떨어 뜨립니다 (즉, 어떤 이메일을 등록했는지 전혀 알지 못합니다). 실제로 사이트에 등록 된 이메일에 대한 정보를 수집하려는 사람들에게 정보를 제공하지 않습니다.

    1. 토큰을 생성하고 (소금으로 타임 스탬프를 해쉬했을 수도 있음) 사용자의 레코드에 데이터베이스에 저장하십시오.
    2. http 재설정 페이지 (URL의 토큰 및 이메일 주소)에 대한 링크와 함께 사용자에게 이메일을 보냅니다.
    3. 토큰과 전자 메일 주소를 사용하여 사용자의 유효성을 검사하십시오.
    4. 새 암호를 선택하고 이전 암호를 바꾸게하십시오.
    5. 또한 특정 시간대 (대개 24 시간) 후에 해당 토큰을 만료시키는 것이 좋습니다.
    6. 선택적으로 얼마나 많은 "잊어 버렸습니다"시도가 발생했는지 기록하고 사람들이 많은 이메일을 요청할 경우 더 복잡한 기능을 구현할 수 있습니다.
    7. 선택적으로 재설정을 요청한 개인의 IP 주소를 기록하십시오 (별도의 표에 있음). 해당 IP에서 카운트를 증가시킵니다. 10보다 더 많이 도달하면 ... 미래의 요청을 무시하십시오.

    당신에게 해싱에 좀 더 자세하게을주고 ...

    는 MD5를 (사용하여 암호와 같은 값을 해시) PHP에서 함수가 최종 값이 동일한 될 것입니다 당신이 그것을 실행하는 서버에 관계없이 그 암호를 위해. (따라서 해시와 암호화 사이에는 바로 한 가지 차이점이 있습니다 ... 개인/공개 키가 없습니다).

    사람들이 rainbow tables에 취약점을 언급하는 것을 볼 수 있습니다. 무지개 테이블에 대한 아주 기본적인 설명은 ... md5() 해시 값을 얻기 위해 md5()가 사전 단어 (약한 암호)를 해시합니다. 데이터베이스 테이블 (레인보우 테이블)에 넣으십시오.

    이제 웹 사이트의 데이터베이스가 손상된 경우 레인보우 테이블에 대해 사용자의 해시 된 암호를 실행하여 해시를 암호로 "역으로"되돌릴 수 있습니다. (해시를 "뒤집지"않고 ...하지만 당신은 그 아이디어를 얻습니다.)

    암호를 "소금으로 처리하는"것이 가장 좋습니다. 이는 사용자가 암호를 해시하기 전에 임의의 값을 에 추가하기 전에을 해시하는 것을 의미합니다 (여기서는 매우 기본적인 개념입니다). 이제 레인보우 테이블이 데이터베이스에 대해 실행될 때 "password"의 md5() 해시가 "password384746"과 다르므로 쉽게 "역전"되지 않습니다.

    다음은 유용한 SO Q/A입니다. Secure hash and salt for PHP passwords

  • +1

    감사합니다. Jared, 정말 유익합니다! – Liam

    +1

    @Jared Cobb : 8로 정확히 무엇을 의미합니까? – testing

    +2

    @testing 좋은 질문 ...이 시나리오에서는 공격자가 매번 다른 IP 주소에서 봇넷, 프록시 또는 다른 라운드 로빈 방법을 사용하여 공격한다는 것을 제외하고는 9 번과 매우 비슷합니다. 예를 들어, 시스템에서 "요청을 잊었습니다"가 몇 분 또는 몇 시간 내에 크게 증가했다는 것을 감지하면 일시적으로 기능을 느리게하거나 사용하지 않도록 설정할 수 있습니다. (물론 임계 값은 사용자 기본 크기 및 "정상"볼륨으로 간주되는 사용자의 주관적인 판단에 의해 결정됩니다.) –

    2

    MD5는 단방향 해시를위한 것입니다. 비밀번호를 재설정해야합니다.

    1

    아니요 암호를 해독 할 수 없습니다. 그것은 전체 아이디어입니다.

    임시 암호를 보내고 암호를 재설정해야합니다.

    1

    비밀번호 재설정 페이지가 필요합니다. PHP에서 MD5를 해독 할 방법이 없습니다.

    7

    아니요, MD5는 되돌릴 수 없습니다. 암호 해싱의 포인트는 데이터베이스에 대한 액세스 권한을 가진 공격자가 모든 사람의 암호에 액세스 할 수 없도록 만드는 것입니다.

    즉, MD5 (특히 무염소 MD5)는 일반적으로 rainbow table을 사용하여 공격 할 수 있습니다. 보안을 위해 bcrypt을 사용하는 것이 좋습니다.

    3

    암호를 해독 할 수 없으며 일반 텍스트를 통해 사용자에게 암호를 보내지 마십시오. (그것은 내가 결코 사이트를 다시 사용하지 못하게하는 가장 큰 방법이며 그것은 거대한 보안 구멍입니다.) 사용자의 암호 복구 전자 메일로 전송되는 시간 관련 키가 포함 된 링크에서 트리거되는 암호 재설정 페이지를 제공합니다 ; 그것이 암호 복구의 최신 기술입니다.

    1

    MD5은 일방 함수입니다. 암호를 해독 할 수 없습니다. 암호 재설정 페이지가 있어야합니다.

    2

    get parameter로 md5 및 전자 메일 주소를 허용하는 페이지를 작성하고 db에서 전자 메일 및 md5 암호를 찾습니다. Jared Cobb의 노트에 따르면, 올바른 길로 가야합니다. 난 그냥 당신이 사용자가 유효한 사용자인지 알고 자신의 암호를

    3

    가장 좋은 방법을 변경하는 URL 등이 충분히 충분해야 http://yourdomain.com/resetpassword.php?code=md5codesentviaemail

    $code = isset($_GET['code']) ? $_GET['code'] : ''; 
        $email = isset($_GET['email']) ? $_GET['email'] : ''; 
    $checkPw = ''; 
    
        if(empty($code) || empty($email)) 
        { 
        die(); 
        } 
        $sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'"; 
    //remember to check for sql injections 
        //then get the results as an array, i use a database class eg $user 
    
        if(!empty($user['password'])) 
        { 
        $checkPw = md5($user['password']); 
        }else 
        { 
        die(); 
        } 
    
        if($checkPw !== $code) 
        { 
        die(); 
        }else 
        { 
        //display form for user to change password 
        } 
    

    를 보낼뿐만 아니라

    몇 가지 예제를 추가 등록 할 때 사람들이 이메일 주소를 제출하도록 요청하는 것입니다. 그런 다음 잊어 버린 경우 잊어 버린 암호 링크를 사용하여 비밀번호를 임의의 값으로 재설정합니다.이 비밀번호는 이메일로 전송되므로 액세스 할 수있게되어 더 기억에 남는 비밀번호로 다시 바꿀 수 있습니다. 이렇게하면 보안을 손상시킬 필요가 없습니다. 사용자 이름을 제출해야하는 링크가있을 수 있지만 보안을 강화하려면 질문과 답변 또는 기억에 남는 단어가 있어야합니다.

    8

    이 게시물에 따르면, 3 단계와 4 단계에서 저장중인 동일한 토큰을 보내야할지 확신하지 못합니다.

    토큰을 보낸 다음이를 해시하고 해쉬 된 토큰을 DB에 저장해야합니다. 그렇지 않으면 데이터베이스가 손상된 경우 암호 재설정 페이지에 액세스 할 수 있습니다.

    은 요약하면 :

    해시 해시 알고리즘입니다
    $token = md5(microtime (TRUE)*100000); 
    $tokenToSendInMail = $token; 
    $tokenToStoreInDB = hash($token); 
    

    .

    +1

    해쉬 된 토큰을 DB에 저장하는 것은 정말 좋은 지적입니다. +1 – Francodi

    +1

    예측 가능한 토큰을 사용하는 것은 좋은 생각이 아닙니다. 시간과 같이 예측 가능한 것을 기반으로해서는 안됩니다. (공격자가 토큰이 생성 된 시점의 값을 반복 할 수 있습니다.) PHP7에서는'random_bytes'를 사용해야합니다. PHP5에서 호환성 구현 또는'openssl_random_pseudo_byte'가 사용되어야합니다. –

    +1

    (또 다른 옵션은 비밀 무작위 문자열의 해시와 사용자의 세부 정보 및 일부 알맞은 임의의 데이터를 사용하는 것입니다 .DB에 저장되므로 토큰을 예측할 수 없습니다) (이 방법을 사용하면, 긴 문자열에'password_hash'를 사용하여 토큰을 생성하고 링크에서 해시의 base64 인코딩 버전을 전송합니다. (DB에 저장하기 전에 다시 해싱 할 수도 있지만 4-24 시간 후에 재설정 링크가 만료되면 올바른 방책이 될 수 있습니다.) 적절한 임의의 데이터를 사용하여 인코딩 된 데이터를 전송하면됩니다. –

    2

    PHP의 기본 제공 password_verify 및 password_hash를 사용하십시오.

    3

    마커스 리드 (Marcus Reed)에 따르면 2015/2016에 PHP 버전이 5.5 이상인 경우 MD5를 사용하지 않으며 password_hash() 및 password_verify()는 비용을 제공하면서 비밀번호를 쉽고 안전하게 해싱합니다 해시를 자동으로 소금 화시킵니다.

    나는 혼란을 피하기 위해 명확한 진술을 제공하는 이유 때문에 현재 투표하거나 의견을 말할 수있는 능력이 없습니다.