최신 웹 개발에서는 사용자 비밀번호를 안전하게 저장하는 것이 중요한 작업입니다. Rainbow Table Attack은 사전 컴퓨팅 해시 테이블에 의존하여 원래 비밀번호를 빠르게 일치시키는 일반적인 비밀번호 크래킹 기술입니다. 이 공격을 효과적으로 방어하려면 암호 해시에 "소금"을 추가해야합니다. PHP의 crypt () 함수는이 도전을 잘 처리 할 수있는 도구이지만 올바르게 사용되는 경우에만 도구입니다.
PHP의 crypt () 함수는 일방 통행점에서 문자열을 암호화하는 데 사용되며 종종 암호 해싱에 사용됩니다. 전통적인 DES, MD5 및보다 안전한 Blowfish ( $ 2Y $ ) 및 SHA-256 / 512 ( $ 5 $ / $ 6 $ )를 포함한 다양한 암호화 알고리즘을 지원합니다.
기능 프로토 타입은 다음과 같습니다.
string crypt(string $string, string $salt);
$ string이 암호화 할 원래 문자열 인 경우 $ salt는 사용할 알고리즘과 암호화 변형을 결정합니다.
레인보우 테이블 공격은 해시 값의 사전 계산에 의존합니다. 그러나 각 해시의 소금 값이 다르면 공격자는 일반 무지개 테이블을 사용하여 일치시킬 수 없습니다. crypt ()를 통해 소금 값을 사용자 정의 할 수 있으며 강력한 암호화 알고리즘과 결합 하여이 공격을 효과적으로 피할 수 있습니다.
예를 들어, Blowfish 알고리즘과 동적 소금 값을 사용할 수 있습니다.
$password = 'user-password';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
위 코드에서 :
$ 2y $ 10 $ $는 비용 계수가 10 인 Blowfish 알고리즘을 사용하는 것을 의미합니다.
Random_bytes (16)는 고강도 랜덤 염을 생성합니다.
Substr (..., 0, 22)는 Blowfish 소금 형식을 준수하는 길이로 절단됩니다.
이러한 방식으로 생성 된 $ 해시는 소금을 추가 한 후 암호 해시입니다.
사용자가 로그인하면 소금을 다시 수동으로 생성 할 필요는 없지만 데이터베이스에 저장된 해시를 소금 매개 변수로 Crypt () 로 직접 전달하십시오.
$inputPassword = 'user-input';
$storedHash = '$2y$10$qzWRzYy5q3DvYbEC0KMX4O0PGWlOQxkz7v0QF5OwMqpyG0TzjSAGK'; // 데이터베이스에서
if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
echo '올바른 비밀번호';
} else {
echo '오류 비밀번호';
}
이러한 방식으로 Crypt ()는 해시의 소금 및 알고리즘을 사용하여 비밀번호를 자동으로 다시 밀어 넣은 다음 비교합니다. 이 방법은 간단하고 안전합니다.
$hash = crypt($password, 'fixedsalt');
이 방법은 동일한 암호가 항상 동일한 해시에 해당하기 때문에 레인보우 테이블 공격에 매우 취약합니다.
$hash = crypt($password, 'ab'); // DES 연산,너무 짧은 소금
DES는 소금이 짧을뿐만 아니라 계산 비용이 낮으며 최신 하드웨어는 쉽게 균열이 균열 할 수 있습니다.
Crypt ()는 안전하지만 PHP는 5.5부터 시작하는보다 현대적인 암호 해싱 API 인 Password_hash () 및 Password_Verify ()를 사용하는 것이 좋습니다. 그러나 이전 프로젝트를 유지하거나 호환성 이유로 Crypt ()를 사용하는 경우 다음을 수행해야합니다.
강력한 알고리즘 (예 : $ 2y $ , $ 5 $ , $ 6 $ )을 사용하십시오.
항상 무작위와 긴 소금 값을 사용하십시오.
소금을 재사용하지 마십시오.
소금 값은 별도로 저장되지 않고 해시에 저장해야합니다.
// 등록시
$password = $_POST['password'];
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
// 저장 $hash 데이터베이스로 이동하십시오
// 로그인 할 때
$inputPassword = $_POST['password'];
$storedHash = getHashFromDatabase(); // 데이터베이스에서 얻으십시오
if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
echo '성공적으로 로그인하십시오';
} else {
echo '오류 비밀번호';
}
https://m66.net/php-crypt-guide에 액세스하여 더 많은 예를 들어이 튜토리얼의 온라인 버전을 얻을 수 있습니다.
Crypt () 기능을 올바르게 사용하면 무지개 테이블 공격을 효과적으로 방지 할 수 있습니다. 핵심은 비교할 때 강력한 암호화 알고리즘, 임의의 소금 값 및 보안 관행을 사용하는 것입니다. 새로운 프로젝트는 Password_hash () 일련의 함수를 사용하는 것이 좋습니다. Crypt () 의 안전한 사용을 마스터하는 것은 모든 PHP 개발자에게 강제 과정입니다.