2014-07-15 7 views
0

현재 PHP crypt()에서 문제가 발생한 준비 환경을 설정 중입니다. 동일한 데이터를 가진 같은 코드를 동일한 환경에 배포했습니다 (우분투 14.04, 아파치 2.2.25, PHP 5.4.17, MySQL 5.6.11, 모든 것이 동일한 설정 스크립트에 의해 설정 됨). 로그인 할 수 없었습니다. 우리 플랫폼에 암호는 다음과 같이 crypt()를 사용하여 해시했다 :crypt() : 동일한 PHP 환경에도 불구하고 다른 서버에서 다른 동작이 발생했습니다.

$saltedPassword = $userSalt . $userInput . $systemSalt; 
$randomSalt = someFunctionWithMtRandOutputting22Chars(); 
$hash = crypt($saltedPassword, '$2y$15$' . $randomSalt); 
$userDao->storePassword($hash); 

$userSalt가 프론트 엔드에서 전송 된 실제 암호 IST 상수 (자신의 ID와 같은) 사용자와 공동 날짜, $userInput입니다. 해시의 예는 $2y$15$X8ozNErDV1SU1wdTdAW7JOg/eYt4C7okLB0.9pR9HkM.fqtj7/H.e입니다.

로그인하려면, 포털이 코드를 사용

$hash = $userDao->getPassword(); 
$saltedPassword = $userSalt . $userInput . $systemSalt; 
$authorized = (crypt($saltedPassword, $hash) === $encryptedPassword); 
// if $authorized === true, login 

이 코드는 5 개 가지 기계 (생산 및 개발)에 완벽하게 잘 작동합니다. 스테이지 환경에서 동일한 코드를 사용하는 경우 두 번째 crypt() 호출은 다른 결과를 반환합니다.이 경우 $2y$15$X8ozNErDV1SU1wdTdAW7JOsxs7kdiTp3Bp0QuuOUcYs6zXkaq6dgq입니다. 암호의 소금 부분이 동일하지만 (정확한 알고리즘이 선택되었음을 나타냄), 두 번째 부분은 저장된 해시와 다릅니다.

모든 시스템에서 알려진 상수 (CRYPT_SALT_LENGTHCRYPT_BLOWFISH)를 테스트했으며 모든 값이 동일했습니다. 명령 줄에서 코드를 테스트했는데 모든 시스템에서 동일한 해시가 반환되었지만 놀랍게도 데이터베이스에 저장된 것은 아니지만 "잘못된"것입니다. 이것이 잘못된 구성에 대한 힌트일까요?

기존의 작업 환경과 새로운 오류 발생 단계 환경의 유일한 알려진 차이점은 무대 환경이 테스트 서버에서 chroot 환경으로 설정된다는 것입니다. 이 차이가 내 문제의 원인이 될 수 있습니까?

답변

0

문제가 있음 : 내 가정, 무대 환경의 데이터가 동일하다는 것이 잘못되었습니다. 일부 테스트 데이터를 크롤링 한 후 $userSalt이 다른 시스템과 구조적으로 다르다는 것을 알았습니다. 이는 데이터베이스 설치 루틴의 오류를 나타냅니다.