형식 기반 웹 사이트 인증에 대한 확실한 가이드 [폐쇄]


질문

 

사회자 참고 : 이 질문은 현재 스택 오버플로를 위해 적용되는 대기 규칙을 사용하여 질문 및 응답 형식에 대한 좋은 적합하지 않습니다.우리는 일반적으로 콘텐츠가 여전히 가치가있는 질문에 대해 "역사적 잠금"을 사용합니다.그러나이 질문에 대한 답변은 적극적으로 유지되고 역사적인 잠금은 답변 편집을 허용하지 않습니다.따라서 "Wiki Answer"잠금이 답변을 편집 할 수 있도록 적용되었습니다.당신은 역사적인 자물쇠가 정상적으로 처리되는 국소질 문제가 존재한다고 가정해야합니다 (즉,이 질문은 스택 오버플로에 대한 온 주제 질문의 좋은 예가 아닙니다).

웹 사이트에 대한 양식 기반 인증

우리는 스택 오버 플로우가 매우 구체적인 기술적 인 질문을위한 자원이 아니 뿐이 밝혀지지 않아도 일반적인 문제에 대한 변형을 해결하는 방법에 대한 일반적인 지침을 받아야한다고 믿습니다."웹 사이트에 대한 양식 기반 인증"은 그러한 실험을위한 훌륭한 주제 여야합니다.

다음과 같은 주제가 포함되어야합니다.

  • How to log in
  • How to log out
  • How to remain logged in
  • Managing cookies (including recommended settings)
  • SSL/HTTPS encryption
  • How to store passwords
  • Using secret questions
  • Forgotten username/password functionality
  • Use of nonces to prevent cross-site request forgeries (CSRF)
  • OpenID
  • "Remember me" checkbox
  • Browser autocompletion of usernames and passwords
  • Secret URLs (public URL protected by digest)
  • Checking password strength
  • E-mail validation
  • and much more about form based authentication...

다음과 같은 것들은 포함해서는 안됩니다 :

  • Roles and authorization
  • HTTP basic authentication

제발 우리를 도와주세요 :

  1. Suggesting subtopics
  2. Submitting good articles about this subject
  3. Editing the official answer

답변

 

파트 I : 로그인 방법

우리는 인증을 위해 서버 측의 스크립트에 값을 게시하는 로그인 + 암호 HTML 양식을 작성하는 방법을 이미 알고 있습니다.아래 섹션에서는 사운드 실용 인증의 패턴과 가장 일반적인 보안 함정을 피하는 방법을 처리합니다.

https에 또는 https하지 않으려면?

연결이 이미 SSL / TLS를 사용하여 HTTPS를 통해 터널링되지 않으면 로그인 양식 값이 ClearText로 전송됩니다.이 파일은 브라우저와 웹 서버 간의 라인을 도청 할 수있게 해주는 로그인을 읽을 수 있습니다.을 통해.이러한 유형의 도청은 정부에 의해 일상적으로 수행되지만 일반적으로 우리는 다음과 같은 '소유'전선을 주소하지 않을 것입니다 : HTTPS 만 사용하십시오.

본질적으로 로그인 중 도청 / 패킷 스니핑을 방지하는 유일한 실용적인 방법은 HTTPS 또는 다른 인증서 기반 암호화 체계 (예 : TLS) 또는 검증 된 테스트 된 챌린지 응답 체계 (예 : Diffie-Hellman)를 사용하는 것입니다.-based srp).다른 방법은 도청 공격자가 쉽게 우회 할 수 있습니다.

물론, 당신이 조금 비실용적이지 않게되기를 기꺼이하는 경우, 2 인증 체계의 일부 형태 (예 : Google Authenticator 앱, 물리적 '냉전 스타일'코드북 또는 RSA 키 발생기 동글)를 사용할 수도 있습니다.올바르게 적용되는 경우, 이는 보안되지 않은 연결로도 작동 할 수 있지만 Dev가 이중 인증을 구현하지만 SSL이 아님을 기꺼이 구현할 것임을 상상하기가 어렵습니다.

(하지 마십시오) 롤 - 자신의 자바 스크립트 암호화 / 해싱

지각 된 (이제는 피할 수없는) 비용과 기술적 인 어려움을 감안할 때, 웹 사이트에서 SSL 인증서를 설정하는 데는 일부 개발자는 무보증 전선 위에 ClearText 로그인을 전달하지 않도록 자신의 브라우저 해싱 또는 암호화 체계를 롤오프합니다.

이것은 고귀한 생각이지만, 위의 것 중 하나와 결합되지 않는 한 본질적으로 쓸모가 없거나 보안 결함 일 수 있습니다. 즉, 강력한 암호화로 선을 고정하거나 시도하고 테스트 한 챌린지 대응을 사용하는 것입니다.메커니즘 (그게 무엇인지 모르는 경우, 디지털 보안에서 개념을 구현하기가 가장 어려운 것을 증명하기가 가장 어려운 것 중 하나라는 것을 알고 있습니다.

암호를 해싱 할 수있는 것은 암호 공개에 대해 효과적 일 수 있지만, 공격, 중간 공격 / 납치 공격 (공격자가 무담보가없는 HTML 페이지에 몇 바이트를 삽입 할 수있는 경우브라우저에서는 JavaScript에서 해싱을 주석하거나 무차별 공격을 주석 처리 할 수 있습니다 (사용자 이름, 소금 및 해시 암호 공격자를 나눠주고 있기 때문에).

인류에 대한 captchas

CAPTCHA는 공격의 하나의 특정 범주 : 자동 사전 / 브루 테이프 포스 트리플 앤 오류가없는 인간 운영자가 아닙니다.그러나 이것이 실제 위협이되는 것은 의심의 여지가 없지만, Captcha, 특히 제대로 설계된 서버 측 로그인 스로틀 체계가 필요없는 원활한 방법이 있습니다. 나중에 나중에 논의 할 것입니다.

CAPTCHA 구현이 생성되지 않음을 알고 있습니다.그들은 종종 인간이 솔루 불가능하지 않으며, 대부분은 봇에 대해 실제로 비효율적이며, 모든 것은 싼 제 3 세계 노동 (OWASP에 따르면, 현재의 착취 쇼프 속도가 500 달러에 $ 12이며, 일부 구현)이있을 수 있습니다.일부 국가에서 기술적으로 불법입니다 (IWASP 인증 치트 시트 참조).CAPTCHA를 사용해야하는 경우 정의에 의해 ocr-hard가 있기 때문에 Google의 reCAPTCHA를 사용하므로 (이미 OCR-misclassified 책 스캔을 사용하므로 사용자 친화적이기도합니다.

개인적으로, 나는 captchas 성가신을 찾아내는 경향이 있으며, 사용자가 여러 번 로그인하지 못하고 스로틀 지연이 최대화 될 때만 최후의 수단으로 만 사용하는 경향이 있습니다.이것은 거의 받아 들일만큼 충분히 일어날 것이며 시스템 전체를 강화합니다.

암호 저장 / 로그인 확인

최근 몇 년 동안 우리가 보았던 고도로 공개 된 해킹 및 사용자 데이터 누출 후에 마침내 일반적인 지식이 될 수 있지만, 다음과 같이 말해야합니다. 데이터베이스의 ClearText에 암호를 저장하지 마십시오.사용자 데이터베이스는 SQL 주입을 통해 일상적으로 해킹, 유출되거나 수집되며 로그인 보안을 위해 즉각적인 게임 인 Raw, PlainText 암호를 저장하는 경우입니다.

따라서 암호를 저장할 수 없으면 로그인 양식에서 게시 된 로그인 + 암호 조합이 올바른지 확인하는 방법은 무엇입니까?대답은 키 파생 기능을 사용하여 해싱입니다.새 사용자가 만들어 지거나 암호가 변경 될 때마다 암호를 가져 와서 argon2, bcrypt, scrypt 또는 pbkdf2와 같은 KDF를 통해 ClearText 암호 ( "CorrectHorsebatteryStaple")를 길고 무작위로 보이는 문자열로 전환합니다., 데이터베이스에 저장하는 것이 더 안전합니다.로그인을 확인하려면 입력 된 암호에서 동일한 해시 함수를 실행 하고이 시간은 소금을 전달하고 결과 해시 문자열을 데이터베이스에 저장된 값으로 비교합니다.Argon2, Bcrypt 및 Scrypt는 이미 해시와 소금을 저장합니다.자세한 내용은 sec.stackexchange 에서이 문서를 확인하십시오.

소금이 사용되는 이유는 그 자체로 해싱이 충분하지 않다는 것입니다. 무지개 테이블에 대한 해시를 보호하기 위해 소위 '소금'을 추가하고 싶습니다.소금은 공격자가 암호 추측 공격을 실행하는 경우 하나의 실행에서 동일한 해시 값으로 저장되는 것과 정확히 일치하는 두 암호를 효과적으로 방지합니다.

사용자가 선택한 암호가 충분히 강하지 않기 때문에 암호 저장에는 암호 저장에 사용되어서는 안됩니다 (즉, 일반적으로 충분한 엔트로피가 포함되어 있지 않음)과 해시에 대한 액세스 권한이있는 공격자가 상대적으로 짧은 시간에 암호 추측 공격이 완료 될 수 있습니다.이것이 KDF가 사용되는 이유입니다. 이는 효과적으로 "키를 늘리십시오"라는 모든 암호는 공격자가 해시 알고리즘의 여러 반복을 일으키는 것으로 10,000 번, 공격자가 암호를 10,000 배 느낄 수있게합니다.

세션 데이터 - "당신은 spiderman69로 로그인했습니다"

서버가 사용자 데이터베이스에 대해 로그인 및 암호를 확인하고 일치하는 항목을 찾으면 시스템은 브라우저가 인증되었음을 기억해야합니다.이 사실은 세션 데이터의 서버 측에만 저장되어야합니다.

세션 데이터에 익숙하지 않은 경우 작동 방식이 있습니다. 단일 무작위로 생성 된 문자열은 만료 쿠키에 저장되어 서버에 저장된 세션 데이터 - 데이터 모음을 참조하는 데 사용됩니다.MVC 프레임 워크를 사용하는 경우 이것은 의심의 여지없이 이미 처리됩니다.

가능한 경우 세션 쿠키에 브라우저로 전송할 때 보안 및 HTTP 만 플래그가 설정되어 있는지 확인하십시오.HttpOnly 플래그는 XSS 공격을 통해 읽는 쿠키에 대한 몇 가지 보호 기능을 제공합니다.보안 플래그는 쿠키가 HTTPS를 통해서만 보낼 수 있으므로 네트워크 스니핑 공격으로부터 보호합니다.쿠키의 가치는 예측 가능해서는 안됩니다.존재하지 않는 세션을 참조하는 쿠키가 제시되는 경우 세션 고정을 방지하기 위해 그 값을 즉시 교체해야합니다.

세션 상태는 클라이언트 측에서 유지 관리 할 수도 있습니다.이것은 JWT (JSON 웹 토큰)와 같은 기술을 사용하여 이루어집니다.

제 2 부 : 로그인 한 것 - 악명 높은 "기억"확인란

지속적인 로그인 쿠키 ( "나를 기억"기능) 위험 영역입니다.한편으로는 사용자가 처리하는 방법을 이해할 때 기존 로그인만큼이나 안전합니다.반면에, 그들은 공공 컴퓨터에서 사용할 수있는 부주의 한 사용자의 손에 엄청난 보안 위험이며 로그 아웃하는 것을 잊어 버리고 브라우저 쿠키가 무엇인지 또는 삭제하는 방법을 알지 못할 수도 있습니다.

개인적으로, 나는 내가 정기적으로 방문하는 웹 사이트에 대한 지속적인 로그인을 좋아하지만, 나는 그들을 안전하게 처리하는 방법을 알고있다.사용자가 동일한 것을 알고 있다고 확신하는 경우 지속적인 색 로그인을 깨끗한 양심으로 사용할 수 있습니다.그렇지 않은 경우, 그럼 당신은 해킹당한 경우 로그인 자격 증명으로 부주의 한 사용자가 부주의 한 사용자가 그것을 가져 왔을 것입니다.우리가 사용자의 주택에 가서 모든 facepalm-유도 된 포스트 - IT 노트를 찢는 것과 같지 않습니다.

물론 일부 시스템은 해킹 된 계정을 가질 여력이 없습니다.이러한 시스템의 경우 지속적인 로그인을 가질 수있는 방법이 없습니다.

지속적인 로그인 쿠키를 구현하기로 결정한 경우, 이것은 당신이 어떻게하는 방법입니다.

  1. First, take some time to read Paragon Initiative's article on the subject. You'll need to get a bunch of elements right, and the article does a great job of explaining each.

  2. And just to reiterate one of the most common pitfalls, DO NOT STORE THE PERSISTENT LOGIN COOKIE (TOKEN) IN YOUR DATABASE, ONLY A HASH OF IT! The login token is Password Equivalent, so if an attacker got their hands on your database, they could use the tokens to log in to any account, just as if they were cleartext login-password combinations. Therefore, use hashing (according to https://security.stackexchange.com/a/63438/5002 a weak hash will do just fine for this purpose) when storing persistent login tokens.

파트 III : 비밀 질문 사용

'비밀 질문'을 구현하지 마십시오.'비밀 질문'기능은 보안 안티 패턴입니다.필수 읽기 목록에서 링크 번호 4에서 용지를 읽으십시오.당신은 그녀의 야후!이메일 계정은 보안 질문에 대한 답변이 ... "Wasilla High School"이었기 때문에 이전 대통령 캠페인 중에 해킹당했습니다.

사용자 지정 질문에도 해당하는 경우에도 대부분의 사용자가 다음 중 하나를 선택할 가능성이 높습니다.

어머니의 처녀 이름이나 좋아하는 애완 동물과 같은 '표준'비밀 질문 누군가가 블로그, LinkedIn 프로필 또는 이와 유사한 것에서 들어 올릴 수있는 단순한 퀴즈 암호를 추측하는 것보다 쉽게 대답 할 수있는 질문이 있습니다.어느 쪽이든 비밀번호의 경우, 당신이 상상할 수있는 모든 질문입니다.

결론적으로, 보안 질문은 본질적으로 사실상 모든 형태와 변형으로 불안정하고 어떤 이유로 든 인증 체계에서 고용되어서는 안됩니다.

야생에서 보안 질문이 있는지에 대한 진정한 이유는 재 활성화 코드에 도달하기 위해 전자 메일에 액세스 할 수없는 사용자로부터 몇 가지 지원 호출 비용을 편리하게 저장한다는 것입니다.이것은 보안과 사라 팔린의 평판을 희생합니다.그만한 가치가 있니?아마도 그렇지 않을거야.

부품 IV : 잊어 버린 암호 기능

이미 잊어 버린 / 잃어버린 사용자 암호를 처리하기 위해 보안 질문을 사용해서는 안되는 이유를 이미 언급했습니다.또한 실제 암호를 전자 메일로 보내지 않아야한다고 말하지 않고도됩니다.이 분야에서 피하기 위해 적어도 두 가지가 너무 흔한 함정이 있습니다.

  1. Don't reset a forgotten password to an autogenerated strong password - such passwords are notoriously hard to remember, which means the user must either change it or write it down - say, on a bright yellow Post-It on the edge of their monitor. Instead of setting a new password, just let users pick a new one right away - which is what they want to do anyway. (An exception to this might be if the users are universally using a password manager to store/manage passwords that would normally be impossible to remember without writing it down).

  2. Always hash the lost password code/token in the database. AGAIN, this code is another example of a Password Equivalent, so it MUST be hashed in case an attacker got their hands on your database. When a lost password code is requested, send the plaintext code to the user's email address, then hash it, save the hash in your database -- and throw away the original. Just like a password or a persistent login token.

최종 참고 사항 : '손실 된 암호 코드'를 입력하기위한 인터페이스가 적어도 로그인 양식 자체만큼 안전하지 않거나 공격자가 대신 액세스를 위해이를 사용하는 것입니다.매우 긴 '잃어버린 암호 코드'를 생성했는지 확인하십시오 (예 : 16 대의 대소 문자를 구분하는 영숫자)은 좋은 시작이지만 로그인 양식 자체에 대해 수행하는 동일한 스로틀 체계를 추가하는 것이 좋습니다.

파트 v : 암호 강도 확인

첫째, 현실 검사를 위해이 작은 기사를 읽으려면 500 개의 가장 일반적인 암호

알았어. 그래서 목록은 어느 곳에서나 시스템에서 가장 일반적인 암호의 표준적인 목록이 아니라 적용 정책이 적용되지 않을 때 사람들이 암호를 선택할 수있는 방법에 대한 좋은 표시가 아닙니다.게다가 목록은 최근에 도난 된 암호의 공개적으로 사용 가능한 분석과 비교할 때 목록이 집에 가까워 보입니다.

그래서 : 최소한의 암호 강도 요구 사항이 없으므로 사용자의 2 %는 가장 일반적인 20 개의 일반 암호 중 하나를 사용합니다.의미 : 공격자가 20 번 시도가되면 웹 사이트의 50 개 계정이 금지 될 수 있습니다.

thwArting 암호의 엔트로피를 계산 한 다음 임계 값을 적용해야합니다.국립 표준 연구소 (NIST) 특별 발행물 800-63은 아주 좋은 제안을 가지고 있습니다.사전 및 키보드 레이아웃 분석 (예 : 'QWERYUIOP')과 결합하면 비밀번호가 잘못된 비밀번호가 아닌 모든 아늑한 암호의 99 %가 18 비트의 엔트로피 수준으로 거부 할 수 있습니다.단순히 암호 강도를 계산하고 사용자에게 시각적 강도 측정기를 보여주는 것이 좋지만 불충분합니다.적용되지 않는 한, 많은 사용자가 무시할 가능성이 큽니다.

그리고 고양이 암호의 사용자 친절 함을 상쾌하게하려면 Randall Munroe의 암호 강도 XKCD가 적극 권장됩니다.

트로이 헌트를 활용하십시오. 공용 데이터 위반에서 손상된 암호에 대한 사용자 암호를 확인하기 위해 API를 확인했습니다.

파트 VI : 훨씬 더 - 또는 : 빠른 화재 로그인 시도 방지

먼저 숫자를 살펴보십시오. 암호 복구 속도 - 암호가 얼마나 오래 일어나게됩니까?

해당 링크에서 테이블을 볼 시간이 없으면 다음과 같은 목록이 있습니다.

  1. It takes virtually no time to crack a weak password, even if you're cracking it with an abacus

  2. It takes virtually no time to crack an alphanumeric 9-character password if it is case insensitive

  3. It takes virtually no time to crack an intricate, symbols-and-letters-and-numbers, upper-and-lowercase password if it is less than 8 characters long (a desktop PC can search the entire keyspace up to 7 characters in a matter of days or even hours)

  4. It would, however, take an inordinate amount of time to crack even a 6-character password, if you were limited to one attempt per second!

그래서 우리는이 숫자에서 무엇을 배울 수 있습니까?글쎄, 그러나 우리는 가장 중요한 부분에 집중할 수 있습니다. 많은 수의 빠른 소방 연속 로그인 시도 (즉, 무차별 힘 공격)를 방해하는 사실은 정말로 어렵지 않습니다.그러나 그것을 오른쪽으로 예방하는 것은 쉽지 않습니다.

일반적으로 무차별 공격 (및 사전 공격에 대한 모든 효과가 있지만 이미 강력한 암호 정책을 사용하고 있으므로 문제가되지 않아야합니다).

n 실패한 시도 (지옥처럼 짜증 나고 종종 비효율적이지만 여기에서 나 자신을 반복하고 있습니다). n을 잠그고 N 실패한 시도 후 전자 메일 검증 요구 (이것은 일어나기를 기다리고있는 DOS 공격입니다) 그리고 마지막으로 로그인 조절 : 즉, N 개의 실패한 시도 후 시도 간의 시간 지연을 설정 (예, DoS 공격은 여전히 가능하지만 적어도 훨씬 적은 훨씬 더 복잡합니다).

Best Practice # 1 : 실패한 시도 수에 따라 증가하는 짧은 시간 지연 :

1 실패한 시도 = 지연 없음 2 실패한 시도 = 2 초 지연 3 실패한 시도 = 4 초 지연 4 실패한 시도 = 8 초 지연 5 실패한 시도 = 16 초 지연 등.

이 구성표를 공격하는 DOS는 결과 잠금 시간이 이전 잠금 시간의 합보다 약간 커집니다.

명확하게하기 위해서 : 브라우저에 대한 응답을 반환하기 전에 지연이 지연이 아닙니다.특정 계정이나 특정 IP 주소로부터 로그인 시도가있는 동안 시간 초과 또는 내화물 기간과 비슷합니다.즉, 올바른 자격 증명이 성공적인 로그인으로 되돌아 가지 않으며 잘못된 자격 증명이 지연 증명을 트리거하지 않습니다.

Best Practice # 2 : N 개의 실패한 시도 후에 효력이 발생하는 중간 길이 시간 지연은 다음과 같습니다.

1-4 실패한 시도 = 지연 없음 5 실패한 시도 = 15-30 min 지연

이 계획을 공격하는 도스는 매우 비실용적이지만 확실히 일할 수 있습니다.또한 합법적 인 사용자에게 매우 짜증나는 긴 지연이 매우 짜증나는 것과 관련이있을 수 있습니다.잊기 사용자가 당신을 싫어할 것입니다.

Best Practice # 3 : 두 가지 접근법을 결합 - 실패한 시도가 실패한 후에 효력이 발생하는 고정 된 짧은 시간 지연 중 하나와 같은 다음과 같습니다.

1-4 실패한 시도 = 지연 없음 5+ 실패한 시도 = 20 초 지연

또는 고정 된 상한을 가진 지연이 증가하는 지연 :

1 실패한 시도 = 5 초 지연 2 실패한 시도 = 15 초 지연 3+ 실패한 시도 = 45 초 지연

이 최종 계획은 OWASP 모범 사례 제안 (필수리스트 목록에서 링크 1)에서 가져 왔으며 제한적인 측면에서 인정 되더라도 모범 사례로 간주되어야합니다.

그러나 엄지 손가락의 규칙으로서, 나는 당신의 비밀번호 정책이 강하고, 지연이있는 버그를 버그 만 덜 필요로하는 것입니다.강력한 (대소 문자를 구분하는 영숫자 + 필수 번호 및 기호) 9+ 문자 암호가 필요한 경우 스로틀을 활성화하기 전에 사용자가 2-4 개의 지연된 암호 시도를 제공 할 수 있습니다.

이 최종 로그인 스로틀링 체계를 공격하는 DOS는 매우 비실용적입니다.그리고 최종 터치로서 항상 지속적으로 (쿠키) 로그인 (및 / 또는 CAPTCHA 검증 된 로그인 형식)을 통과하도록 허용하므로 공격이 진행되는 동안 합법적 인 사용자는 지연되지 않습니다.그렇게하면 매우 비실용적 인 DOS 공격은 매우 비실용적 인 공격이됩니다.

또한 관리자가 가장 매력적인 진입 점이 있기 때문에 관리자 계정에서보다 공격적인 스로틀을 수행하는 것이 의미가 있습니다.

Part VII : 분산 브로트 포스 공격

제쳐두고,보다 고급 공격자는 '자신의 활동 확산'으로 로그인 조절을 회피하려고 노력할 것입니다.

IP 주소 플래그를 방지하기 위해 봇넷에 대한 시도를 배포합니다. 한 명의 사용자를 선택하고 50.000 개의 가장 일반적인 암호 (우리의 스로틀로 인해 할 수 없기 때문에)를 시도하는 것이 아니라 가장 일반적인 암호를 선택하고 대신 50.000 명의 사용자를 사용해보십시오.그런 식으로 CAPTCHAS와 로그인 조절과 같은 최대 시도 측정을 중심으로뿐만 아니라 최대 1 개의 일반적인 암호가 훨씬 더 훨씬 더 훨씬 더 확률이 높기 때문에 성공 가능성이 증가합니다. 각 사용자 계정에 대한 로그인 요청, 30 초 간격, 레이더 아래에서 몰래 들어가기

여기서 가장 좋은 방법은 실패한 로그인 수를 기초로하는 실패한 로그인, 시스템 전체의 실행 평균을 기초로 사용하여 모든 사용자에게 부과하는 상한의 기초로 사용됩니다.

너무 추상적인가?내가 다시 말해 보자.

지난 3 개월 동안 하루에 평균 120 명의 나쁜 로그인이있었습니다.해당 (실행 평균)을 사용하면 시스템이 전역 제한을 3 배로 설정할 수 있습니다. 즉.360은 24 시간 동안 시도하지 못했습니다.그런 다음 모든 계정에 걸친 총 실패 시도 수가 하루 이내에 해당 수를 초과하면 계산 된 임계 값에서 가속 및 트리거 속도를 모니터링하는 경우 시스템 전체의 로그인 스로틀을 활성화합니다. - 모든 사용자의 짧은 지연을 의미합니다.(여전히 쿠키 로그인 및 / 또는 백업 CAPTCHA 로그인을 제외하고).

나는 또한 더 자세한 내용과 분산 브로트 포스 공격을 끊어지는 데 까다로운 핏불을 피하는 방법에 대한 자세한 내용과 정말 좋은 토론에 대한 질문을 게시했습니다.

PART VIII : 2 인증 및 인증 공급자

자격 증명은 악용, 암호가 쓰여지는 암호, 랩톱이 도난당한 랩톱이거나 사용자가 피싱 사이트에 로그인을 입력하는 사용자가 손상 될 수 있습니다.로그인은 전화 통화, SMS 메시지, 앱 또는 동글에서 수신 한 일회용 코드와 같은 대역 외에 균형을 유지하는 2 인증으로 추가로 보호 할 수 있습니다.여러 공급자는 이중 인증 서비스를 제공합니다.

인증은 다른 공급자가 자격 증명을 수집하는 데 완전히 위임 될 수 있습니다.이것은 신뢰할 수있는 제 3 자에게 문제를 푸시합니다.Google 및 Twitter는 표준 기반 SSO 서비스를 제공하는 반면 Facebook은 비슷한 독점적 인 솔루션을 제공합니다.

웹 인증에 대한 링크를 반드시 읽어야합니다

  1. OWASP Guide To Authentication / OWASP Authentication Cheat Sheet
  2. Dos and Don’ts of Client Authentication on the Web (very readable MIT research paper)
  3. Wikipedia: HTTP cookie
  4. Personal knowledge questions for fallback authentication: Security questions in the era of Facebook (very readable Berkeley research paper)


답변

명확한 기사

자격 증명 보내기

자격 증명을 100 % 안전하게 보내는 유일한 실용적인 방법은 SSL을 사용하는 것입니다.해시에 JavaScript를 사용하여 암호는 안전하지 않습니다.클라이언트 측 암호 해싱을위한 일반적인 함정 :

클라이언트와 서버 간의 연결이 암호화되지 않은 경우, 당신이하는 모든 것은 중간 공격에 취약합니다.침입자는 들어오는 JavaScript를 대체하여 해싱을 해시하거나 서버에 모든 자격 증명을 보내고 클라이언트 응답을들을 수 있고 사용자를 완벽하게 가장 할 수 있습니다. 신뢰할 수있는 인증 기관이있는 SSL은 MITM 공격을 방지하도록 설계되었습니다. 서버에서 수신 한 해시 된 암호는 서버에서 추가로 중복 작업을 수행하지 않으면 안전하지 않습니다.

SRP라는 또 다른 안전한 방법이 있지만 특허가 가능합니다 (자유롭게 라이센스가 부여되지만). 사용할 수있는 좋은 구현이 거의 없습니다.

암호 저장

암호를 데이터베이스의 일반 텍스트로 저장하지 마십시오.자신의 사이트의 보안을 상관하지 않더라도일부 사용자가 온라인 은행 계좌의 암호를 재사용 할 것으로 가정합니다.따라서 해시 된 암호를 저장하고 원본을 버리십시오.액세스 로그 또는 응용 프로그램 로그에 암호가 표시되지 않는지 확인하십시오.OWASP는 Argon2의 사용을 새로운 응용 프로그램의 첫 번째 선택으로 권장합니다.사용할 수없는 경우 PBKDF2 또는 Scrypt를 대신 사용해야합니다.그리고 마침내 위의 것들이없는 경우 BCrypt를 사용하십시오.

그 자해는 또한 불안감이 있습니다.예를 들어, 동일한 암호는 동일한 해시를 의미합니다. 이렇게하면 해시 조회 테이블이 한 번에 많은 암호를 크래킹하는 효과적인 방법을 만듭니다.대신 소금에 절인 해시를 보관하십시오.소금은 해싱 전에 암호에 첨부 된 문자열입니다 - 사용자 당 다른 (무작위) 소금을 사용하십시오.소금은 공개 가치이므로 데이터베이스의 해시와 함께 저장할 수 있습니다.이것에 대해 자세히보기 위해 여기를 보시려면 여기를보십시오.

즉, 사용자에게 잊어 버린 암호를 보낼 수는 없음을 의미합니다 (해시 만 있기 때문에).사용자를 인증하지 않은 경우 사용자의 암호를 재설정하지 마십시오 (사용자는 저장된 (및 유효화 된) 전자 메일 주소로 전송 된 전자 메일을 읽을 수 있음을 증명해야합니다.)

보안 질문

보안 질문은 안전하지 않습니다 - 그들을 사용하지 마십시오.왜요?보안 질문이 무엇이든, 암호가 더 좋습니다.읽기 파트 III : @jens roland의 비밀 질문을 사용 하여이 위키의 reswin reswin.

세션 쿠키

사용자가 로그인 한 후 서버는 사용자에게 세션 쿠키를 보냅니다.서버는 쿠키에서 사용자 이름 또는 ID를 검색 할 수 있지만 다른 사람은 이러한 쿠키를 생성 할 수 없습니다 (Todo Explain 메커니즘).

쿠키는 납치 될 수 있습니다. 그들은 클라이언트의 기계 및 기타 통신의 나머지 부분만큼 안전합니다.그들은 클라이언트가 쿠키를 잘못된 서버로 보내려면 독이있는 DNS에서 피시 된 디스크에서 읽은 디스크에서 읽을 수 있습니다.지속적인 쿠키를 보내지 마십시오.쿠키는 클라이언트 세션의 끝에 만료되어야합니다 (브라우저가 닫히거나 도메인을 남겨 둡니다).

사용자를 자동으로 사용할 수 있으려면 지속적인 쿠키를 설정할 수 있지만 전체 세션 쿠키와는 구별되어야합니다.사용자가 자동 로그인 한 추가 플래그를 설정할 수 있으며 민감한 작업을 위해 실제로 로그인해야합니다.이것은 매끄럽고 개인화 된 쇼핑 경험을 제공하지만 여전히 재정적 세부 사항을 보호하고자하는 쇼핑 사이트에서 인기가 있습니다.예를 들어, Amazon을 방문하도록 돌아 오면 로그인 한 것처럼 보이는 페이지를 보여줍니다. 그러나 주문을 할 때 (또는 배송 주소, 신용 카드 등을 변경하십시오), 그들은 확인을 요청합니다.너의 비밀번호.

반면 은행 및 신용 카드와 같은 금융 웹 사이트는 중요한 데이터 만 있고 자동 로그인 또는 저 보안 모드를 허용해서는 안됩니다.

외부 리소스 목록

웹에서 클라이언트 인증의 DOS 및하지 않음 (PDF) 많은 훌륭한 팁을 가진 21 페이지의 학술 기사. yc : 사용자 인증을위한 모범 사례 주제에 대한 포럼 토론 아마도 암호를 잘못 저장하고있을 것입니다 암호 저장에 대한 소개 기사 토론 : 코딩 공포 : 아마도 암호를 잘못 저장할 것입니다. 포럼 코딩 공포 기사에 대한 토론. 암호를 데이터베이스에 저장하지 마십시오! 데이터베이스에 암호 저장에 대한 또 다른 경고. 암호 크래킹 Wikipedia 여러 암호 해싱 방식의 약점에 관한 기사. 무지개 테이블로 충분히 : 보안 암호 방식에 대해 알아야 할 사항 레인보우 테이블에 대한 토론과 그들과 다른 스레드에 대해 방어하는 방법에 대한 토론.광범위한 토론을 포함합니다.



답변

첫째,이 답변 이이 정확한 질문에 가장 적합하지 않은 강한주의 사항.그것은 확실히 최고의 대답이 아닙니다!

나는 미래의 인증에 대한 더 나은 접근을위한 업그레이드 경로를 찾는 정신으로 Mozilla의 제안 된 브라우저 (또는보다 정확하게, 이메일 프로토콜)를 언급 할 것입니다.

나는이 방법을 요약 할 것이다 :

  1. Mozilla is a nonprofit with values that align well with finding good solutions to this problem.
  2. The reality today is that most websites use form-based authentication
  3. Form-based authentication has a big drawback, which is an increased risk of phishing. Users are asked to enter sensitive information into an area controlled by a remote entity, rather than an area controlled by their User Agent (browser).
  4. Since browsers are implicitly trusted (the whole idea of a User Agent is to act on behalf of the User), they can help improve this situation.
  5. The primary force holding back progress here is deployment deadlock. Solutions must be decomposed into steps which provide some incremental benefit on their own.
  6. The simplest decentralized method for expressing an identity that is built into the internet infrastructure is the domain name.
  7. As a second level of expressing identity, each domain manages its own set of accounts.
  8. The form “account@domain” is concise and supported by a wide range of protocols and URI schemes. Such an identifier is, of course, most universally recognized as an email address.
  9. Email providers are already the de-facto primary identity providers online. Current password reset flows usually let you take control of an account if you can prove that you control that account’s associated email address.
  10. The Verified Email Protocol was proposed to provide a secure method, based on public key cryptography, for streamlining the process of proving to domain B that you have an account on domain A.
  11. For browsers that don’t support the Verified Email Protocol (currently all of them), Mozilla provides a shim which implements the protocol in client-side JavaScript code.
  12. For email services that don’t support the Verified Email Protocol, the protocol allows third parties to act as a trusted intermediary, asserting that they’ve verified a user’s ownership of an account. It is not desirable to have a large number of such third parties; this capability is intended only to allow an upgrade path, and it is much preferred that email services provide these assertions themselves.
  13. Mozilla offers their own service to act like such a trusted third party. Service Providers (that is, Relying Parties) implementing the Verified Email Protocol may choose to trust Mozilla's assertions or not. Mozilla’s service verifies users’ account ownership using the conventional means of sending an email with a confirmation link.
  14. Service Providers may, of course, offer this protocol as an option in addition to any other method(s) of authentication they might wish to offer.
  15. A big user interface benefit being sought here is the “identity selector”. When a user visits a site and chooses to authenticate, their browser shows them a selection of email addresses (“personal”, “work”, “political activism”, etc.) they may use to identify themselves to the site.
  16. Another big user interface benefit being sought as part of this effort is helping the browser know more about the user’s session – who they’re signed in as currently, primarily – so it may display that in the browser chrome.
  17. Because of the distributed nature of this system, it avoids lock-in to major sites like Facebook, Twitter, Google, etc. Any individual can own their own domain and therefore act as their own identity provider.

이것은 엄격하게 "웹 사이트에 대한 폼 기반 인증"이 아닙니다.그러나 폼 기반 인증의 현재 표준에서 더 안전한 것을보다 안전하게 전환하기위한 노력입니다. 브라우저 지원 인증.



답변

나는 단지이 솔루션을 공유하는 것을 알게 된 것으로 생각했다.

나는 더미 필드라고 부릅니다 (나는 이것을 발명하지는 않았지만 나를 크게하지 마십시오).

짧은 시간 : <양식>에 이것을 삽입하고 유효성을 검사 할 때 비어 있는지 확인해야합니다.

<input type="text" name="email" style="display:none" />

트릭은 데이터를 필수 입력란에 삽입 해야하는 것으로 생각하기 위해 봇을 속이는 것입니다. 그래서 입력 "이메일"이라는 이유입니다.이미 사용중인 이메일이라는 필드가 이미있는 경우 "회사", "전화"또는 "EmailAddress"와 같은 더미 필드의 이름을 지정해야합니다.그냥 당신이 필요없는 것을 알고있는 것을 선택하고 사람들이 일반적으로 웹 양식을 채우기 위해 논리적으로 찾을 수있는 것처럼 보일 것입니다.이제 CSS 또는 JavaScript / jQuery를 사용하여 입력 필드를 숨 깁니다. 가장 적합한 기능 - 입력 유형을 숨김으로 설정하지 마십시오. 그렇지 않으면 봇이 해제되지 않습니다.

양식 (클라이언트 또는 서버 측)을 검증 할 때 더미 필드가 채워 졌는지 확인하여 인간이나 봇이 보낸 지 확인하십시오.

예시:

인간의 경우 : 사용자는 더미 필드 ( "이메일"라는 사례)를 볼 수 없으며 채우기를 시도하지 않습니다.따라서 더미 필드의 값은 양식이 전송되면 여전히 비어 있어야합니다.

봇의 경우 : 봇은 유형이 텍스트이고 이름 이메일 (또는 이메일이 무엇이든) 이메일 인 필드가 표시되며 논리적으로 적절한 데이터로 채워려고합니다.멋진 CSS로 입력 양식을 스타일링하면 웹 개발자가 항상 해당하는지 상관하지 않습니다.더미 필드의 가치가 무엇이든, 우리는 0 자보다 큽니다.

나는 CAPTCHA와 함께 방명록 에이 방법을 사용했고, 나는 이후 한 스팸 포스트를 보지 못했습니다.전에는 CAPTCHA 전용 솔루션을 사용했지만 결국에는 매시 5 개 스팸 게시물이 발생했습니다.양식에 더미 필드를 추가하면 모든 스팸이 나타나지 않도록 폼을 추가합니다 (적어도 지금까지).

나는 이것이 로그인 / 인증 양식으로 괜찮을 수도 있다고 믿습니다.

경고 : 물론이 방법은 100 % 어리 석고가 아닙니다.봇은 스타일 디스플레이로 입력 필드를 무시하도록 프로그래밍 할 수 있습니다.또한 모든 양식 필드를 자동 채우기 위해 자동 완성 - 대부분의 브라우저와 같은 일부 형태의 자동 완성을 사용하는 사람들에 대해서도 생각해야합니다.그들은 단지 더미 필드를들을 수도 있습니다.

또한 더미 필드를 보이지 만 화면의 경계를 벗어나는 것만으로 거의 변화 할 수도 있습니다. 그러나 이것은 완전히 당신에게 달려 있습니다.

창조적 인 것!



답변

위의 답변이 "틀린"이라고 생각하지는 않지만 쿠키 세션을 구현하는 방법 (또는 오히려 강조하는 "쿠키 세션을 구현하는 방법을 만지지 않는 넓은 인증 영역이 있습니다."어떤 옵션을 사용할 수 있는지, 무역- 오프 ".

내 제안 된 편집 / 답변은입니다

암호 검사보다는 문제가 더 많은 문제가 있습니다. 이중 인증의 사용은 더 영리한 암호 암호화 수단보다 훨씬 안전합니다. 자신의 로그인 양식이나 암호의 데이터베이스 저장소를 구현하려고하지 마십시오. 저장되는 데이터는 계정 생성 및 자체 생성 (즉, Facebook, Flickr 등의 웹 2.0 스타일 등)에서 가치가 없습니다. 다이제스트 인증은 보안 채널을 통해 비밀번호를 보내지 않는 모든 주요 브라우저 및 서버에서 지원되는 표준 기반 접근 방식입니다.

이렇게하면 브라우저 자체가 매번 커뮤니케이션을 다시 암호화 할 때 "세션"이나 쿠키가 필요할 필요가 없습니다.그것은 가장 많은 "가벼운"개발 접근 방식입니다.

그러나 공개 저 가치 서비스를 제외하고는 추천하지 않습니다.위의 다른 답변 중 일부가 문제가되는 문제입니다 - 서버 측 인증 메커니즘을 다시 구현하지 마십시오.이 문제는 해결되었으며 대부분의 주요 브라우저에서 지원됩니다.쿠키를 사용하지 마십시오.자신의 손으로 압연 된 데이터베이스에 아무것도 저장하지 마십시오.요청이 인증되면 요청에 따라 묻습니다.다른 모든 것은 구성 및 타사 신뢰할 수있는 소프트웨어로 지원되어야합니다.

그래서 ...

첫째, 우리는 이후 암호를 다시 확인하면서 계정의 초기 생성을 혼동하고 있습니다.flickr에 처음으로 사이트를 만드는 경우 새 사용자가 0 값 (빈 웹 공간)에 액세스 할 수 있습니다.계정을 만드는 사람이 자신의 이름에 대해 거짓말을하는 경우 진정으로 신경 쓰지 않습니다.병원 인트라넷 / 익스트라 넷에 대한 계정을 만드는 경우 가치는 모든 의료 기록에 놓여 있으므로 계정 창조자의 ID (*)를 관리합니다.

이것은 매우 단단한 부분입니다.유일한 괜찮은 솔루션은 신뢰의 웹입니다.예를 들어, 병원에 의사로 가입하십시오.사진, 여권 번호 및 공개 키로 어딘가에서 호스팅되는 웹 페이지를 만드는 것입니다.그런 다음 병원을 방문하면 시스템 관리자가 귀하의 여권을보고 사진이 당신과 일치하면 병원 개인 키로 웹 페이지 / 사진 해시를 해시합니다.지금부터는 키와 토큰을 안전하게 교환 할 수 있습니다.병원을 신뢰하는 사람은 누구나 (비밀 소스 BTW가 있습니다).시스템 관리자는 또한 RSA 동글 또는 기타 2 인증 인증을 제공 할 수도 있습니다.

그러나 이것은 많은 번거 로움이 있으며, 매우 Web 2.0이 아닙니다.그러나 자체 작성이 아닌 귀중한 정보에 액세스 할 수있는 새 계정을 만드는 유일한 안전한 방법입니다.

  1. Kerberos and SPNEGO - single sign-on mechanisms with a trusted third party - basically the user verifies against a trusted third party. (NB this is not in any way the not to be trusted OAuth)

  2. SRP - sort of clever password authentication without a trusted third party. But here we are getting into the realms of "it's safer to use two-factor authentication, even if that's costlier"

  3. SSL client side - give the clients a public key certificate (support in all major browsers - but raises questions over client machine security).

결국, 그것은 절충안입니다 - 보안 위반 비용은 더 안전한 접근 방식을 구현하는 비용입니다.어느 날 우리는 적절한 PKI를 널리 받아 들일 수 있으므로 더 이상 자신의 압연 인증 양식과 데이터베이스가 없습니다.어느 날...



답변

해시 때 MD5 (많은 하드웨어 구현이 존재 함)와 같은 빠른 해시 알고리즘을 사용하지 마십시오.SHA-512와 같은 것을 사용하십시오.암호에 대해서는 더 느린 해시가 더 좋습니다.

해시를 만들 수있는 더 빠르면 무차별 강제 검사기가 빠르게 작동 할 수 있습니다.따라서 느린 해시는 무력 강제력이 느려집니다.느린 해시 알고리즘은 더 긴 암호 (8 자리 +)를 위해 비실용적 인 짐승을 강제로 강제합니다.

출처:https://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication