프리랜서 웹디자이너 웹퍼블리셔RELATION

[소스] 비밀번호 암호화 저장, 비교 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);
?>
전체목록

이 포스트 공유하기

  • 페이스북에 공유하기
  • 트위터에 공유하기
  • 네이버 블로그 카페에 공유하기
  • 네이버 밴드에 공유하기

코멘트 쓰기

코멘트를 입력해주세요
LOGIN JOIN