그렇다면 bcrypt를 사용하고 싶습니까? 대박! 그러나 다른 암호화 영역과 마찬가지로 직접 암호화해서는 안됩니다. 키 관리, 소금 저장 또는 임의의 숫자 생성과 같은 것에 대해 걱정이 필요하면 잘못하고 있습니다.
그 이유는 간단합니다. bcrypt를 망가 뜨리는 것은 매우 쉽습니다 . 실제로이 페이지의 거의 모든 코드를 살펴보면 이러한 일반적인 문제 중 하나 이상을 위반하고 있음을 알 수 있습니다.
Face It, 암호화는 어렵다.
전문가에게 맡기십시오. 이 라이브러리를 유지 관리하는 것이 직업인 사람들에게 맡기십시오. 결정을 내려야한다면 잘못하고있는 것입니다.
대신 라이브러리를 사용하십시오. 요구 사항에 따라 몇 가지가 있습니다.
도서관
다음은 더 일반적인 API 중 일부입니다.
PHP 5.5 API-(5.3.7 이상에서 사용 가능)
PHP 5.5부터는 해싱 비밀번호를위한 새로운 API가 도입되었습니다. 5.3.7 이상을 위해 유지되는 shim 호환성 라이브러리도 있습니다. 이 피어 검토되는 이점이있다 간단한 사용으로 구현합니다.
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
실제로, 그것은 매우 간단한 것을 목표로합니다.
자원:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
이것은 PHP 5.5와 비슷한 또 다른 API이며 비슷한 목적을 수행합니다.
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
자원:
PasswordLib
이것은 암호 해싱에 대한 약간 다른 접근 방식입니다. PasswordLib은 단순히 bcrypt를 지원하지 않고 많은 수의 해싱 알고리즘을 지원합니다. 주로 제어 범위를 벗어난 레거시 및 이기종 시스템과의 호환성을 지원해야하는 상황에서 유용합니다. 많은 수의 해싱 알고리즘을 지원합니다. 그리고 5.3.2 이상을 지원합니다
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
참고 문헌 :
PHPASS
이것은 bcrypt를 지원하는 레이어이지만 PHP> = 5.3.2에 액세스 할 수없는 경우에 유용한 상당히 강력한 알고리즘을 지원합니다 ... 실제로는 PHP 3.0 이상을 지원합니다 (bcrypt는 아니지만).
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
자원
참고 : openwall에서 호스팅되지 않는 PHPASS 대안을 사용하지 마십시오 . 다른 프로젝트입니다 !!!
BCrypt 소개
알다시피, 이러한 라이브러리는 모두 단일 문자열을 반환합니다. BCrypt가 내부적으로 작동하는 방식 때문입니다. 그리고 그것에 대한 많은 대답이 있습니다. 여기에 내가 작성하고 복사 / 붙여 넣지 않고 링크하는 선택이 있습니다.
마무리
많은 다른 선택이 있습니다. 당신이 선택한 것은 당신에게 달려 있습니다. 그러나, 나는 것이다 높게 당신이 당신을 위해 이것을 처리하기위한 위의 라이브러리 중 하나를 사용하는 것이 좋습니다.
다시 말하지만, crypt()
직접 사용 하는 경우 무언가 잘못되었을 수 있습니다. 코드가 hash()
(또는 md5()
또는 sha1()
) 직접 사용하는 경우 거의 확실하게 잘못된 일을하고있는 것입니다.
라이브러리를 사용하십시오 ...