2014-07-17 6 views
5
I이 같은 복어 염, 암호 해시 토굴()를 사용

[A-ZA에PHP 토굴() 복어 염 길이 역 호환

$ 2A $으로 2 자리수 $ 21 개 문자 -Z0-9]

여기서 세 번째 $가 21이 아닌 22 번째 문자를 쓰는 실수를했습니다. 그러나 오류가 발생하지 않았으므로 오류가 발생하지 않았습니다.

그것은 내 바탕 화면에서 실행되는 Windows 및 PHP 5.4.4와 AWS ec2에서 PHP가 5.3.x 인 아마존 리눅스를 실행하는데 너무 짧은 소금을 사용합니다.

어느 날 AWS php를 5.5.14로 업데이트했습니다. 문제가 발생했습니다. crypt()는 항상 * 0을 반환합니다.

일부 시도 후에 소금 끝에 $를 추가하여 22 자로되었습니다. 그리고 다시 작동하여 이전과 같은 해시 문자열을 반환합니다. 복어 규칙에 복종하지 않지만 문자는 [./a-zA-Z0-9]

하지만 이제는이 사이트를 PHP 5.5.14로 openSuSE 13.1을 실행하는 다른 컴퓨터에 복제합니다.이 소금은 실패했습니다. 다시.

PHP를 5.4.20으로 다운 그레이드하지만 도움은되지 않습니다.

새 사이트에는 이전 데이터베이스가 필요하므로 암호 해시 작업을해야합니다.

이 복어 염 길이 오류 호환성 문제에 영향을주는 라이브러리 또는 모듈은 무엇입니까? Tt는 PHP 버전이 아닌 것 같습니다. AWS 5.5.14

또 다른 마법의 숯이 저를 구할 수 있습니까? 나는 각 꼬리표를 [./a-zA-Z0-9]로 대체하려고했지만 행운은 없다. 해시 문자열은 다르다. ...

+0

직접 소금을 생성하는 대신 PHP의 [해싱 함수] (http://php.net/manual/en/function.password-hash.php)를 사용하지 않는 이유는 무엇입니까? – PeeHaa

+0

기존 시스템이 여전히 작동해야합니다. –

+0

"하지만 이제는 openSuSE 13.1에서 PHP 5.5.14로 다른 사이트를 구축했습니다.이 소금은 다시 실패했습니다."- 거기에 맞는 도구를 사용할 수없는 이유는 전혀 없습니다. – PeeHaa

답변

2

처음에는 새로운 기능 password_hash()password_verify()을 사용하여 새 해시를 생성하고 확인하십시오. 물론 이것은 오래된 해시에 대한 실제 문제를 해결하지 못하지만 오래된 것으로 표시하는 것이 좋습니다. 그러면 다음에 사용자가 로그인 할 때 업데이트 할 수 있습니다.

이 오래된 해시의 경우 i 유효 마지막 문자 22로 소금을 생성하려고합니다. 암호 기능은 실제로 문자 22의 비트 (128 대신에 126 비트)만을 사용합니다. 따라서 마지막 문자 22의 그룹은 동일한 해시 값으로 끝납니다. 당신은 문자 (22) 모든 관련 문자 [.Oeu]을하려고하면

는 기회가 하나 개의 조합이 유효하지 않은 소금 같은 결과를 생성하는 것이 좋다,이 질문에 Why does crypt/blowfish generate the same hash...

에 대한 답변을 참조하십시오.

편집 :

사용 된 소금은 암호 해시의 일부가 있기 때문에, 문자 22 (세 번째 $ 후 22 문자)로 사용 된 것을 볼 수 있어야합니다.

+0

행운. 나는 허용되는 모든 문자를 시도했다. Btw 해시의 소금 부분은 21자를 포함합니다. 22 번째 숯은 올바른 22 번째 소금이 아닙니다 ... –

+0

@JackyJou - 소금에 21 개의 숯이 들어 있다는 것을 어떻게 압니까? crypt 함수는 '$'에서 일부 비트를 가져 왔거나 패딩했을 수 있습니다. 암호를 알고 있지만 사용자가 사용하지 않는 해시를 표시 할 수 있습니까? – martinstoeckli

+0

해시가 '$ 2a $ 13 $ xxxxxB9EUUAe7wKKdye36'이고 처음에 작동합니다. AWS php 5.3.x 및 내 Windows 5.4.4 –

1

마지막 문자로 (다시) '$'를 사용하면 인 경우으로 PHP 5.4로 다운 그레이드해야합니다.

그러나 이것은 장기적인 해결책이 아닙니다.마지막 문자로 '$'를 사용하면 모든 Base64 문자가 유효하지 않으므로 (정규 또는 bcrypt와 호환되는 Base64와 상관없이) 모든 암호가 호환되지 않습니다.

PHP 5.4를 사용할 수있는 한 공식적으로 PHP 5.4가 지원되는 한 이전의 모든 암호를 사용할 때마다 다시 해시해야합니다. PHP 5.4 지원이 중단 된 후에는 이전 해시 스키마를 유지하고 전자 메일로 보내는 사용자에게 새로운 임의 암호를 생성 할 수 밖에 없습니다.

업데이트 된 비밀번호로 password-compat package을 사용하는 것이 좋습니다. PHP 5.5 이상에서만 사용할 수있는 password_*() 함수를 제공합니다. 패키지 작성자는 PHP 자체에서 함수를 구현 한 사람과 동일하므로 5.5 이상으로 업그레이드 할 때 이전 버전과의 호환성을 제공하여 안전하고 100 % 호환되는지 확인할 수 있습니다.

+0

'$'는 PHP 5.4 또는 5.5를 지원하는 openSuSE 13.1에서 작동하지 않지만 PHP 5.5 인 AWS ec2에서 작동합니다 .... 나는 너무 혼란 스럽습니다 ... –

+0

음 ... 음, 'crypt)'는 운영 체제의 기본 API에 의존하기 때문에 기술적으로 PHP 5.5를 사용하면 Blowfish 가용성을 보장하지 못합니다. 나는 PHP 5.5 설치에서 '$'를 어떻게 사용하는지 알지 못한다. 나는 이것에 대해 당혹 스럽다. – Narf