2008-08-03 3 views
27

비밀번호를 암호화하는 가장 빠르고 안전한 방법 (PHP 기본 설정)은 무엇이며 어떤 방법으로 이식 할 수 있습니까?비밀번호 암호화

다른 말로하면 나중에 내 웹 사이트를 다른 서버로 마이그레이션해도 암호가 계속 작동합니까?

내가 지금 말씀 드린대로 사용하는 방법은 서버에 설치된 라이브러리의 정확한 버전에 따라 다릅니다.

답변

29

로그인 시스템에 대한 암호화 방법을 선택한 다음 속도가 친구가 아닌 경우 Jeff는 Thomas Ptacek과 비밀번호에 대해 의견을 나누었으며 conclusion은 가장 느리고 안전한 암호화 방법을 사용해야한다는 것이 었습니다 당신은 감당할 수 있습니다. 토마스 Ptacek의 블로그에서

:
속도는 암호 해시 함수에 싶지 않아 정확히이다.

최신 암호 체계는 증분 암호 크래커를 사용하여 공격을받습니다.

증분 크래커는 가능한 모든 금이 간 암호를 사전에 계산하지 않습니다. 그들은 각 암호 해시를 개별적으로 고려하고 PHP 로그인 페이지와 동일한 방식으로 암호 해시 함수를 통해 사전을 제공합니다. Ophcrack과 같은 레인보우 테이블 크래커는 암호를 공격하는 공간을 사용합니다. John the Ripper, Crack 및 LC5와 같은 증분 크래커는 통계와 계산 작업을 수행합니다.

비밀 번호 공격 게임은 비밀 번호 X를 해독하는 데 시간이 득점입니다. 무지개 테이블로, 그 시간은 당신의 테이블이 얼마나 커야하고 얼마나 빨리 검색 할 수 있는가에 달려 있습니다. 증분 크래커의 경우 시간은 암호 해시 기능을 실행할 수있는 속도에 따라 다릅니다.

암호 해시 함수를 더 잘 최적화할수록 암호 해시 함수가 빠를수록 스키마가 약합니다. MD5 및 SHA1은 DES와 같은 기존의 블록 암호조차도 빠르도록 설계되었습니다. MD5, SHA1 및 DES는 약한 암호 해시입니다. 최신 CPU의 경우 DES 및 MD5와 같은 원시 암호 작성 블록을 비트 라이 제이션, 벡터화 및 병렬화하여 암호 검색을 신속하게 수행 할 수 있습니다. 게임 오버 FPGA 구현은 수백 달러에 불과합니다.

14

나는 Peter와 함께있다. 개발자가 암호를 이해하지 못하는 것 같습니다. MD5 나 SHA1은 빠르기 때문에 우리는 모두 (그리고 나는 이것도 유죄입니다.) 그것에 대해 생각해 보라. (누군가가 최근에 나에게 그것을 지적했다.) 그것은 말이 안된다. 우리는 천천히 어색한 해시 알고리즘을 선택해야합니다. 내 생각에, 사물의 규모에 따라 바쁜 사이트는 암호를 해시 할 것입니까? 매 1/2 분? 0.8 초 대 0.03 초가 걸릴지 누가 걱정합니까? 그러나 모든 종류의 일반적인 무차별 공격을 막기 위해서는 너무 느리다.

필자의 글에서 bcrypt는 안전한 암호 해시를 위해 특별히 설계되었습니다. 그것은 복어를 기반으로하며 많은 구현이 있습니다.

PHP를 들어, 내가 반드시 빠른하지만 좋은 밸런스, 서버의 일부 찾는 게 아니에요 http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

2

을 확인 BCrypt.NET, 사람은 누구나 .NET를 들어 PHPPass http://www.openwall.com/phpass/

을 확인하는 이 코드는 개발 중입니다. 암호가 해시되고 저장되는 스크립트는 실행하는 데 5-6 초가 걸리고, 해시로 축소했습니다. 2 초).

그것은 가장 안전한 될 필요가 없습니다, 나는 (지금) 은행에 대한 codding 아니에요하지만 확실히 WILL 일반 텍스트로하지 저장 암호.

+0

아직 닫혀 있지만 가장 안전한 해시 암호가 있어야합니다. someeones 은행 계좌 암호를 얻는 가장 쉬운 방법은 무엇입니까? 사람들이 가입하도록 만드는 멋진 웹 사이트를 만드십시오. 대부분의 사람들은 기존 암호를 사용합니다. 이제 막대한 암호 목록이 있습니다. 요점은, 다른 사람의 암호를 얻는 가장 빠른 방법은 내가 잘못 구현했다는 것을 알고 있다면 시스템을 해킹하는 것입니다. –

8

암호를으로 암호화하지 않으려면 해시으로 지정해야합니다.

암호화 된 암호는 암호를 해독하여 암호를 볼 수 있습니다. 해싱은 일방향 조작이므로 사용자의 원래 암호는 (암호로) 사라집니다.

  • 256 SHA-그리고 당신은 사용자의 암호를 해시 할 때, 또한 해시하십시오 : 현재 승인 된 표준을 사용 - 당신이 선택해야으로하는 알고리즘

    다른 쓰레기에. 예 :

    • 비밀번호 : password1
    • 소금 : PasswordSaltDesignedForThisQuestion

    는 사용자의 암호에 소금을 추가 : 당신이 당신의 자신의 암호화 알고리즘을 작성하지 않는 무엇이든

    String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
    
+4

-1 SHA-256은 암호 해시 기능이 아니며이 용도로는 안전하지 않습니다. 그것은 * PBKDF2의 일부가 될 수 있지만 완전히 다른 것입니다. 또한 소금은 영리한 문구가 아니어야하므로 사용자가 오해의 소지가 있습니다.이 값은 임의의 (사용자 별) 값이어야합니다. –

7

. 이렇게하면 알고리즘에 크랙을 발생시키지 않는 결함이 있음을 거의 보장합니다 (암호화하지 않는 한).

+0

암호화 알고리즘을 사용하더라도 알고리즘에 '결함이있을 것입니다. 알고리즘이'대중적 '이되기까지 수년간의 검토가 필요합니다. –

+1

이것은 사실입니다. 그리고 나에게 Don Knuth와 비슷한 일화를 일깨워줍니다. 오래전에 그는 난수 생성기를 작성하고 생각할 수있는 것처럼 많은 모호한 연산으로 쌓여있었습니다. 마침내 그는이 기념비적 인 창조물을 돌렸고 숫자 4를 무기한 출력했다. (세부 정보는 변경 될 수 있습니다.) – ndkrempel

2

bcrypt을 사용하는 것은 laravel과 같은 많은 현대 프레임 워크에서 사용됩니다.