PHP 5.5의 password_hash 및 password_verify 기능 사용
사용자의 암호를 저장하고 싶었다고 가정해 보겠습니다. 이것이 PHP 5.5로 수행하는 올바른 방법입니까?password_hash()
기능(또는 PHP 5.3.7+용 이 버전: https://github.com/ircmaxell/password_compat) ?
$options = array("cost" => 10, "salt" => uniqid());
$hash = password_hash($password, PASSWORD_BCRYPT, $options);
그럼 난 이렇게 하겠죠.
mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options['salt']);
데이터베이스에 삽입합니다.
그런 다음 확인합니다.
$row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid"));
$salt = $row["salt"];
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt));
if (password_verify($password, $hash) {
// Verified
}
데이터베이스 문에 대한 문제는 일단 무시하고, 다음과 관련된 질문에 답하겠습니다.password_hash
.
간단히 말해서, 아니, 그건 당신이 하는 방법이 아닙니다.salt만 저장하지 않으려면 해시와 salt를 모두 저장한 다음 둘 다를 사용하여 암호를 확인해야 합니다.password_hash
둘 다 포함된 문자열을 반환합니다.
password_hash
function은 해시와 salt를 모두 포함하는 문자열을 반환합니다.그래서:
$hashAndSalt = password_hash($password, PASSWORD_BCRYPT);
// Insert $hashAndSalt into database against user
그런 다음 확인합니다.
// Fetch hash+salt from database, place in $hashAndSalt variable
// and then to verify $password:
if (password_verify($password, $hashAndSalt)) {
// Verified
}
또한, 댓글에서 알 수 있듯이 보안에 관심이 있는 경우 확인해 볼 수 있습니다.mysqli
(ext/mysql
PHP5.5)에서 더 이상 사용되지 않습니다. 또한 SQL 주입에 대한 이 기사: http://php.net/manual/en/security.database.sql-injection.php
자신의 소금을 사용하는 것은 권장되지 않으며 PHP 7에서는 사용이 권장되지 않습니다.그 이유를 이해하기 위해, 저자는password_hash
이러한 생각을 공유함 (link function)
한가지 확실한 것은 소금 선택이 위험하다는 것입니다.솔트 옵션을 제대로 사용한 적은 아직 한 번도 없습니다.모든 사용법은 불량(mt_rand() 출력 전달)에서 위험(정적 문자열 전달), 미친(암호를 자신의 솔트로 전달)에 이르기까지 다양합니다.
저는 사용자가 소금을 명시하는 것을 허용해서는 안 된다고 생각합니다.
그는 심지어 SO 채팅에서 자신의 소금을 전달하는 것이 얼마나 나쁜지에 대해 언급했습니다.
이 내용은 php.net 에서 확인할 수 있습니다.
경고문
솔트 옵션은 PHP 7.0.0에서 더 이상 사용되지 않습니다.이제는 단순히 기본적으로 생성된 소금을 사용하는 것이 선호됩니다.
결론?소금 옵션은 잊어버려요.
이 정도면 충분합니다.password_hash('password', PASSWORD_DEFAULT)
)*는_BCRYPT)
자신의 소금을 입력해서는 안 되며, 소금을 비워 두면 함수가 좋은 임의의 소금을 생성할 수 있습니다.
함수에 의해 반환되는 문자열 전체를 데이터베이스(또는 파일 또는 사용자가 사용하는 모든 것)에 삽입합니다.알고리즘의 id, 비용, salt(22문자) 및 해시 암호를 포함합니다.
password_verify()를 사용하려면 전체 문자열이 필요합니다.소금은 무작위이며 잘못된 손에 넘어가도 해가 되지 않습니다(해시된 비밀번호로).이렇게 하면 준비된 집합에서 생성된 암호 및 해시 목록(무지개 테이블)을 사용할 수 없습니다.
추가 비용 파라미터를 고려해야 합니다.기본값(누락된 경우)은 10입니다. 더 높으면 함수 계산 해시가 더 깁니다.해시 생성에 소요되는 비용을 1, 2배 증가(따라서 암호 해독에 소요되는 시간이 늘어남)
$hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10));
이 파라미터는 서버의 속도 검사를 기반으로 설정해야 합니다.기능은 100ms+를 수행하는 것이 좋습니다(일부는 250ms로 하는 것을 선호함).일반적으로 비용은 = 10 또는 11이 좋습니다(2015년).
보안을 강화하기 위해 password_hash() 또는 password_verify()를 사용하기 전에 긴(50-60자가 좋은 선택) 비밀 문자열을 암호에 추가할 수 있습니다.
$secret_string = 'asCaahC72D2bywdu@#$@#$234';
$password = trim($_POST['user_password']) . $secret_string;
// here use password_* function
주의 algo 매개 변수에 PASWER_BCRYPT를 사용하면 암호 매개 변수가 최대 72자로 잘립니다.
$password가 72자보다 길고 73자 또는 90자를 변경하거나 추가하는 경우 해시는 변경되지 않습니다.선택적으로 $secret_string 고정은 (이전이 아닌 사용자 비밀번호 뒤에) 끝에 있어야 합니다.
언급URL : https://stackoverflow.com/questions/14992367/using-php-5-5s-password-hash-and-password-verify-function
'code' 카테고리의 다른 글
CoreData와 REST 웹 서비스를 비동기적으로 동기화하면서 동시에 REST 오류를 UI에 적절하게 전파하는 방법 (0) | 2023.10.25 |
---|---|
부트스트랩 4: 드롭다운 메뉴가 화면 오른쪽으로 꺼집니다. (0) | 2023.10.25 |
jQuery 상위 양식 찾기 (0) | 2023.10.25 |
Woocommerce에서 특정 텍스트 변경 또는 번역 (0) | 2023.10.25 |
증분 피연산자로 l 값이 필요 (0) | 2023.10.20 |