password_hash 는 원하는 문자열을 암호화하는데 그 목적을 두고 있습니다.
PHP >= 5.3.7
위와 같은 조건에서 사용이 가능합니다.
서버 버전 5.3.7 미만 이신 분들은 포스팅 하단에 미만 버전에 맍게 만들어 놓은 라이브러리 다운로드 링크 남겨놓겠습니다.
우선 password_hash 는 기본적으로 2개의 매개변수를 받습니다.
첫번째 매개변수는 변환할 String 또는 Number 타입입니다.
두번째 매개변수는 변환시킬 때 사용될 알고리즘 형태입니다.
* 사용법
> password_hash("password", PASSWORD_DEFAULT )
두번째 매개변수인 알고리즘 형태는 2가지가 있습니다. ( PASSWORD_DEFAULT , PASSWORD_BCRYPT )
설명은 메뉴얼에 가서 구글 번역기를 돌려왔습니다.
# PASSWORD_DEFAUTL
bcrypt 알고리즘을 사용하십시오. 이 상수는 새롭고 강력한 알고리즘이 PHP에 추가되면서 시간이 지남에 따라 변경되도록 설계되었습니다. 따라서이 식별자를 사용하여 얻은 결과의 길이는 시간이 지남에 따라 변경 될 수 있습니다. 따라서 60자를 초과 할 수있는 데이터베이스 열에 결과를 저장하는 것이 좋습니다 (255자를 선택하는 것이 좋음).
# PASSWORD_BCRYPT
CRYPT_BLOWFISH 알고리즘을 사용하여 해시를 만듭니다. 이렇게하면 "$ 2y $"식별자를 사용하여 표준 crypt () 호환 해시가 생성됩니다. 결과는 항상 60 자 문자열이되며, 실패시 거짓이 반환됩니다.
password_hash 는 사용할때마다 그 결과 값이 달라집니다.
예를 들어 "password" 라는 값을 주고 암호화를 해서 얻은 결과가 We56#4212ad%1w!56er24%#1We 라고 한다면
그 다음 다시 암호화를 했을때 다른 결과가 출력이 되죠. 테스트를 한번 해볼까요??
<?php
$pass = password_hash('password', PASSWORD_DEFAULT);
echo $pass;
?>
이런식으로 코드를 짠뒤 출력해보면 다음과 같은 결과 값이 나옵니다.
결과값 : $2y$10$iHlI9z1AAvivUBSzgeu9B./pYW.jKcFzV7MNqRWbEhp5GkzZShDMy$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge
새로고침 결과 : $2y$10$se6Of5YXOOaq6rBKxJ7cpOKVO32xgZp0h/nOd/xJRmr23DIMRAcEC$2y$12$oyq2Si5zXaQtBz5l1N.NaOlFD8nVl/dLzD11GluftW45C7djKgrge$2y$12$teEwIui0y0Cz5fdlVMlImuZ5WptS4pVegM.8TTze6gXRNDzOgmZjy
이런식의 결과가 도출 됩니다.
그 다음 3번째 매개변수에 대해 알아보겠습니다.
3번째 매개변수는 필수 사항이 아니며 기본값을 가지고 있습니다 (10)
3번째 매개변수는 cpu의 재산을 할당하며, 계산법의 복잡도를 조절가능하다.
* 사용법
array("cost" => 10)
1 . password_hash("password", PASSWORD_DEFAULT, array("cost" => 10) )
2 . password_hash("password", PASSWORD_DEFAULT, ["cost" => 10] )
3 . $option = [ "cost" => 10 ];
password_hash("password", PASSWORD_DEFAULT, $option )
위 세가지는 전부 같은 기능을 합니다.
cost의 숫자는 알고리즘의 복잡도를 의미합니다.
수치가 높을수록 cpu점유율이 올라가며 암호화에 시간이 소모됩니다.
$query = "SELECT id ,pass FROM TABLE";
$result = mysqli_query($conn, $query);
while( $row = mysqli_fetch_array($result) ) {
$hash = password_hash($row['pass'], PASSWORD_DEFAULT);
$sql = "UPDATE TABLE SET pass = '$hash' WHERE id = '$row[id]' ";
$result = mysqli_query($conn ,$sql) or die(mysqli_error($conn));
}
그래서 cost 를 지정했죠. (default 값은 10 입니다.)
복호화는 간단합니다. ( 암호화된 문자를 푼다는 의미 )
대신 복호화된 문자를 볼 순 없고 비교만 가능합니다. 비교하여 true 또는 false 를 반환합니다.
> password_verify('비교할 문자', $hash);
예시
$pass = 'asdf123123';
$query = "SELECT id ,pass FROM TABLE ";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_array($result);
$hash = $row['pass'];
if (password_verify($pass ,$hash)) {
// 성공
} else {
// 실패
}
PHP 버전이 낮으신 분들은 참고하세요.
5.3.7 미만인경우
https://github.com/ircmaxell/password_compat
git 링크타고 가셔서 zip 파일 다운로드 받고 lib 안에 있는 password.php 를 본인 라이브러리 폴더에 넣습니다.
그리고 include_once 시켜서 위에서 설명한 것과 똑같이 사용하면 됩니다.
'개발자공간 > PHP' 카테고리의 다른 글
PHP 비동기 데이터전송(fsockopen) (0) | 2023.03.28 |
---|---|
PHP - 날짜 일수 차이 계산 date_diff (0) | 2021.04.13 |
php 지난달 구하기, 전월 구하기 (0) | 2020.12.09 |
php 지난달 구하기, 전월 구하기 (0) | 2020.12.08 |
PHP - 문자열이 포함되는지 검사하는 strpos (0) | 2020.12.08 |
댓글