PHP에서 암호 기능은 종종 암호 해싱에 사용됩니다. 무지개 테이블 공격과 같은 보안 위험을 방지하기 위해 소금 값 (소금)을 통해 해싱의 보안을 향상시킬 수 있습니다. 그러나 많은 개발자들은 Crypt를 사용할 때 하드 코드 소금 값에 익숙해져 보안 위험이 발생할 수 있습니다. 이 기사는 하드 코딩 된 소금 값을 피하는 방법에 대해 자세히 논의하여 암호 저장의 보안을 향상시킵니다.
하드 코딩 된 소금 값은 다음과 같은 코드에 고정 된 소금 문자열을 직접 쓰는 것을 말합니다.
$salt = '$6$rounds=5000$fixedsaltstring$';
$hash = crypt($password, $salt);
그렇게하는 데 명백한 위험이 있습니다.
소금 가치 재사용 : 모든 사용자의 암호 해시는 동일한 소금을 사용하며 공격자는 공격을 미리 계산하여 공격을 미리 계산할 수 있습니다.
노출 된 소금 값 : 소스 코드가 유출되고 공격자가 소금에 대해 알고 있다면 해시 균열의 어려움이 크게 줄어 듭니다.
스케일링이 어렵다 : 소금 전략을 변경 해야하는 경우 하드 코딩 된 부분을 수정하는 것은 매우 융통성이 없습니다.
위의 문제를 피하려면 독특하고 안전한 소금을 동적으로 생성하는 것이 좋습니다. 몇 가지 핵심 사항은 다음과 같습니다.
PHP의 Random_Bytes () 함수는 고강도 랜덤 바이트를 생성 할 수 있으며 Base64 또는 유사한 인코딩을 결합하여 염을 생성 할 수 있습니다.
function generateSalt($length = 16) {
$bytes = random_bytes($length);
return substr(strtr(base64_encode($bytes), '+', '.'), 0, $length);
}
알고리즘마다 소금 형식에 대한 요구 사항이 다릅니다. SHA-512 ( $ 6 $ ) 복용 예를 들어, 형식은 다음과 같습니다.
$6$rounds=5000$saltstring$
동적 소금과 결합 :
$saltString = '$6$rounds=5000$' . generateSalt() . '$';
$hash = crypt($password, $saltString);
Crypt 에 의해 반환 된 해시에는 소금 정보가 포함되어 있습니다. 보관할 때는 소금을 별도로 저장하지 않고 완전한 해시를 저장하면됩니다.
확인할 때 입력 암호 및 스토리지 해시로 직접 Crypt를 호출하고 결과를 비교하십시오.
function verifyPassword($inputPassword, $storedHash) {
return crypt($inputPassword, $storedHash) === $storedHash;
}
<?php
// 동적 소금을 생성하십시오
function generateSalt($length = 16) {
$bytes = random_bytes($length);
return substr(strtr(base64_encode($bytes), '+', '.'), 0, $length);
}
// 암호 해시를 만듭니다
function createHash($password) {
$salt = '$6$rounds=5000$' . generateSalt() . '$';
return crypt($password, $salt);
}
// 비밀번호를 확인하십시오
function verifyPassword($inputPassword, $storedHash) {
return crypt($inputPassword, $storedHash) === $storedHash;
}
// 예제 사용
$password = 'mypassword123';
$hash = createHash($password);
echo "해시 가치: $hash\n";
if (verifyPassword('mypassword123', $hash)) {
echo "비밀번호 확인이 성공했습니다!\n";
} else {
echo "비밀번호 확인이 실패했습니다!\n";
}
?>
하드 코딩 된 소금 값을 피하면 암호 해싱의 보안이 크게 향상 될 수 있습니다. PHP의 랜덤 숫자 생성 기능을 사용하면 고유 한 소금 값이 동적으로 생성되고 완전한 해시가 데이터베이스에 저장되어 다양한 공격 방법에 효과적으로 저항 할 수 있습니다.