2013-08-19 1 views
0

이것은 데이터베이스에 저장되어 있습니다. 이 데모 비밀번호를 내 사용자에게 보내려면 어떻게합니까? 나는 이것을 ($ 2y $ 10 $ Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls.) 일반 텍스트로 변환 할 수 없다.송어를 사용하여 이메일을 잊어 버렸습니다.

해결책이 있습니까? 나는 또한 임의의 비밀 번호를 보낼 수 없습니다.

demo = $2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls. 

는 여기에 내가 암호 검사 및 생성에 사용되는 일부 기능은 다음과 같습니다

function password_encrypt($password) { 
    $hash_format = "$2y$10$"; // Tells PHP to use Blowfish with a "cost" of 10 
    $salt_length = 22;     // Blowfish salts should be 22-characters or more 
    $salt = generate_salt($salt_length); 
    $format_and_salt = $hash_format . $salt; 
    $hash = crypt($password, $format_and_salt); 
    return $hash; 
} 

function generate_salt($length) { 
    // Not 100% unique, not 100% random, but good enough for a salt 
    // MD5 returns 32 characters 
    $unique_random_string = md5(uniqid(mt_rand(), true)); 
    // Valid characters for a salt are [a-zA-Z0-9./] 
    $base64_string = base64_encode($unique_random_string); 
    // But not '+' which is valid in base64 encoding 
    $modified_base64_string = str_replace('+', '.', $base64_string); 
    // Truncate string to the correct length 
    $salt = substr($modified_base64_string, 0, $length); 
    return $salt; 
} 

function password_check($password, $existing_hash) { 
    // existing hash contains format and salt at start 
    $hash = crypt($password, $existing_hash); 
    if ($hash === $existing_hash) { 
    return true; 
    } else { 
    return false; 
    } 
} 
+1

내가 묻는 실제 질문이 표시되지 않습니다. "데모 비밀번호"란 무엇입니까? –

+1

사용자가 암호를 잊어 버린 경우 (제한된 시간과 한 번만 사용할 수있는) 임의로 생성 된 토큰을 포함하는 링크를 보내야 새 암호를 설정할 수있는 양식을 얻을 수 있습니다. 해시 된 비밀번호를 사용자에게 보내지 않아야합니다. – Quentin

+0

하지만 이것은 복어 –

답변

0

그것은 비밀 번호 복구를위한 좋은 방식은 새 암호를 생성하고 사용자에게 보냅니다 아니다. 대신 사용자에게 임의의 독립 코드가있는 링크를 보내고이 코드를 데이터베이스에 저장하십시오 (해시 됨). 사용자가 링크를 클릭하면 새 암호를 입력하게하십시오. 이전 암호를 알 필요가 없으며 사용자는 전자 메일 (전자 메일 주소)을 읽을 수있을 때 인증됩니다.

잊어 버린 비밀번호 양식은 누구나 게시 할 수 있습니다. 누군가가 귀하의 이메일을 입력하고 비밀번호가 즉시 변경되면 행복하지 않을 것입니다. 링크를 검색하면 전자 메일을 무시하거나 정말로 암호를 변경하기를 원하는지 확인할 수 있습니다.

정확하게 지적했듯이 암호는 해시로 저장해야하므로 검색 할 수 없습니다. 암호 해시가 데이터베이스에 저장되는 즉시 실제 암호를 알 필요가 없어야합니다. 나중에 암호가 필요할 때마다 사용자가 암호를 입력했기 때문에 암호를 알 수 있습니다.

BCrypt 해시를 생성하려면 PHP 함수 password_hash()을 사용하는 것이 좋습니다. 이전 PHP 버전에도 compatibility pack이 있습니다. 특히 소금의 생성은 훨씬 더 잘 해결됩니다.

P. 설명하는 해시를 BCrypt라고하며 양방향 암호화에 사용되는 복어 암호를 기반으로합니다.