PHP의 비밀번호 해싱

Olorunfemi Akinlua 2023년1월30일
  1. PHP의 비밀번호 해싱
  2. PHP에서 비밀번호 해싱에 password_hash()password_verify() 사용
PHP의 비밀번호 해싱

PHP는 서버 측 개발에 사용되며 로그인 및 등록 프로세스를 구축할 때 암호가 필요합니다. 보안 목적 및 개인 정보 보호 문제를 위해, 아무도(귀하와 귀하의 데이터베이스 관리자를 포함하여) 사용자의 암호를 알 수 없도록 암호를 해시해야 합니다.

그러나 비밀번호를 해시할 때 로그인할 때 다시 해시해야 합니다. 이 기사에서는 비밀번호 해시가 무엇인지, PHP 내장 함수 password_hash()password_verify()를 사용하는 방법에 대해 자세히 설명합니다.

PHP의 비밀번호 해싱

사용자로부터 수집된 데이터는 데이터베이스에 저장되며 데이터베이스에 액세스할 수 있는 모든 사람이 볼 수 있습니다. 사용자 이름과 주소는 종종 그대로 남아 있습니다. 계정의 키만큼 중요하지 않습니다.

사용자의 비밀번호인 텍스트 문자열은 해싱 알고리즘(bcrypt, md5, sha-1, sha-2)을 통해 전달되어 비밀번호가 그대로 저장되는 것을 방지하고 텍스트의 스크램블된 표현을 생성합니다. 암호의 이 스크램블된 표현이 저장되고 로그인 프로세스 동안 스크램블된 표현이 비교됩니다.

내장 password_hash() 함수는 Auth0가 권장하는 bcrypt 알고리즘을 사용하고 클라이언트 기반에 사용합니다. 또한 password_verify() 함수는 암호 텍스트를 해시와 비교하고 암호가 해시와 일치하면 부울 값을 반환합니다.

PHP에서 비밀번호 해싱에 password_hash()password_verify() 사용

사용자가 귀하의 사이트에 와서 새 계정을 만들 때 PHP 개발자로서 귀하는 귀하의 애플리케이션이 비밀번호를 해시하는지 확인합니다. 이를 위해 password_hash() 함수를 적용합니다.

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

코드 조각의 출력은 다음과 같습니다.

$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.

코드 조각은 PHP 문서에 따르면 bcrypt 알고리즘을 사용하는 기본 해싱 알고리즘을 사용합니다. 해싱 알고리즘을 변경하려는 경우 함수의 두 번째 인수를 변경할 수 있습니다.

우리가 사용할 수 있는 세 가지 다른 가능한 인수(해싱 알고리즘)가 있습니다. PASSWORD_BCRYPT, PASSWORD_ARGON2IPASSWORD_ARGON2ID는 지원되는 인수입니다.

PASSWORD_BCRYPTCRYPT_BLOWFISH 알고리즘을 사용하고 PASSWORD_ARGON2IArgon2i 해싱 알고리즘을 사용하고 PASSWORD_ARGON2IDArgon2id 해싱 알고리즘을 사용합니다. 각 알고리즘이 어떻게 작동하는지 더 잘 이해하려면 PHP 암호 해시 문서를 확인하세요.

코드에서 PASSWORD_BCRYPT 매개변수를 사용해 보겠습니다.

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

코드 조각의 출력은 다음과 같습니다.

$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO

PASSWORD_DEFAULTPASSWORD_BCRYPT는 모두 $2y$ 식별자를 사용하며 60자 문자열을 생성합니다. 위의 과정을 통해 사용자의 비밀번호를 성공적으로 해싱했습니다.

이제 사용자가 자신의 계정에 로그인하려면 입력한 암호를 해시된 암호와 비교해야 합니다. 그것이 password_verify()가 재생되는 곳입니다.

내장 함수로 비밀번호와 저장된 해시 비밀번호를 비교할 수 있습니다.

<?php

$password = "24FE21121@1*?";
$hashed_password ='$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.';

print_r(password_verify($password, $hashed_password));

?>

코드 조각의 출력은 다음과 같습니다.

1

PHP에서 1은 true를 나타내고 0은 false를 나타냅니다.

PASSWORD_BCRYPT 매개변수에 의해 생성된 해시된 암호에 password_verify() 함수를 사용해 보겠습니다.

<?php

$password = "24FE21121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

print_r(password_verify($password, $hashed_password));

?>

코드 조각의 출력은 다음과 같습니다.

1

password_verify() 함수가 우리가 사용하는 해시된 암호에 관계없이 작동할 수 있는 이유는 함수가 둘 다인 crypt()와 호환되는 주어진 해시 일치를 확인하기 때문입니다. 또한 함수는 반환된 해시의 일부로 알고리즘, 비용 및 솔트를 반환하며 타이밍 공격에 대해 안전합니다.

해시 결과를 개선하려면 password_hash() 함수에서 비용 및 솔트 옵션을 지정하십시오. 그러나 사용 방법을 이해하지 못하면 보안에 큰 영향을 미칠 수 있습니다.

password_verify() 함수가 잘못된 암호를 포착하는지 확인하려면 잘못된 암호를 입력해 보겠습니다(24FE21121@1*?에서 24Fqqw1121@1*?로 변경).

<?php

$password = "24Fqqw1121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

if (password_verify($password, $hashed_password)) {
    echo "Password Matches!";
} else {
    echo "Wrong Password";
}

?>

코드 조각의 출력은 다음과 같습니다.

Wrong Password

실제 로그인 프로세스의 컨텍스트 내에서 사용하는 경우 코드는 다음과 같을 수 있습니다.

<?php
$connect = mysqli_connect($localhost, $username, $password, $database);

if (isset($_POST['submit'])) {
    extract($_POST);

    // retrive stored hashed password
    $sqlQuery = mysqli_query($connect, "SELECT * FROM USERTABLE WHERE USER='$username'");
    $fetch = mysqli_fetch_array($sqlQuery);
    $currentPassword = $fetch['hashPassword'];

    if (password_verify($enteredPassword, $currentPassword)) {
        // password matches
        $_SESSION['id'] = $fetch['id'];
        header("location: home.php");
    } else {
        // password doesn't match
        $output = "Wrong Passworfd";
    }
}
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

관련 문장 - PHP Password