암호 해싱에 PHP의 Crypt () 함수를 사용하는 경우 SALT의 보안은 비밀번호 스토리지의 보안에 직접적인 영향을 미칩니다. 소금 값의 기능은 동일한 암호가 동일한 해시 값을 생성하는 것을 방지하여 무지개 테이블 공격에 효과적으로 저항하는 것입니다. 따라서 안전하고 신뢰할 수있는 소금 값을 생성하는 것이 매우 중요합니다.
소금 값은 암호에 추가 된 후 해시 된 임의의 문자열입니다. 좋은 소금 값에는 다음과 같은 특성이 필요합니다.
독특하고 무작위 : 각 암호는 고유 한 소금 값에 해당합니다.
충분히 길다 : 소금 값이 쉽게 추측되는 것을 피하십시오.
해싱 알고리즘에 적합 : 다른 알고리즘에는 소금 값의 길이와 형식에 대한 요구 사항이 있습니다.
crypt ()는 여러 암호화 알고리즘을 지원하며 다른 알고리즘마다 소금 가치 형식에 대한 요구 사항이 다릅니다. 일반적인 알고리즘 및 소금 가치 형식은 다음과 같습니다.
DES : 소금 값의 길이는 2 자입니다.
MD5 : $ 1 $ 로 시작합니다. $ 1 $ ABCDEFGH $ 와 같은 소금 가치의 최대 8 자.
Blowfish : $ 2A $ 또는 $ 2Y $ 로 시작하고 2 자리 비용 요인과 $ 2Y $ 10 $ 10 $ ABCDEFGHIJKLMNOPQRSTUV 와 같은 22 자의 소금 값이 이어집니다.
SHA-256 : $ 5 $ 로 시작한 다음 소금 값이 최대 16 자까지 시작됩니다.
SHA-512 : $ 6 $ 로 시작하고 소금 값이 최대 16 자까지 이어집니다.
Blowfish ( $ 2y $ ) 또는 SHA-512 ( $ 6 $ ) 알고리즘은 더 안전하고 더 긴 소금 값을 지원하기 때문에 권장됩니다.
소금 값을 생성하기위한 핵심은 안전한 임의의 숫자 생성 기능을 사용하고 해당 알고리즘의 소금 값 형식 요구 사항을 준수하는 것입니다.
샘플 코드 :
<?php
function generateSalt($algo = 'bcrypt') {
switch ($algo) {
case 'bcrypt':
// Blowfish 필요 22 개별 Base64 성격,비용은입니다 10
$cost = 10;
// 무작위 바이트 사용,转换成可用的성격集
$randomBytes = random_bytes(16);
$base64String = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64String);
case 'sha512':
// SHA-512 최대 허용16성격盐
$randomBytes = random_bytes(12);
return '$6$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16);
default:
throw new Exception("Unsupported algorithm");
}
}
// 사용의 예
$password = 'user_password';
$salt = generateSalt('bcrypt');
$hash = crypt($password, $salt);
echo "소금 가치:$salt\n";
echo "해시 가치:$hash\n";
?>
위 코드에서 :
random_bytes ()는 안전한 랜덤 바이트를 생성하는 데 사용됩니다.
Base64_encode ()는 소금 값 형식 요구 사항을 충족하기 위해 인코딩되어 + 로 교체됩니다.
Blowfish는 성능이 안전하고 합리적인 비용 계수 10을 사용합니다.
생성 된 소금 값은 Crypt () 가 요구하는 형식입니다.
PHP 7.2 이상은 소금 값 생성 및 알고리즘 선택을 자동으로 처리하는 내장 비밀번호 _hash () 함수를 사용하여 강력히 권장합니다. 단순화되고 안전합니다.
<?php
$password = 'user_password';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash;
?>
Crypt ()를 수동으로 사용해야하는 경우 소금 값이 안전하고 무작위이며 형식이 정확한지 확인하십시오. 그렇지 않으면 해시 약화로 이어질 수 있습니다.