[소스] 비밀번호 암호화 저장, 비교 password_verify( $inputVal, $dbVal)
2025.02.04
비밀번호의 일방향 암호화 저장
2023년 9월 12일 개정된 「개인정보보호법 시행령 제30조 제4항」에서 ‘비밀번호의 일방향 암호화 저장’이 명시적으로 법적 근거로 들어갔습니다. 즉, 단순 암호화(AES 등) 대신 반드시 복호화 불가능한 해시 방식으로 저장해야 한다는 점이 법령에 확실히 규정된 것입니다.
- 회원가입, 게시판 작성시 비밀번호 모두 해당 된다.
1. 비밀번호를 암호화 할때 사용
- password_hash( string $password, mixed $algorithm, array $option =? ) : string|false
- 문자열을 단방향 암호화
<input type="password" name="passwd" id="passwd" class="_btn" placeholder="비밀번호" />
$PASSWD = password_hash($_POST["passwd"], PASSWORD_DEFAULT); //DB에저장
2. 비빌번호 비교
if(password_verify($_POST[passwd], $DB["passwd"])){
// true
}else{
//false
}
html
<form name="form_par" id="form_par">
<input type="password" name="password" placeholder="영문, 숫자,특수문자포함 8~20자 이내 입력">
<button type="button" onclick="send()">전송</button>
</form>
<script>
function password_check(str){
var regExp3 = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,20}$/;
if(!regExp3.test(str)){
alert("비밀번호는 영문, 숫자, 특수문자를 포함한 8~20자로 입력하세요.");
return false;
}
return true; // 성공 시 true 반환
}
function send(){
let passVal = $("input[name=password]").val();
if(!passVal){
alert("패스워드를 입력하세요");
return;
}else{
password_check(passVal)
}
const formVal = $("#form_par")[0];
const formData = new FormData(formVal);
fetch("phpfile.php",{
method : "POST",
body : formData
})
.then( response => response.json())
.then( data => {
// "phpfile.php"에서 전송 받은 값 data.~
})
.catch( error => console.error("Error"), error);
}
</script>
php
<?php
function validatePassword($str) {
// 정규식:
// ^ 시작
// (?=.*[A-Za-z]) 영문자 반드시 포함
// (?=.*\d) 숫자 반드시 포함
// (?=.*[!@#$%^&*(),.?":{}|<>]) 특수문자 반드시 포함
// [A-Za-z\d!@#$%^&*(),.?":{}|<>]{8,20} 전체 길이 8~20자
// $ 끝
$pattern = "/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*(),.?\":{}|<>])[A-Za-z\d!@#$%^&*(),.?\":{}|<>]{8,20}$/";
if (preg_match($pattern, $str)) {
return true; // 검증 성공
} else {
return false; // 검증 실패
}
}
// 사용 예시
$state = false;
$mtxt = "";
$password = $_POST['password'] ?? '';
if (!validatePassword($password)) {
$mtxt = "비밀번호는 영문, 숫자, 특수문자를 포함한 8~20자여야 합니다.";
}else{
$mtxt = "비밀번호 검증 성공!";
//암호화
$passwordok = password_hash($password , PASSWORD_DEFAULT);
//DB 데이터와 검증 $DB["password"] 이면
if(password_verify($password, $DB["password"])){
$mtxt = "비밀번호 검증 성공!!";
$state = true;
}else{
$mtxt = "비밀번호 다름";
$state = false;
}
}
$responseData = array(
'state'=> $state,
'Txt' => $mtxt,
);
header('Content-Type: application/json');
echo json_encode($responseData);
?>
작성자
꿘쓰
작성일
2025.02.04
