일반 자료실

제목 패스워드 체크 프로그램
글쓴이 letsgolee 작성시각 2013/09/27 22:16:59
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 17013   RSS
 인터넷을 보다가 패스워드 관련된 좋은 글을 보고 그걸 조금 수정해서 해쉬화 하고 체크하는 프로그램을 만들어 보았습니다.
일단 소스:
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
오호 신기하네요 써봐야겟습니다.