PHP에서 Crypt 함수는 암호 해싱의 전형적인 기능입니다. DES, MD5, Blowfish, SHA-256 및 SHA-512와 같은 다양한 암호화 알고리즘을 지원합니다. 적절한 소금을 사용하면 암호 보안을 향상시킬뿐만 아니라 암호화 알고리즘 및 해싱의 복잡성을 제어합니다.
이 기사에서는 여러 알고리즘에 대한 소금 템플릿을 동적으로 생성하는 방법을 자세히 설명하여 암호 기능을 사용할 때 알고리즘과 소금 값을 유연하게 지정할 수 있습니다.
$password = 'mypassword';
$salt = '$6$rounds=5000$usesomesillystring$'; // SHA-512 예를 들어 소금
$hash = crypt($password, $salt);
echo $hash;
위의 예에서 $ 6 $는 SHA-512 알고리즘을 사용하는 것을 의미합니다. Rounds = 5000은 암호화 반복의 수를 나타내고 다음 문자열은 소금 값 본체입니다.
연산 | 소금 접두사 | 소금 길이와 설명 |
---|---|---|
데스 | 접두사가 없습니다 | 2- 특성 소금 |
MD5 | $ 1 $ | 8- 특성 소금 |
블로우 피쉬 | $ 2A $ 또는 $ 2Y $ | 22 자격 소금 (버전 및 비용 매개 변수 포함) |
SHA-256 | $ 5 $ | 선택적 매개 변수 라운드, 최대 16 자까지의 소금 바디 |
SHA-512 | $ 6 $ | 선택적 매개 변수 라운드, 최대 16 자까지의 소금 바디 |
이것들을 이해 한 후, 우리는 다른 알고리즘을 기반으로 적절한 소금 템플릿을 동적으로 생성 할 수 있습니다.
다음은 입력 알고리즘 이름을 기반으로 해당 형식으로 소금 템플릿을 생성 할 수있는 PHP 함수의 예입니다.
function generateSalt($algorithm = 'sha512', $rounds = 5000) {
// 임의의 소금 바디 생성 기능,길이는 알고리즘 제한에 따라 조정됩니다
function randomSalt($length) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./';
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt .= $chars[random_int(0, strlen($chars) - 1)];
}
return $salt;
}
switch (strtolower($algorithm)) {
case 'des':
// DES 소금 이전에만2성격
return substr(randomSalt(2), 0, 2);
case 'md5':
// MD5 소금 형식 $1$salt$
return '$1$' . randomSalt(8) . '$';
case 'blowfish':
// Blowfish 체재 $2y$cost$22charsalt
$cost = 10; // 2숫자,권장됩니다04도착하다31~ 사이
$costStr = str_pad($cost, 2, '0', STR_PAD_LEFT);
return '$2y$' . $costStr . '$' . randomSalt(22);
case 'sha256':
// SHA-256 체재 $5$rounds=xxxx$salt$
return '$5$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
case 'sha512':
default:
// SHA-512 체재 $6$rounds=xxxx$salt$
return '$6$rounds=' . intval($rounds) . '$' . randomSalt(16) . '$';
}
}
$password = 'my_secret_password';
// 선택 알고리즘
$algorithm = 'blowfish';
// 해당 소금 템플릿을 생성합니다
$salt = generateSalt($algorithm);
// 해시를 생성하십시오
$hash = crypt($password, $salt);
echo "연산: {$algorithm}\n";
echo "소금 템플릿: {$salt}\n";
echo "해시를 생성하십시오: {$hash}\n";
이러한 방식으로 암호를 암호화 할 때 사용되는 알고리즘 및 소금 매개 변수를 매우 유연하게 제어하여 보안을 향상시킬 수 있습니다.
보다 안전한 비밀번호 해싱 체계를 사용하여 PHP의 내장 암호 _hash 및 Password_Verify 함수를 고려하는 것이 좋습니다.
소금 문자열에서 수동으로 스 플라이 싱 매개 변수를 피하십시오. Random_int 와 같은 신뢰할 수있는 임의의 숫자 생성 기능을 사용하는 것이 좋습니다.
보안에 따라 무차별 대구에 저항하는 능력을 향상시키기 위해 보안에 따라 라운드 (반복 수)를 정기적으로 조정하십시오.