본문 바로가기
개발자공간/PHP

PHP password_hash, password_verify 암호화

by 냉국이 2021. 1. 5.
728x90

password_hash 는 원하는 문자열을 암호화하는데 그 목적을 두고 있습니다. 

 

PHP >= 5.3.7

 

위와 같은 조건에서 사용이 가능합니다.

 

서버 버전 5.3.7 미만 이신 분들은 포스팅 하단에 미만 버전에 맍게 만들어 놓은 라이브러리 다운로드 링크 남겨놓겠습니다.

 

우선 password_hash 는 기본적으로 2개의 매개변수를 받습니다. 

 

첫번째 매개변수는 변환할 String 또는 Number 타입입니다.

 

두번째 매개변수는 변환시킬 때 사용될 알고리즘 형태입니다.

 

* 사용법

> password_hash("password", PASSWORD_DEFAULT )

 

 

두번째 매개변수인 알고리즘 형태는 2가지가 있습니다. ( PASSWORD_DEFAULT , PASSWORD_BCRYPT )

 

설명은 메뉴얼에 가서 구글 번역기를 돌려왔습니다.

 

 

 

# PASSWORD_DEFAUTL

 

bcrypt 알고리즘을 사용하십시오. 이 상수는 새롭고 강력한 알고리즘이 PHP에 추가되면서 시간이 지남에 따라 변경되도록 설계되었습니다. 따라서이 식별자를 사용하여 얻은 결과의 길이는 시간이 지남에 따라 변경 될 수 있습니다. 따라서 60자를 초과 할 수있는 데이터베이스 열에 결과를 저장하는 것이 좋습니다 (255자를 선택하는 것이 좋음).

 

# PASSWORD_BCRYPT

 

CRYPT_BLOWFISH 알고리즘을 사용하여 해시를 만듭니다. 이렇게하면 "$ 2y $"식별자를 사용하여 표준 crypt () 호환 해시가 생성됩니다. 결과는 항상 60 자 문자열이되며, 실패시 거짓이 반환됩니다.

 

 

 

password_hash 는 사용할때마다 그 결과 값이 달라집니다.

 

예를 들어 "password" 라는 값을 주고 암호화를 해서 얻은 결과가 We56#4212ad%1w!56er24%#1We 라고 한다면 

 

그 다음 다시 암호화를 했을때 다른 결과가 출력이 되죠. 테스트를 한번 해볼까요??

 

<?php 

 

$pass = password_hash('password', PASSWORD_DEFAULT);

 

echo $pass;

 

?>

 

 

이런식으로 코드를 짠뒤 출력해보면 다음과 같은 결과 값이 나옵니다.

 

결과값 : $2y$10$iHlI9z1AAvivUBSzgeu9B./pYW.jKcFzV7MNqRWbEhp5GkzZShDMy$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge

 

새로고침 결과 : $2y$10$se6Of5YXOOaq6rBKxJ7cpOKVO32xgZp0h/nOd/xJRmr23DIMRAcEC$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge$2y$12$teEwIui0y0Cz5fdlVMlImuZ5WptS4pVegM.8TTze6gXRNDzOgmZjy

 

이런식의 결과가 도출 됩니다. 

 

 

 

그 다음 3번째 매개변수에 대해 알아보겠습니다.

 

3번째 매개변수는 필수 사항이 아니며 기본값을 가지고 있습니다 (10)

 

3번째 매개변수는 cpu의 재산을 할당하며, 계산법의 복잡도를 조절가능하다.

 

* 사용법

 

array("cost" => 10)

 

1 . password_hash("password", PASSWORD_DEFAULT, array("cost" => 10) )

 

2 . password_hash("password", PASSWORD_DEFAULT, ["cost" => 10] )

 

3 . $option = [ "cost" => 10 ];

    password_hash("password", PASSWORD_DEFAULT, $option )

 

위 세가지는 전부 같은 기능을 합니다. 

 

cost의 숫자는 알고리즘의 복잡도를 의미합니다.

수치가 높을수록 cpu점유율이 올라가며 암호화에 시간이 소모됩니다.

 

 

$query = "SELECT id ,pass FROM TABLE";

$result = mysqli_query($conn, $query);


while( $row = mysqli_fetch_array($result) ) {
    $hash = password_hash($row['pass'], PASSWORD_DEFAULT);        
 
    $sql = "UPDATE TABLE SET pass = '$hash' WHERE id = '$row[id]' ";
    $result = mysqli_query($conn ,$sql) or die(mysqli_error($conn));

}

 

 

 

그래서 cost 를 지정했죠. (default 값은 10 입니다.)

 

 

 

복호화는 간단합니다. ( 암호화된 문자를 푼다는 의미 )

 

대신 복호화된 문자를 볼 순 없고 비교만 가능합니다. 비교하여 true 또는 false 를 반환합니다.

 

> password_verify('비교할 문자', $hash);

 

 

 

예시

$pass = 'asdf123123';
$query = "SELECT id ,pass FROM TABLE ";

$result = mysqli_query($conn, $query);

$row = mysqli_fetch_array($result);
$hash = $row['pass'];

if (password_verify($pass ,$hash)) {
    // 성공
} else {
    // 실패
}

 

 

 

 

 

 

 

PHP 버전이 낮으신 분들은 참고하세요.

 

5.3.7 미만인경우

 

https://github.com/ircmaxell/password_compat

 

git 링크타고 가셔서 zip 파일 다운로드 받고 lib 안에 있는 password.php 를 본인 라이브러리 폴더에 넣습니다.

 

그리고 include_once 시켜서 위에서 설명한 것과 똑같이 사용하면 됩니다.

 

 

 

300x250

댓글