| 제목 | 패스워드 체크 프로그램 | ||
|---|---|---|---|
| 글쓴이 | letsgolee | 작성시각 | 2013/09/27 22:16:59 |
|
|
|||
|
인터넷을 보다가 패스워드 관련된 좋은 글을 보고 그걸 조금 수정해서 해쉬화 하고 체크하는 프로그램을 만들어 보았습니다. 일단 소스:
function hash_password($password, $algorithm = 'whirlpool', $salt_length = 16)
{
$salt = substr(hash($algorithm, uniqid(md5(rand()), true)), 0, $salt_length);
$hash = hash($algorithm, $salt . $password);
$pos = strlen($password) >= strlen($hash) ? strlen($hash) : strlen($password);
return substr($hash, 0, $pos) . $salt . substr($hash, $pos);
}
function verify_password($check_pass, $pass_hash, $algorithm = 'whirlpool', $salt_length = 16)
{
$pos = (strlen($check_pass) >= strlen($pass_hash) - $salt_length) ? strlen($pass_hash) - $salt_length : strlen($check_pass);
$salt = substr($pass_hash, $pos, $salt_length);
$hash = hash($algorithm, $salt . $check_pass);
return $pass_hash == substr($hash, 0, $pos) . $salt . substr($hash, $pos);
}
소스를 보면 hash_password()는 패스워드를 해쉬화 하되 솔트를 랜덤으로 생성해서 해쉬 스트링 중 패스워드 길이 뒤쪽에 추가하는 방식입니다. echo hash_password('password')를 실행하면 정해진 알고리듬으로 해쉬를 생성합니다. 예에서는 알고리듬을 정하지 않았으므로 whirlpool방식으로 해쉬가 생성되는데 소스를 보면 솔트가 자동생성되기 때문에 생성되는 해쉬는 매 순간마다 같지 않습니다. 따라서 해쉬만 가지고 패스워드를 찾아낼 수 있는 md5에서 처럼 rainbow attack을 피할 수 있습니다. 해쉬가 매 순간마다 바뀌기 때문에 패스워드를 확인하기 위해서는 verify_password를 이용하면 됩니다. |
|||
| 다음글 | editplus용 sublime text(Soda Li... (7) | ||
| 이전글 | CodeIgniter quick reference ch... (2) | ||
|
한대승(불의회상)
/
2013/09/30 17:17:20 /
추천
0
|
|
포루시아
/
2015/04/15 18:19:12 /
추천
0
오호 신기하네요 써봐야겟습니다.
|
잘 쓰도록 하겠습니다.