it-swarm-korea.com

누구나 웹 애플리케이션 자체 비밀번호 재설정 메커니즘을 올바르게 구현하기위한 참조를 제공 할 수 있습니까?

우리는 웹 응용 프로그램에서 자체 비밀번호 재설정을 구현하고 있으며 원하는 방식을 알고 있습니다 (사전 등록 된 이메일 주소로 이메일 시간 제한 비밀번호 재설정 URL).

내 문제는 개발자가 해당 기술을 사용하도록 지적하는 참조를 찾을 수 없다는 것입니다. 누구 든지이 기술에 대한 좋은 참고 자료의 방향을 알려 줄 수 있습니까?

96
bdg

몇 가지 제안 :

확인 될 때까지 사용자의 비밀번호를 재설정하지 마십시오. 사용자의 비밀번호를 즉시 재설정하지 마십시오. 사용자가 사전 등록 된 이메일 주소로 전송 된 확인 링크를 클릭 한 후에 만 ​​재설정하십시오.

보안 문자 필요. 사용자가 비밀번호 재설정을 요청하면 계속 진행하기 전에 보안 문자를 해결하도록 강제 실행하십시오. 이는 자동화 된 도구가 많은 사용자에게 슬픔을 주려고하지 않고 사용자가 로봇이 아닌 사람임을 증명하도록합니다.

무작위. 시간 제한 암호 재설정 URL에는 추측 할 수없는 임의의 구성 요소가 포함되어야합니다. 암호화 품질 임의성을 사용해야합니다. /dev/urandom 또는 System.Security.Cryptography.RNGCryptoServiceProvider의 출력이 적합합니다. Rand() 또는 random() 또는 System.Random의 출력은 충분히 임의적이지 않으며 잘못된 선택입니다. GUID 또는 타임 스탬프는 임의적이지 않으므로 좋은 선택이 아닙니다.

시간 제한 포함 재설정 확인 링크는 적당한 시간 (예 : 24 시간) 후에 만료되어야합니다. 링크는 한 번만 사용할 수 있어야하며 사용되는 즉시 즉시 만료되어야합니다.

이메일에 설명문을 포함 시키십시오. 이메일에 설명문을 추가하여 이메일이 발송 된 이유를 설명하기 위해 누군가가 본인 소유가 아닌 계정으로 재설정하십시오. "누군가 username에서 귀하의 계정 site에 대한 비밀번호를 재설정하도록 요청했습니다.이 요청을 한 경우 여기를 클릭하여 비밀번호를 변경하십시오. 요청을 취소하려면 여기를 클릭하여 요청을 취소하십시오. "

비밀번호 재설정 후 이메일 보내기. 비밀번호가 성공적으로 재설정되면 비밀번호가 변경되었음을 알리는 이메일을 사용자에게 보냅니다. 해당 이메일에 새 비밀번호를 포함시키지 마십시오.

취소 모니터링. 사용자가 재설정을 요청하지 않았 음을 나타내는 취소 링크를 클릭하는 빈도를 모니터링하는 논리를 포함하는 것을 고려할 수 있습니다. 특정 임계 값을 초과하면 시스템 운영자에게 경고를 보내는 것이 유용 할 수 있습니다. 또한 일부 요청에 대한 취소 링크를 방문한 경우 after 확인 링크를 방문하면 해당 사용자에 대한 공격 가능성이 있음을 나타냅니다. 예를 들어 해당 시점에 조치를 취할 수 있습니다. , 사용자 비밀번호를 무효화하고 비밀번호를 다시 재설정해야합니다. (이는 다음 공격에 대한 방어입니다. 공격자는 사용자의 사서함에 액세스 한 다음 사이트의 암호를 재설정하도록 요청한 다음 확인 링크를 방문합니다. 공격자가 사용자의받은 편지함에서 이러한 전자 메일을 삭제하지 않으면, 실제 사용자가 이메일을 읽으면 취소 링크를 클릭하여 문제가 있음을 표시 할 수 있습니다.)

HTTPS 사용 링크는 https (http : 아님)를 사용하여 다양한 공격 (예 : 인터넷에서 웹을 서핑하는 사용자에 대한 Firesheep 공격)을 방지해야합니다. 카페).

이 작업을 기록하십시오. 그런 모든 요청을 기록하는 것이 좋습니다. 사용자의 사용자 이름을 기록하는 것 외에도 재설정 링크를 요청한 클라이언트의 IP 주소와 재설정 링크를 방문한 클라이언트의 IP 주소를 사용자에게 이메일로 기록 할 수 있습니다.

추가 읽기. Troy Hunt의 훌륭한 블로그 게시물 인 보안 암호 재설정 기능 구축에 대해 알고 싶었던 모든 것을 읽고 싶을 수도 있습니다. . 이 리소스에 대한 링크를 제공하는 @coryT에게 감사합니다.

마지막으로 비 암호 인증을 고려하십시오. 암호에는 인증 메커니즘으로 많은 문제가 있으며 보안 저장과 같은 다른 사용자 인증 방법을 고려할 수 있습니다. 쿠키를 인증하기 위해 의심 할 수없는 비밀을 가진 머신의 영구 쿠키. 이 방법으로, 사용자가 새 컴퓨터 나 새 브라우저 (이메일을 통해 사용자의 사전에 액세스 할 수있는 권한)에 대한 액세스 권한을 부여 할 수있는 방법을 제공해야하지만 비밀번호를 잊어 버리거나 사용자를 숨길 수있는 방법은 없습니다 등록 된 이메일 주소). 이 설문지 많은 대체 인증 방법과 그 강점과 약점에 대한 훌륭한 설문 조사가 있습니다.

93
D.W.

트로이 헌트 (Troy Hunt)는이 정확한 질문에 아주 멋진 글을 썼습니다. 보안 암호 재설정 기능 구축에 대해 알고 싶은 모든 것

15
coryT

비밀번호를 보낼 수있는 장소는 비밀번호를 해시하지 않지만 '평문'으로 해독 할 수있는 곳에 저장한다는 의미입니다. 이것은 그 자체로 나쁘다.

아마도 "가장"안전하지는 않지만 더 안전 할 것입니다.

비밀번호 요청시 내장 GUID가있는 사용자에게 비밀번호 재설정 링크를 보냅니다. GUID의 세션은 hmm, hour 등으로 만료됩니다.

9
Rich Homolka

그렇다면 질문은 암호/계정 복구 프로세스를 어떻게 구성해야 하는가입니다. 이는 번거롭지 않은 사용자 경험 또는 우수한 보안에 대해 최적화하려는 대상에 따라 다릅니다.

보안을 강화하려면 :

  • 가입하는 동안 사용자는 자신의 이메일 주소를 입력해야합니다.
  • 가입하는 동안 사용자는 인증을 위해 보조 전화 번호를 입력해야합니다 (휴대 전화 번호 또는 질문과 대답 (예 : " 어머니 성함 "이상)).

  • 복구하는 동안 시스템은 먼저 위의 보조 채널 (도전 질문) 또는 SMS로 휴대폰에 코드를 전송하는 등의 방법으로 신원을 대략적으로 확인합니다.

  • 위의 첫 번째 신원 확인이 지워지면 시스템은 비밀번호 재설정 이메일 을 이전에 입력 한 이메일 주소로만 보냅니다. 이것은 f.x를 방지하기위한 추가적이고 중요한 조치입니다. Sarah Palin type exploits .

  • 이메일 필수 새 비밀번호 또는 이와 유사한 것을 포함합니다. a) URL에 제공된 추측 할 수없는 비밀 값을 통해 계정에 연결된 b 사이트의 HTTPS 암호화 웹 페이지에 대한 클릭 가능 링크가 있어야합니다. ) 시간 제한이 있으므로 계정 복구는 요청 후 x 시간 동안 만 작동합니다. c) 최종 사용자가 new 비밀번호입니다.

  • 모든 계정 재설정 트랜잭션에 대해 양호한 로깅을 유지하고 실제로 사람이이를 모니터링하고 의심스러운 경우 조치를 취하십시오 (IP 주소에 대한 서버 로그보기 fx, 많은 요청이 동일한 IP 주소에서 오는 경우, 인스턴스가 있습니까? 사용자가 등록 된 계정 소유자와 다른 국가에서 비밀번호를 재설정하려고합니다).

이 복잡성을 완전히 피할 수도 있습니다. 아직 초기 단계이지만 OAuth/OpenID/Facebook을 통해 로그인, Google 등은 시스템에서 이러한 복잡성을 완전히 제거하지만 아마도 잘 사용되지 않는 유용성 을 갖습니다.

9
Jesper M

비밀번호 재설정을 수행하는 가장 안전한 방법은 만료 날짜와 함께 사용자 ID에 연결된 대규모 임의의 고유 한 일회성 재설정 토큰을 생성하는 것입니다. SQL 액세스 권한이있는 공격자가이 토큰을 사용하여 임의의 사용자 비밀번호를 재설정 할 수 있으므로 토큰은 데이터베이스에서 해시되어야합니다.

재설정 토큰은 이메일 주소로 재설정 링크를 보내야합니다. 사용자가 링크를 클릭하면 토큰의 해시가 데이터베이스에서 발견되고 만료 날짜가 미래임을 확인해야합니다. 이러한 조건이 충족되면 사용자에게 새 비밀번호를 입력 할 수있는 화면이 표시되어야합니다.

이 전체 프로세스 must는 SSL을 통해 수행되며, 그렇지 않으면 침입자가 사용자를하기 전에 URL을 스니핑하고 암호를 재설정 할 수 있습니다.

다른 몇 가지 팁 :

  1. 비밀은 공격자에 대한 사소한 성가심과 사용자에게 큰 성가심에 의문을 제기합니다. 완전히 피하십시오.
  2. 비밀번호 재설정을 보내기 전에 사용자에게 사람 확인 도전 (예 : 보안 문자)을 제시하십시오. 이렇게하면 자동 재설정 요청이 방지됩니다.
  3. 재설정을 수행하는 IP 주소가 이전에 계정에 성공적으로 로그인 한 IP 주소인지 확인하십시오. 그렇지 않은 경우 계정/사용자에 대한 추가 정보를 요청하십시오 (예 : 계정 생성 연도, 생년월일, 주소의 첫 줄.
  4. 사용자가 잘못된 비밀번호 재설정 요청을보고 할 수 있도록 "이 이메일을 요청하지 않았습니다"링크를 추가하십시오.
6
Polynomial

귀하의 응용 프로그램에 적합하거나 적합하지 않을 수 있지만 온라인 뱅킹 응용 프로그램 및 이와 유사한 유형에서 사용되는 또 다른 방법은 SMS 메시징으로 등록 된 휴대폰으로 재설정 코드의 절반을 보내는 것입니다. 침입자의 관점에서 볼 때 이것은 완벽한 PITA이며,이를 깨기 위해서는 몇 개의 채널을 손상시켜야합니다.

6
Rory Alsop

SMS를 통한 2 단계 인증! 1 고객과 고객의 휴대 전화 번호를 알고 있습니다. SMS 웹 사이트에 추가하여 고유 한 코드인지 확인합니다.

0
frank

몇 단계 절차를 수행하십시오. 예를 들면 다음과 같습니다.

  1. 사용자가 비밀번호를 잊었습니다. "비밀번호를 잊어 버렸습니다. 다음에 수행 할 작업을 이메일로 보내십시오"단추를 클릭하십시오 (버튼 레이블이 다를 수 있음).
  2. 서버가 그에게 링크를 보냅니다. www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. 그는 링크를 클릭하고 새로운 암호를 만들 수 있습니다
  4. 그는 제출을 클릭합니다. 다 했어요 모두 행복한

단 하나의 캐치가 포인트 3에 있습니다. X 및 Y 값은 임의적이고 예측할 수 없으며이 특정 계정에 연결되어야합니다. 그들은 또한 한 번만 사용해야하며 짧은 시간 (24 시간?) 후에 부패해야합니다. 해당 열이있는 전용 테이블에 두 값을 모두 저장하십시오.

| some_id | user_id | X | Y | expire_time

사용자가 올바른 링크를 사용하려고하면 만료 시간이 충족되지 않았는지 확인하고 그렇지 않은 경우 비밀번호를 변경하도록 허용하십시오.

0
Andrzej Bobak