본문 바로가기
server/php

[Server][PHP] 비밀번호 암호화 저장, 비교하기

by 윈 Win 2021. 6. 15.
728x90

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[PHP] 비밀번호 암호화 저장, 비교하기 — Win Record (tistory.com)

 

 


 

※ php 7.4 버전 기준 작성 ※

구현 기능

  • 비밀번호 암호화하여 저장하기 (eg. 회원가입)
  • 비밀번호와 입력값 비교하기 (eg. 로그인)

 


비밀번호 암호화 하기

비밀번호를 암호화할 때에는 아래의 함수를 사용한다.

password_hash(string $password, mixed $algorithm, array $options = ?) : string|false

    $password: 암호화할 비밀번호

    $algorithm: 암호화 알고리즘

    $options: 암호화할 때의 옵션. salt, cost, memory_cost, time_cost, threads

 

단방향 암호화해주는 해시함수이다.

즉, 암호화(평문->암호문)는 가능하지만 복호화(암호문->평문)가 불가능하다.

성공적으로 암호화할 경우 암호화한 문자열을 리턴하고, 암호화 실패 시 false를 리턴한다.

 

지원되는 알고리즘은 네가지이다.

  • PASSWORD_DEFAULT
    패스워드 저장을 목적으로 만들어진 bcrypt 알고리즘 사용. DB 저장 시 60자 이상의 문자열 담을 수 있게 할 것. 255자 추천.
  • PASSWORD_BCRYPT
    CRYPT_BLOWFISH 알고리즘 사용. 60자 길이의 문자열로 암호화.
  • PASSWORD_ARGON2I
    Argon2i 해싱 알고리즘 사용. Argon2를 지원하는 PHP만 사용 가능.(PHP 7.2.0 이상)
  • PASSWORD_ARGON2ID
    Argon2id 해싱 알고리즘 사용. Argon2를 지원하는 PHP만 사용 가능.(PHP 7.3.0 이상)
$password = "Win's new password";
$hased_password = password_hash($password, PASSWORD_DEFAULT);

echo $password; // $2y$10$75fPh6gkdkrWK/P7TWhNtebbdIu9FTdSeXrpnGfLGzAS/QRJVRPyG

 

비밀번호와 입력값 비교하기

비밀번호를 검증할 때에는 아래 함수를 사용한다.

password_verify(string $password, string $hash) : bool

    $password: 입력값

    $hash: 암호화된 비밀번호

 

암호화된 비밀번호를 복호화할 수 없기 때문에 복호화한 비밀번호와 입력값을 비교하는 것은 불가능하다.

따라서 암호화된 비밀번호와 입력값을 비교하는 함수 password_verify()를 사용한다.

두 값이 일치하면 true를, 불일치하면 false를 리턴한다.

$hash = "$2y$10$75fPh6gkdkrWK/P7TWhNtebbdIu9FTdSeXrpnGfLGzAS/QRJVRPyG";
$input = "input password";

$is_match = password_verify($input, $hash);

if ($is_match) {
	// 비밀번호 맞았을 때 동작
} else {
	// 비밀번호 틀렸을 때 동작
}

댓글