면책 조항 :이 답변은 2008 년에 작성되었습니다.
그 이후로, PHP는 우리에게 주신 password_hash
하고 password_verify
자신의 도입 이후, 그들은 권장 암호 해싱 및 확인 방법, 그리고.
대답의 이론은 여전히 잘 읽습니다.
TL; DR
하지마
- 사용자가 비밀번호로 입력 할 수있는 문자를 제한하지 마십시오. 바보 만이 일을합니다.
- 비밀번호 길이를 제한하지 마십시오. 사용자가 supercalifragilisticexpialidocious가 포함 된 문장을 원한다면 사용하지 마십시오.
- 비밀번호에서 HTML 및 특수 문자를 제거하거나 이스케이프 처리하지 마십시오.
- 사용자의 비밀번호를 일반 텍스트로 저장하지 마십시오.
- 비밀번호를 분실 한 경우를 제외하고 사용자에게 비밀번호를 이메일로 보내지 말고 임시 비밀번호를 보냈습니다.
- 절대 어떤 식 으로든 비밀번호를 기록하지 마십시오.
- SHA1 또는 MD5 또는 심지어 SHA256으로 비밀번호를 해시하지 마십시오 ! 현대 크래커 는 각각 60-180 억 해시를 초과 할 수 있습니다 (각각).
- bcrypt와 hash () 의 원시 출력을 혼합하지 마십시오 . 16 진수 출력 또는 base64_encode를 사용하십시오. (이는 불량을 일으킬 수있는 모든 입력에 적용되며
\0
보안을 심각하게 약화시킬 수 있습니다.)
도스
- 가능하면 scrypt를 사용하십시오. 당신이 할 수 없다면 bcrypt.
- SHA2 해시와 함께 bcrypt 또는 scrypt를 사용할 수없는 경우 PBKDF2를 사용하십시오.
- 데이터베이스가 손상되면 모든 사람의 비밀번호를 재설정하십시오.
- 8 ~ 10 자 이상의 적절한 길이를 구현하고 대문자 1 자, 소문자 1 자, 숫자 및 기호가 필요합니다. 암호의 엔트로피가 향상되어 암호 해독이 어려워집니다. (일부 토론에 대해서는 "비밀번호를 만드는 방법은 무엇입니까?"섹션을 참조하십시오.)
어쨌든 암호를 해시해야하는 이유는 무엇입니까?
암호 해싱의 목표는 간단합니다. 데이터베이스를 손상시켜 사용자 계정에 악의적으로 액세스하는 것을 방지합니다. 따라서 암호 해싱의 목표는 일반 텍스트 암호를 계산하기 위해 너무 많은 시간이나 비용을 들여 해커 나 크래커를 막는 것입니다. 그리고 시간 / 비용은 당신의 무기고에서 최고의 억제력입니다.
사용자 계정에서 강력하고 강력한 해시를 원하는 또 다른 이유는 시스템의 모든 암호를 변경할 수있는 충분한 시간을 제공하기 위해서입니다. 데이터베이스가 손상 될 경우에에 당신은 충분한 시간이 필요합니다 이상 시스템 다운을 잠글 데이터베이스의 모든 암호를 변경하지 않을 경우.
Whitehat Security의 CTO 인 Jeremiah Grossman 은 최근 비밀번호 복구 후 비밀번호 보호를 무차별 적으로 차단해야하는 White Hat Security 블로그에 다음 과 같이 언급했습니다 .
흥미롭게도,이 악몽을 극복하면서 암호 해독, 저장 및 복잡성에 대해 몰랐던 많은 것을 배웠습니다. 비밀번호 저장이 비밀번호 복잡성보다 훨씬 중요한 이유에 대해 알게되었습니다. 암호가 어떻게 저장되는지 모르는 경우 복잡 할 수 있습니다. 이것은 암호 및 암호 전문가에게는 일반적인 지식 일 수 있지만 일반적인 InfoSec 또는 웹 보안 전문가에게는 의심의 여지가 있습니다.
(엠파 시스 광산)
어쨌든 좋은 암호 는 무엇입니까 ?
엔트로피 . (난 랜달의 관점에 전적으로 동의하지는 않는다.)
간단히 말해서, 엔트로피는 암호 내에 얼마나 많은 변화가 있는지입니다. 암호가 소문자 로마자이면 26 자입니다. 큰 차이는 없습니다. 영숫자 암호는 36 자로 더 좋습니다. 그러나 기호와 함께 대소 문자를 허용하는 것은 대략 96 자입니다. 그것은 편지보다 훨씬 낫습니다. 한 가지 문제는 암호를 기억하기 쉽게하기 위해 엔트로피를 줄이는 패턴을 삽입하는 것입니다. 죄송합니다!
암호 엔트로피는 쉽게 근사 됩니다. 전체 범위의 ASCII 문자 (대략 96 자 입력 가능 문자)를 사용하면 문자 당 6.6의 엔트로피가 생성되며 암호의 경우 8 자에서 미래 보안을 위해 여전히 너무 낮습니다 (52.679 비트의 엔트로피). 그러나 좋은 소식은 더 긴 암호와 유니 코드 문자가있는 암호는 실제로 암호의 엔트로피를 높이고 해독하기가 더 어렵다는 것입니다.
Crypto StackExchange 사이트 에서 암호 엔트로피에 대한 자세한 설명이 있습니다. 좋은 Google 검색은 많은 결과를 낳습니다.
코멘트에서 나는 지적 @popnoodles와 이야기를 시행 X 많은 문자, 숫자, 기호 등으로 X 길이의 암호 정책을 실제로 암호 방식은 예측하여 엔트로피를 감소시킬 수있다. 동의합니다. Randomess는 가능한 한 무작위로 항상 가장 안전하지만 가장 기억에 남는 솔루션입니다.
내가 알 수있는 한 세계 최고의 암호를 만드는 것은 Catch-22입니다. 기억하기 어렵고, 예측 가능하고, 짧고, 너무 많은 유니 코드 문자 (Windows / 모바일 장치에서 입력하기 어렵다), 너무 길다. 암호는 실제 용도에 충분하지 않으므로 암호를 보호해야합니다. 포트 녹스에있었습니다.
모범 사례
Bcrypt와 Scrypt 는 현재 모범 사례입니다. Scrypt 는 시간에 비해 bcrypt보다 낫지 만 Linux / Unix 또는 웹 서버에서 표준으로 채택하지 않았으며 아직 알고리즘에 대한 심층적 인 검토를하지 않았습니다. 그러나 여전히 알고리즘의 미래는 유망 해 보입니다. Ruby로 작업 하는 경우 도움 이되는 scrypt gem 이 있으며 Node.js에는 자체 scrypt 패키지가 있습니다. Scrypt 확장 또는 Libsodium 확장을 통해 PHP에서 Scrypt를 사용할 수 있습니다 (둘 다 PECL에서 사용 가능).
bcrypt를 사용하는 방법을 이해하거나 좋은 래퍼를 찾거나 더 레거시 구현을 위해 PHPASS 와 같은 것을 사용 하려면 crypt 함수에 대한 설명서를 읽는 것이 좋습니다 . 15 ~ 18이 아닌 경우 최소 12 라운드의 bcrypt를 권장합니다.
나는 bcrypt가 가변 비용 메커니즘으로 복어의 주요 일정 만 사용한다는 것을 알았을 때 bcrypt 사용에 대한 마음을 바꿨습니다. 후자는 복어의 이미 비싼 키 일정을 늘려 암호를 무차별 처리하는 비용을 증가시킵니다.
평균 관행
나는 더 이상이 상황을 거의 상상할 수 없다. PHPASS 는 PHP 3.0.18부터 5.3까지 지원하므로 상상할 수있는 거의 모든 설치에서 사용할 수 있으며 환경에서 bcrypt를 지원하는지 확실 하지 않은 경우 사용해야합니다 .
그러나 bcrypt 또는 PHPASS를 전혀 사용할 수 없다고 가정하십시오. 그럼 뭐야?
환경 / 응용 프로그램 / 사용자 인식이 허용 할 수있는 최대 라운드 수로 PDKBF2 를 구현해보십시오 . 내가 추천하는 가장 낮은 숫자는 2500 라운드입니다. 또한 조작을 재현하기 어렵게 만들 수있는 경우 hash_hmac () 를 사용해야 합니다.
미래의 관행
PHP 5.5는 완전한 암호 보호 라이브러리 로, bcrypt 작업시 발생하는 고통을 추상화합니다. @ircmaxell은 대부분의 일반적인 환경, 특히 공유 호스트에서 PHP 5.2 및 5.3을 사용하고 있지만 @ircmaxell은 PHP 5.3.7과 호환되는 향후 API에 대한 호환성 계층 을 구축했습니다 .
암호화 요약 및 면책
실제로 해시 된 암호를 해독 하는 데 필요한 계산 능력 이 없습니다. 컴퓨터가 암호를 "크래킹"하는 유일한 방법은 암호를 다시 작성하고 보안에 사용되는 해싱 알고리즘을 시뮬레이션하는 것입니다. 해시의 속도는 무차별 강제 기능과 선형으로 관련됩니다. 더 나쁜 것은 여전히 대부분의 해시 알고리즘을 쉽게 병렬화하여 더 빠르게 수행 할 수 있다는 것입니다. 이것이 bcrypt 및 scrypt와 같은 비용이 많이 드는 구성표가 중요한 이유입니다.
당신이 당신의 사용자를 보호하기 위해 최선의 노력을해야합니다 있도록 가능한 모든 공격 위협이나 도로를 예견 할 수없고 앞까지를 . 당신이 경우에, 당신도 너무 늦기 때까지 공격 한 사실을 그리워 ... 수 당신에게있는 거 책임을지지하고 . 그러한 상황을 피하려면 먼저 편집증을 행동하십시오. 자신의 소프트웨어를 내부적으로 공격하고 사용자 자격 증명을 도용하거나 다른 사용자의 계정을 수정하거나 데이터에 액세스하십시오. 시스템의 보안을 테스트하지 않으면 자신 외에 다른 사람을 비난 할 수 없습니다.
마지막으로 : 나는 암호 전문가가 아닙니다. 내가 말한 것은 내 의견이지만, 그것이 좋은 상식과 많은 독서에 근거한다고 생각합니다. 가능한 한 편집증을 가지고 가능한 한 침입을 어렵게하고, 그래도 걱정이된다면 화이트 햇 해커 나 암호 전문가에게 연락하여 코드 / 시스템에 대한 의견을 확인하십시오.