웹 개발에서는 사용자 비밀번호의 보안 저장이 중요합니다. PHP에는 비밀번호 보호에 사용할 수있는 여러 암호화 방법이 있지만 Crypt () 기능은 여전히 고전적이고 효과적인 도구입니다. 이를 통해 개발자는 Blowfish와 같은 다양한 해싱 알고리즘을 사용하여 돌이킬 수없는 암호화 문자열을 생성 할 수 있습니다. 이 기사는 Crypt () 함수를 데이터베이스와 결합하여 안전한 사용자 비밀번호 저장을 달성하는 방법을 설명합니다.
PHP의 crypt () 함수는 일방 통행 암호화에 사용되며 두 매개 변수를 수용합니다.
string crypt ( string $string , string $salt )
$ string 은 암호화 할 원래 문자열입니다 (일반적으로 비밀번호)
$ salt는 암호화 결과에 영향을 미치는 문자열입니다. 다른 소금은 다른 암호화 결과를 생성합니다.
Blowfish 알고리즘을 사용하여 암호화하려면 예를 들어 소금을 포맷해야합니다.
$salt = '$2y$10$' . bin2hex(random_bytes(11));
$hashed_password = crypt('user_password', $salt);
$ 2Y $ 10 $는 Blowfish 알고리즘과 10 라운드의 암호화를 사용하는 것을 의미합니다.
암호화 된 암호를 데이터베이스에 저장하려면 사용자 테이블이 필요합니다. 간단한 사용자 테이블 구조는 다음과 같습니다.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
그런 다음 PHP를 사용하여 데이터베이스에 연결하고 사용자 데이터를 삽입하십시오.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "dbuser", "dbpass");
$username = 'testuser';
$password = 'mypassword';
// 생성하다salt암호를 암호화합니다
$salt = '$2y$10$' . bin2hex(random_bytes(11));
$hashed_password = crypt($password, $salt);
// 데이터베이스에 삽입하십시오
$stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
$stmt->execute([
':username' => $username,
':password' => $hashed_password
]);
?>
로그인 할 때는 단순히 일반 텍스트 비밀번호를 비교할 수 없습니다. 사용자 테이블의 저장된 암호 암호를 소금으로 저장된 암호와 함께 Crypt () 기능을 다시 사용해야합니다.
<?php
$input_password = 'mypassword';
$username = 'testuser';
$stmt = $pdo->prepare("SELECT password FROM users WHERE username = :username");
$stmt->execute([':username' => $username]);
$stored_hash = $stmt->fetchColumn();
if (crypt($input_password, $stored_hash) === $stored_hash) {
echo "비밀번호 확인이 성공했습니다。";
} else {
echo "오류 비밀번호。";
}
?>
crypt () 함수는 안전하지만 점차 Password_hash () 및 password_verify () 로 대체되었습니다. Crypt () 는 이전 시스템과의 역 호환성이 필요한 시나리오에 더 적합합니다.
그러나 crypt ()를 사용할 때주의를 기울여야합니다.
항상 강한 무작위 소금을 사용하고 고정 값을 사용하지 마십시오.
무차별 인력 균열 비용을 증가시키기 위해 암호화 라운드 수 (예 : $ 2Y $ 10 $ )를 제어하십시오.
HTTPS를 사용하여 프론트 엔드와 백엔드를 연결하여 전송 중에 암호가 차단되는 것을 방지하십시오.
예를 들어 URL에서 민감한 데이터를 전달하지 마십시오.