간단한 사용자 시스템을 개발할 때 암호화 된 비밀번호 저장은 보안의 기초 중 하나입니다. PHP는 매우 실용적인 암호화 기능 Crypt () 를 제공하여 기본 암호 암호화 및 검증 기능을 신속하게 구현할 수 있도록 도와줍니다. 이 기사는 간결한 예제를 사용하여 Crypt () 함수를 사용하여 간단한 사용자 인증 시스템을 구축하는 방법을 설명합니다.
crypt () 는 일원 문자열 암호화에 대한 PHP의 함수이며, 일반적으로 비밀번호 암호화에 사용됩니다. 기본 구문은 다음과 같습니다.
string crypt(string $string, string $salt)
그중에서도 $ string 은 암호화 해야하는 문자열이며 $ salt는 암호화 결과에 영향을 미치는 데 사용되는 "소금"값이며 다양한 암호화 알고리즘 (예 : Blowfish, MD5, SHA-256, SHA-512 등)을 지원합니다.
등록 할 때 암호를 암호화하고 저장해야합니다. 간단한 등록 예는 다음과 같습니다.
<?php
// 사용자가 입력 한 비밀번호
$password = 'user_password123';
// 사용 Blowfish 알고리즘은 암호화 암호를 생성합니다
$hash = crypt($password, '$2y$10$' . bin2hex(random_bytes(11)));
// 데이터베이스에 저장하기 위해 시뮬레이션하십시오
file_put_contents('users.txt', "username:$hash\n");
echo "사용자 등록,비밀번호는 암호화되고 저장됩니다。";
?>
여기서 우리는 $ 2y $ 10 $ 로 시작하는 소금 접두사를 사용합니다. 이는 Blowfish 알고리즘 (암호 암호화에 권장)을 사용하는 것을 의미합니다. Random_bytes (11)는 임의의 소금 값을 생성하여 암호가 동일하더라도 각 암호화 결과가 다릅니다.
사용자가 로그인하면 입력 된 비밀번호를 동일한 소금을 사용하여 암호화 한 다음 데이터베이스의 암호 해시와 비교해야합니다.
<?php
// 사용자 입력
$input_username = 'username';
$input_password = 'user_password123';
// ~에서“데이터 베이스”정보를 읽으십시오
$data = file('users.txt');
foreach ($data as $line) {
list($stored_username, $stored_hash) = explode(':', trim($line));
if ($input_username === $stored_username) {
// 사용存储的 hash 처럼 salt 다시 입력 한 비밀번호를 암호화합니다
if (crypt($input_password, $stored_hash) === $stored_hash) {
echo "성공적으로 로그인하십시오,다시 오신 것을 환영합니다 $input_username!";
} else {
echo "오류 비밀번호。";
}
exit;
}
}
echo "사용자는 존재하지 않습니다。";
?>
이런 식으로 공격자가 암호 해시를 훔치더라도 해시에서 원래 비밀번호를 직접 복원 할 수 없습니다. 동시에, 각 사용자는 다른 소금을 사용하므로 여러 사용자가 동일한 암호를 사용하더라도 저장된 해시 값은 다릅니다.
Crypt ()는 기본 보안을 제공 할 수 있지만 PHP는 5.5에서 Password_hash () 및 Password_verify ()를 사용하는 것이 좋습니다. 그들은 여전히 하단에 crypt ()를 사용하지만 캡슐화는 더 완벽하고 안전합니다.
그러나 일부 제한된 환경 (예를 들어 소금을 수동으로 제어 해야하는 기존 서버 또는 시스템)에서 Crypt () 는 여전히 효과적인 도구입니다.
위의 내용을 통해 PHP의 Crypt () 함수를 사용하여 간단한 사용자 확인 시스템을 신속하게 구축 할 수 있음을 알 수 있습니다.
암호를 암호화하고 등록 할 때 저장하십시오.
암호를 다시 암호화하고 로그인 할 때 동일한 소금 값과 비교하십시오.
임의의 소금과 결합하여 암호화 강도를 높이고 무지개 테이블 공격을 방지합니다.
현대 프로젝트에는 Password_hash ()가 더 권장되지만 Crypt () 의 기본 메커니즘을 이해하는 것은 여전히 저수준 사용자 정의가 필요한 경우에도 여전히 도움이됩니다.