2011-01-25 6 views
4

'portable_hashes'가 켜져 있습니다. 어떤 이유로 든 생성하는 해시가 항상 동일하지는 않지만 'CheckPassword'를 통과 할 때 항상 유효한 것으로 반환됩니다. 나는 또한 'PHP_VERSION'이 해시 생성에 사용된다는 사실을 알아 냈습니다.이 두 가지를 합치면 걱정이됩니다 ... 어떻게 이식성이 있습니까? 서버, 리눅스, 윈도우, 64 비트, 32 비트 등에서 해시 (사용자 데이터베이스에 저장 됨)를 이동하고 유효성을 검사 할 수 있습니까? 암호를 더 이상 유효하지 않게하려면 어떻게해야합니까?여러 서버간에 phpass를 사용하는 것이 얼마나 안전합니까?

내가 물어 보는 이유는 내 사이트에서 몇 가지 사용자가 수천 명이 넘는 여러 사이트에 전원을 공급하는 암호 용 phpass를 사용하고 있기 때문입니다. 이동해야하는 경우가있었습니다 다른 서버에, 그리고 물론 PHP를 업그레이 드하십시오. 나는 또한 lighthttpd 또는 이와 비슷한 것으로 Apache 중 하나 또는 두 개를 전환 할 수 있습니다. 말할 것도없이 나는 편집증에 걸리면 언젠가는 지원 악몽을 꾼다. 그리고 나는 모든 사람에게 새로운 암호를 이메일로 보내기보다는 다른 방법으로 그것을 고칠 수 없을 것이다.

비밀번호가 무효화 될 가능성이 조금이라도있는 경우 - 내 비밀번호 해시 생성기를 만들기 위해 어떤 단계를 밟아야합니까? 나는 이미 16 바이트 무작위 소금 (Per-user)을 사용하고 있으며, 다른 문제는 늘리지 않고있다. 내가 PHP_VERSION으로 볼 수

답변

8

PHP 버전에 따라 휴대용 해시가 필요하지 않습니다. PHP 5.3 이상에서 PHP는 시스템에서 사용할 수없는 경우 자체 bcrypt 구현을 제공합니다. 모든 서버에 PHP 5.3 이상이있는 경우 휴대용 해시를 해제하는 것이 좋습니다. PHPass "portables hashes"는 PHP가 설치된 버전에 따라 bcrypt를 사용할 수 없기 때문에 존재합니다.

즉, PHPass 휴대용 해시는 해시에 소금을 저장합니다. 그래서 같은 암호를 사용하는 모든 실행이 다릅니다.

또한 PHPass은 버전 가능한 md5() 함수 $rawMode 매개 변수를 지원하는지 * 확인할 그 해시의 발생시 PHP_VERSION를 이용한다. 그렇지 않은 경우 pack()은 16 진수 데이터를 2 진수로 변환하는 데 사용됩니다 (이 작업은 분기가 이루어진 이유 인 $rawMode을 사용하면 상당히 느립니다.).

다시 말해, 모든 서버가 PHP 5.3 이상을 실행하는 경우 휴대용 모드를 해제하고 PHPass가 bcrypt을 사용하도록 강력히 권장합니다. PHP 5.3+가 시스템을 사용할 수 없을 때 자체 구현을 제공하기 때문에 해시는 OS마다 검사 할 수 있습니다. 휴대용 모드를 끄더라도, PHPass는 오래된 해시를 적절한 방법으로 검사 할만큼 똑똑 할 것입니다.

저는 여러 사이트에서 내 프레임 워크에서 PHPass를 사용하는 것과 같은 상황이었습니다. 휴대용 모드를 사용하지 않으므로 로그인 할 때 bcrypt를 사용하지 않는 비밀번호를 점진적으로 다시 해시하도록 로그인 스크립트를 설정했습니다.

* 131


EDIT 자세한 설명은 여기에 휴대용 모드 해시가 생성되는 방법이다 (단순화 PHPass 검색된 실제 변수를 사용할 수 있지만, 정확하지 않음). PHPass는 자체 버전의 base64 인코딩을 사용합니다.

$final = '$P$'

  • $final .= encode64_int($rounds)

    1. $final .= genSalt() (염 6 바이트 ... 8 바이트 "encode64"포맷 (생성자에서 최소 3 다른 PHP 5+ 5이다)).

      :

    2. $hash = md5($salt . $password)

    3. 2$rounds 번, 그래서 최종 해시가 기본적으로 이것이다 $hash = md5($hash . $password)

    4. $final = encode64($hash)

  • +0

    좋아, 많이 지워 버렸지 만, 내가 너 한테 뭔가를 돌리도록해라. 지금은 내 개인 테스트 머신 (Win7, WAMP)에서 PHP 5.3.3을 실행하고, 대부분의 서버가 CentOS를 cPanel로 실행 중이다. 그들은 모두 5.2.x이지만, 다시 한번 그들은 CentOS입니다. 이것을 알면 - 휴대용이 아닌 모드에서 단독으로 실행해도 괜찮습니까? 지금 나는 테스트 머신과 서버 사이에서 전체 데이터베이스를왔다 갔다하므로 내 CentOS php 5.2.x 머신에서 일부 해시가 생성되고 다른 것은 Win7 PHP 5.3.3 머신에서 생성됩니다.결국 공유 호스트에서 테스트 할 수도 있습니다. 그 때 무엇입니까? – Jon

    +0

    @ 존 : 정확히 동일한 설정 (서버의 CentOS 5.2, dev의 Win7). 상수'CRYPT_BLOWFISH == 1' ** 또는 ** PHP 버전이 5.3 이상이면 괜찮습니다. CentOS PHP 5.2.x 서버 ('var_dump (CRYPT_BLOWFISH)')에서'CRYPT_BLOWFISH'를 확인하십시오. 결과가'1'이면 황금입니다. 한 컴퓨터에서 bcrypt를 사용하여 생성 된 해시 또는 다른 해시는 동일합니다 ... 문제는 bcrypt를 사용할 수없는 경우입니다. –

    +0

    개인적으로 WHM의 EasyApache를 사용하여 PHP 버전을 업그레이드하십시오. –

    1

    만 사용이 줄 수 있습니다 : 지금

    $output .= $this->itoa64[min($this->iteration_count_log2 + 
        ((PHP_VERSION >= '5') ? 5 : 3), 30)]; 
    

    모든 그 반복의 최대 수를 결정하는 말하는. 소금을 생성하는 방법은 gensalt_private입니다. 따라서 이것은 새로운 암호를 저장하고 소금을 생성 할 때에 만 발생합니다. 따라서 이전에 생성 된 모든 소금은 100 % 휴대 가능합니다. 그래서 전혀 이식성 문제가 없습니다 ...

    나머지는 php (5.0+)의 최신 버전을 사용하는 한 다음과 같은 휴대 성 문제가 없어야합니다. 모두 내가 말할 수있는 한 (hash 함수가 내장되어 있기 때문에) ...

    +0

    감사합니다. 소금은 아무 것도 저장되지 않습니다. 내 이해에서 해시가 될 때마다 설정에 따라 염을 생성하거나 기존 해시를 확인합니다. 나는 결과물 인 해시가 아닌 다른 것을 phpass에서 저장하지 않는다는 것을 안다 - 나의 소금은 내 자신의 창조물이다. 버전을 전환하는 데 문제가 있습니까? PHP 4가 설치된 서버에서와 마찬가지로 5로 업그레이드되었습니다. 또는 해시가 일치하지 않게하는 다른 문제가 있습니다. - 암호를 실행할 때마다 동일한 암호에 대해 새 해시를 생성하는 방법은 무엇입니까? 그 부분도 정말 저를 괴롭 힙니다. – Jon

    +0

    @ 존 해시 된 암호 안에 소금을 저장하지 않았습니까? deliminator 또는 그것을 저장하는 출력 섹션이 있습니까? 일반적으로 Kohana에 제출 한 것과 같은 사용자 지정 메서드를 사용합니다. [패치 파일] (http://dev.kohanaframework.org/attachments/1495/kohana_security_patch.patch). 변경하고자하는 유일한 것은 기본 해쉬 메소드와'makeSaltedHash'의 라운드 수를 20에서 500 (또는 더 높은 수)까지입니다 ... – ircmaxell

    +0

    그 것처럼 보이지 않습니다. 그러나 앞쪽 $ P $ ...하지만 그게 전부입니다. – Jon

    관련 문제