본문 바로가기
php

[PHP] 비밀번호 처리. password_hash, password_verify

by bryan.oh 2021. 1. 9.
반응형

비밀번호 암호화하기
비밀번호 체크하기

password_hash() 

- 단방향 알고리즘. ( 암호화된 문자열을 다시 복호화 할 수 없습니다. )
- crypt() 와 호환됩니다.

첫번째 파라메터는 암호화할 문자열이고,

두번째 파라메터는 다음과 같습니다.

PASSWORD_DEFAULT bcrypt 알고리즘 (기본 PHP 5.5.0부터).
결과를 60 자 이상으로 확장 할 수있는 데이터베이스 열에 저장하는 것이 좋습니다 (255자가 적합 함). 
PASSWORD_BCRYPT CRYPT_BLOWFISH 알고리즘을
결과는 항상 60 자 문자열 (실패하면 false)
PASSWORD_ARGON2I Argon2i 해싱 알고리즘
PHP가 Argon2 지원으로 컴파일 된 경우에만 사용 가능
PASSWORD_ARGON2ID Argon2id 해싱 알고리즘
PHP가 Argon2 지원으로 컴파일 된 경우에만 사용 가능

위 옵션을 선택해서 사용하면 됩니다.

(보통 PASSWORD_DEFAULT 로 사용하고 저장할 DB column 은 VARCHAR(255) 로 합니다.)

 

코드로 알아보기

<?

    $orgStr = "hello~Bryan~";

    $enc1 = password_hash($orgStr, PASSWORD_DEFAULT);
    $enc2 = password_hash($orgStr, PASSWORD_DEFAULT);
    $enc3 = password_hash($orgStr, PASSWORD_DEFAULT);
    
    echo "<br/>org = $orgStr";
    echo "<br/>enc1 = $enc1";
    echo "<br/>enc2 = $enc2";
    echo "<br/>enc3 = $enc3";
    echo "<hr/>";

    $tmp = "hello~";
    echo "<br/>$tmp 는 ".(password_verify($tmp, $enc3) ? "일치함" : "다름");

    $tmp = "hello~bryan~";
    echo "<br/>$tmp 는 ".(password_verify($tmp, $enc3) ? "일치함" : "다름");

    $tmp = "hello~Bryan~";
    echo "<br/>$tmp 는 ".(password_verify($tmp, $enc3) ? "일치함" : "다름");

?>

위 코드의 결과는 

대소문자 구분합니다.

 

요약

1. password_hash 로 비밀번호 암호화

2. 암호화된 문자열을 DB 에 저장

3. 비밀번호 체크는
  - 화면에서 입력받은 문자열과,
  - userId 로 조회 후 비밀번호 컬럼값을 password_verify 로 비교한다.

 

이렇게 하거나, 

DB 자체에서 지원하는 암호화 알고리즘을 이용하면 됩니다.

예를들면 mysql 은

INSERT INTO testdb.tb_user (userId, userName, userPwd) values ('hello', 'bryan', password('mypass'));

SELECT * from testdb.tb_user where userPwd = password('hello')

password() 는 mysql 5.7.6 부터 deprecate 되었으므로 그 이후 버전은 sha1() 을 쓰면 됩니다. 

INSERT INTO testdb.tb_user (userId, userName, userPwd) values ('newUser', 'bryanOh', sha1('mypass'));

SELECT * from testdb.tb_user where userPwd = sha1('mypass')

 

728x90
반응형

댓글