현대 웹 개발에서는 사용자 인증의 보안이 중요합니다. 비밀번호 보호가 제자리에 있지 않으면 사용자 정보 누출로 이어지고 헤아릴 수없는 손실을 가져올 가능성이 높습니다. PHP의 내장 Crypt () 함수는 암호 암호화를 강력하게 지원합니다. 합리적인 프로세스 설계와 결합하여 인증 보안을 크게 향상시킬 수 있습니다. 이 기사는 Crypt ()를 사용하여 안전하고 신뢰할 수있는 사용자 인증 프로세스를 구현하는 방법을 자세히 소개합니다.
crypt () 함수는 Unix의 암호화 알고리즘을 기반으로하며 문자열 (보통 암호)을 암호화하는 데 사용됩니다. 핵심 장점은 Blowfish, SHA-256, SHA-512 등을 포함한 다양한 암호화 알고리즘을 지원하고 소금 값 (소금) 메커니즘과 함께 암호의 보안을 크게 향상 시킨다는 것입니다.
기능 프로토 타입은 다음과 같습니다.
string crypt(string $password, string $salt);
$ 암호는 암호화 할 암호의 명확한 텍스트입니다.
$ 소금 은 암호화에 사용되는 소금으로 암호화 알고리즘과 복잡성을 결정할 수 있습니다.
사용자를 등록 할 때는 일반 텍스트 비밀번호를 암호화하여 데이터베이스에 저장해야합니다. 예는 다음과 같습니다.
<?php
// 사용자가 제출 한 일반 텍스트 비밀번호
$password = $_POST['password'];
// 안전한 소금을 생성하십시오(~에 의해 Blowfish 예로)
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
// 사용 crypt() 암호화 비밀번호
$hashedPassword = crypt($password, $salt);
// 할 것이다 $hashedPassword 데이터베이스에 저장하십시오
// 예:mysqli 또는 PDO 코드를 단순화했습니다
echo "암호화 된 비밀번호:$hashedPassword";
?>
Blowfish 알고리즘은 여기에 사용됩니다. $ 2y $는 Blowfish를 나타내고 12는 계산 비용입니다. 숫자가 클수록 더 안전하지만 계산은 느립니다.
Random_bytes (16)는 소금의 무작위성을 보장하기 위해 강한 랜덤 숫자를 생성합니다.
사용자가 로그인하면 입력 된 암호가 데이터베이스에 저장된 암호와 일치하는지 확인해야합니다. crypt () 의 소금은 암호화 결과에 포함되므로 재사용 할 수 있습니다.
<?php
// 사용자가 입력 한 비밀번호
$password = $_POST['password'];
// 데이터베이스의 해시 비밀번호 쿼리
$storedHash = /* 쿼리 문으로 얻은 비밀번호 해시 */;
// 사용相同盐值重新加密输入密码
$checkHash = crypt($password, $storedHash);
if (hash_equals($storedHash, $checkHash)) {
// 검증이 통과되었습니다
echo "성공적으로 로그인하십시오";
} else {
// 확인이 실패했습니다
echo "用户名또는密码错误";
}
?>
hash_equals ()를 사용하여 시간 안전 비교를 수행하여 시간 공격을 피하십시오.
입력 암호가 데이터베이스의 암호 해시에 해당하는 소금과 동일하다면 Crypt () 재 암호화 결과가 정확히 일치해야합니다.
<?php
// 连接数据库예(사용 mysqli)
$mysqli = new mysqli("m66.net", "user", "password", "database");
// 사용자 등록
function registerUser($username, $password) {
global $mysqli;
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
$hashedPassword = crypt($password, $salt);
$stmt = $mysqli->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
$stmt->bind_param("ss", $username, $hashedPassword);
return $stmt->execute();
}
// 사용자 로그인 확인
function loginUser($username, $password) {
global $mysqli;
$stmt = $mysqli->prepare("SELECT password FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($storedHash);
if (!$stmt->fetch()) {
return false; // 사용자는 존재하지 않습니다
}
$stmt->close();
$checkHash = crypt($password, $storedHash);
return hash_equals($storedHash, $checkHash);
}
// 예调用
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
if (isset($_POST['register'])) {
if (registerUser($username, $password)) {
echo "성공적으로 등록되었습니다";
} else {
echo "등록이 실패했습니다";
}
} elseif (isset($_POST['login'])) {
if (loginUser($username, $password)) {
echo "성공적으로 로그인하십시오";
} else {
echo "用户名또는密码错误";
}
}
}
?>
HTTPS 사용 : 데이터 전송 프로세스가 암호화되어 중간 공격을 방지하십시오.
로그인 시도 수를 제한하십시오 : 무차별 력 균열 방지.
정기적으로 암호화 비용 업데이트 : 하드웨어 성능이 향상됨에 따라 Blowfish의 비용 매개 변수는 적시에 증가합니다.
비밀번호 강도 감지 : 사용자는 등록 할 때 강력한 암호를 설정하라는 메시지가 표시됩니다.
민감한 정보를 일반 텍스트로 저장하지 마십시오 .