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_ARGON2I
및 PASSWORD_ARGON2ID
는 지원되는 인수입니다.
PASSWORD_BCRYPT
는 CRYPT_BLOWFISH
알고리즘을 사용하고 PASSWORD_ARGON2I
는 Argon2i
해싱 알고리즘을 사용하고 PASSWORD_ARGON2ID
는 Argon2id
해싱 알고리즘을 사용합니다. 각 알고리즘이 어떻게 작동하는지 더 잘 이해하려면 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_DEFAULT
및 PASSWORD_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 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