'비밀번호를 잊어 버린'구현을위한 가장 좋은 방법은? [닫은]


153

"비밀번호를 잊어 버렸습니다"기능을 구현하는 가장 좋은 방법을 찾고 있습니다.

두 가지 아이디어가 나옵니다.

  1. 사용자가 비밀번호를 잊어 버렸을 때, 사용자는 사용자 이름, 이메일 및 생년월일 또는 성을 입력해야합니다. 그런 다음 임시 비밀번호가 포함 된 메일이 사용자 이메일 계정으로 전송됩니다. 사용자는 임시 비밀번호를 사용하여 로그인하고 비밀번호를 재설정합니다.

  2. 비슷하지만 이메일에는 사용자가 비밀번호를 재설정 할 수있는 링크가 포함되어 있습니다.

아니면 아무도 나에게 더 좋고 안전한 방법을 제안 할 수 있습니까? 또한 임시 비밀번호 또는 링크를 보내거나 24 시간 이내에 사용자가 비밀번호를 재설정하도록 강제하지 않으면 임시 비밀번호 또는 링크를 사용할 수 없습니다. 그렇게하는 방법?


이것이 JSF를 넘어서므로 게시물에 태그를 다시 지정했습니다. 아마도 더 많은 응답을 얻을 수 있습니다.
McDowell

6
@Whoever 이번 달 메타에서 "XYZ 때문에이 닫힌 질문을 삭제하자"는 물결이 일고있다. 솔루션에 결함이 있으며 보안 상 문제를 해결하는 것보다 문자 그대로 존재한다는 사실이 입증되지 않는 한이 특정 질문을 삭제해서는 안됩니다.
Félix Gagnon-Grenier

1
잊혀진 암호 복구 전략을위한 OWASP "치트 시트": owasp.org/index.php/…
daiscog

@megaflop가 제안한 링크는 슬프게도 깨졌습니다. cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

답변:


186

업데이트 : 더 나은 접근 방식을 위해 2013 년 5 월 개정

  1. 사용자가 자신의 사용자 이름을 입력하고 "암호를 잊어 버렸습니다". 또한 사용자 이름도 잊어 버리기 때문에 사용자 이름 대신 이메일 주소를 입력하는 옵션을 권장합니다.
  2. 이 시스템은 테이블이 password_change_requests컬럼과를 ID, Time하고 UserID. 새 사용자가 버튼을 누르면 테이블에 레코드가 작성됩니다. 이 Time열에는 사용자가 "비밀번호 분실"버튼을 누른 시간이 포함됩니다. 은 ID문자열입니다. 긴 임의의 문자열 (예 : GUID)이 생성 된 다음 암호 (해당 항목 자체)와 같이 해시 됩니다. 이 해시는 테이블에서 'ID'로 사용됩니다.
  3. 시스템은 사용자에게 링크가 포함 된 이메일을 보냅니다. 링크에는 원래 ID 문자열 (해시 전)도 포함됩니다. 링크는 다음과 같습니다 : http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. forgotpassword.jsp 페이지는 ID 매개 변수를 검색 할 수 있어야합니다. 죄송합니다. Java를 모르므로 더 구체적으로 말할 수 없습니다.
  4. 사용자가 이메일의 링크를 클릭하면 페이지로 이동합니다. 이 페이지 ID는 URL에서 URL을 검색하여 다시 해시하고 테이블을 확인합니다. 이러한 레코드가 있고 24 시간이 지나지 않은 경우 사용자 에게 새 비밀번호를 입력하라는 프롬프트가 표시됩니다 .
  5. 사용자가 새 비밀번호를 입력하고 확인을 누르면 다음 번까지 모든 사람이 행복하게 살 수 있습니다!

1
이것을 구현하는 가장 적절한 방법은 임시 암호 재설정 토큰을 사용자에게 일반 텍스트로 전자 메일로 보내지 만 (DB에는 일반 텍스트로 저장하지 마십시오)-사용자 가이 온도를 입력 한 후 즉시 강제로 새 비밀번호를 다시 입력하십시오. -편집증의 경우, smtp 서버에 SSL이 있는지 확인하여 민감한 정보가 포함 된 메일이 스누핑되지 않도록하십시오. 대부분의 경우이 방법은 매우 안전합니다. 귀하의 케이스에 추가 보안이 필요한 경우 암호를 잊어 버린 사용자가 없을 것입니다 : S
Kaushik Gopal

6
왜 임의의 문자열 / GUID를 생성하고 해시하고 해시를 사용합니까? guid가 충분하지 않습니까?
Jeroen K

15
@jeroenk-누군가 귀하의 DB를 훔친 경우 "비밀번호 재설정"링크를 위조하고 다른 사람의 비밀번호를 변경할 수 없습니다.
Vilx-

4
이것은 본질적으로 암호 crackstation.net/hashing-security.htm#faq
TruthOf42

1
@David-Ach, 게시물을 편집하고 싶지만 주제가 잠겨 있습니다. :( 확인, 다시 해보자 : 열을 포함 할 테이블이 : ID, UserID, Time, TokenHash.. 두 개의 임의의 긴 문자열을 생성합니다의 첫 번째 문자열 (이하 "ID")를 넣어 ID열, 해시를 두 번째 (이하 "토큰" )과의 해시를 넣어 TokenHash열 등의 링크를 생성합니다. forogotPassword.jsp?id=asdasd&token=asdasd링크의 토큰이 해시되지 않습니다 메이크업 감각을합니까 지금..?
Vilx-

28

그것은 모두 귀하의 사이트와 달성하려는 보안 수준에 달려 있지만 웹 응용 프로그램의 기본 프로세스는 다음과 같습니다.

  1. 사용자는 '비밀번호를 잊어 버렸습니다'페이지로 이동하여 사용자 이름 또는 이메일 (고유 한)을 입력하여 비밀번호 재설정을 요청합니다.

  2. 선택적으로이 단계에서 사전 정의 된 보안 질문에 대한 답변 또는 생년월일 등과 같은 추가 정보를 요청하여 요청을 확인할 수 있습니다.이 추가 레벨은 사용자가 요청하지 않은 이메일을받지 못하게합니다.

  3. 사용자 계정을 찾으십시오. 임시 비밀번호 (일반적으로 GUID)와 타임 스탬프를 계정 레코드에 저장하십시오. 임시 비밀번호가 포함 된 이메일을 사용자에게 보냅니다.

  4. 사용자는 이메일에 임시 비밀번호와 사용자의 식별자가 포함 된 링크를 클릭하거나 '내 비밀번호를 잊어 버렸습니다'페이지로 이동하여 임시 비밀번호와 해당 식별자를 복사하여 붙여 넣습니다. 사용자는 새 비밀번호를 입력하고 확인합니다.

  5. 사용자의 레코드를 검색하고 현재 시간이 2 단계에서 저장된 시간 소인의 지정된 시간 제한 (예 : 1 시간) 내에있는 경우 새 비밀번호를 해시하고 저장하십시오. (임시 암호가 일치하는 경우에만!). 임시 GUID 및 타임 스탬프를 삭제하십시오.

여기서 사용자는 비밀번호를 변경할 수있는 임시 비밀번호를 이메일로 발송 합니다. 원래 저장된 비밀번호 (해시해야 함)는 사용자가 기억할 경우를 대비해 임시 비밀번호로 변경되지 않습니다.

원래 비밀번호는 해시 및 알 수 없으므로 사용자에게 표시되지 않습니다.

참고 이 과정은 사용자의 이메일 계정의 보안에 전적으로 의존하고있다. 따라서 달성하려는 보안 수준에 따라 다릅니다. 일반적으로 대부분의 사이트 / 앱에 충분합니다.


24

트로이 헌트 (Troy Hunt)는 그의 기사에서 보안 암호 재설정 기능 구축에 대해 알고 싶었던 모든 것을 지적 합니다 . 가장 관련된 발췌는 다음과 같습니다.

[T] 일반적인 두 가지 접근 방식이 있습니다.

  1. 서버에서 새 비밀번호를 생성하고 이메일로 전송
  2. 재설정 프로세스를 용이하게하는 고유 한 URL을 이메일로 전송

반대에 대한 많은 안내에도 불구하고 첫 번째 요점은 실제로 우리가 원하는 곳이 아닙니다. 이 작업의 문제점은 암호를 사용하여 언제든지 다시 사용할 수있는 영구 암호가 안전하지 않은 채널로 전송되어받은 편지함에 있음을 의미합니다.

...

그러나 계정의 악의적 인 잠금을 간단하게 막을 수 있다는 점에서 첫 번째 접근 방식에는 한 가지 큰 문제가 있습니다. 웹 사이트에서 계정을 소유 한 사람의 이메일 주소를 알고 있다면 비밀번호를 재설정하여 원할 때마다 이메일 주소를 잠글 수 있습니다. 실버 플래터에 제공되는 서비스 거부 공격입니다! 이것이 재설정자가 요청자의 권한을 성공적으로 확인한 후에 만 ​​발생해야하는 이유입니다.

재설정 URL에 대해 이야기 할 때, 재설정 프로세스의이 특정 인스턴스에 고유 한 웹 사이트 주소에 대해 이야기합니다.

...

우리가하고 싶은 것은 재설정 URL의 일부로 전자 메일로 전송 된 다음 사용자 계정과 함께 서버의 레코드와 다시 일치시킬 수있는 고유 한 토큰을 생성하여 전자 메일 계정 소유자가 실제로 재설정하려는 사람임을 확인하는 것입니다. 암호. 예를 들어, 토큰은 "3ce7854015cd38c862cb9e14a1ae552b"일 수 있으며 리셋을 수행하는 사용자의 ID 및 토큰이 생성 된 시간과 함께 테이블에 저장됩니다 (자세한 내용은 더 자세히 설명). 이메일이 발송 될 때 "Reset /? id = 3ce7854015cd38c862cb9e14a1ae552b"와 같은 URL을 포함하고 있으며 사용자가이를로드하면 페이지에서 토큰의 존재를 확인하여 결과적으로 사용자의 신원을 확인하고 비밀번호를 허용합니다. 변경됩니다.

...

재설정 URL을 사용하여 수행하려는 다른 작업은 토큰을 시간 제한하여 특정 시간 (예 : 1 시간) 내에 재설정 프로세스를 완료해야합니다.

...

마지막으로, 이것이 일회성 프로세스인지 확인하고 싶습니다. 재설정 프로세스가 완료되면 재설정 URL이 더 이상 작동하지 않도록 토큰을 삭제해야합니다. 이전 시점과 마찬가지로, 이는 공격자가 재설정 URL을 남용 할 수있는 매우 제한된 창을 갖도록하기위한 것입니다. 또한 재설정 프로세스가 성공적으로 완료된 경우 토큰이 더 이상 필요하지 않습니다.

그는 정보 유출, 보안 문자, 2 단계 인증, 물론 암호 해싱과 같은 기본 모범 사례를 피하는 것에 대해 더 많은 지적을합니다. 본인은 Bruce Schneier의 회의에 대한 회의론을 선호하면서 보안 질문의 유용성에 대해 Troy에 동의하지 않는다는 점에 유의하는 것이 중요하다고 생각합니다 .

이 모든 질문의 요점은 백업 암호입니다. 비밀번호를 잊어 버린 경우 비밀 질문으로 신원을 확인할 수 있으므로 다른 비밀번호를 선택하거나 사이트에서 현재 비밀번호를 이메일로 보내도록 할 수 있습니다. 고객 서비스 관점에서 보면 좋은 생각입니다. 사용자는 임의의 암호보다 첫 번째 애완 동물의 이름을 잊어 버릴 가능성이 적지 만 보안이 끔찍합니다. 비밀 질문에 대한 대답은 좋은 암호보다 추측하기가 훨씬 쉽고 정보가 훨씬 더 공개적입니다.


1
이 링크에는 명확한 NSFW 이미지가 있으며이를 변경할 수있는 링크가 있지만 많은 사람들이 먼저 페이지를 스캔합니다. 바보 같은 생각!
nik0lai

트로이 헌트의 기사에 대한 링크가 변경되었습니다. 고토 troyhunt.com/everything-you-ever-wanted-to-know
knarfancho

@knarfancho 고마워요!
Dave Liepmann

15

나는 함께 갈 것이다 :

  1. 사용자에게 이메일 요청, 이메일 등록 확인
  2. GUID를 생성하여 해당 이메일로 전송
  3. 아직 비밀번호를 재설정하지 마십시오
  4. 사용자가 링크를 클릭 한 다음 새 패스를 입력해야합니다
  5. 사용자가 사이트에있는 후에 만 ​​비밀번호를 재설정하고 새 패스를 입력 한 후 재설정 버튼을 클릭하십시오.
  6. GUID를 짧은 기간 내에 만료 가능하게하여 더 안전하게 만드십시오.

질문하는 데 어려움을 겪고 싶지 않습니까? 그러나 그것은 당신의 대답과 관련이 있습니다. GUID를 어떻게 생성합니까?
KingAndrew

2
사람에게 보내는 링크에서 일종의 해시를 구현하지 않은 경우 -1
TruthOf42

11

이메일을 통해 정보를 보내면 안전하지 않습니다. 누군가가 얻을 수있는 방법은 너무 많습니다. 정보를 도용하려는 숙련 된 해커에게는 어린이 놀이가 될 것입니다.

암호 나 소득 정보와 같은 개인 정보가 유출되거나 도난당한 경우 귀하와 귀하의 조직에 매우 난 처해질 수 있으므로 이메일을 통해 개인 정보를 보내지 마십시오. 보안에 대해 진지하게 생각하십시오. 모든 벽돌이 떨어지기 위해서는 한 번의 사건이 필요합니다.

비밀번호 검색에 대해서는 비밀번호 분실 모범 사례를 자세히 읽으십시오 .

결론은 모범 사례를 따르는 응용 프로그램은 사용자가 자신의 암호를 다시 설정하도록 허용해야한다는 것입니다. 개인 보안 질문이 사용되어야합니다. 응용 프로그램은 전자 메일을 보내거나 암호를 표시하거나 임시 암호를 설정해서는 안됩니다.

편집 : 업데이트 링크



비밀번호 분실 모범 사례에 대한 링크를 시도했는데 500 서버 오류가 발생했습니다. 지금 서버가 다운되었다고 생각하거나 따라야 할 다른 링크가 있습니까?
KingAndrew


링크가 다시 죽었습니다.
Eric Cope


7

말했듯이, 그것은 필요한 보안 수준에 달려 있지만, 더 높은 수준이 필요한 경우 내가 본 몇 가지 새로운 솔루션이 있습니다.

  • 사용자의 신원이 확인되면 (암호 질문, 이메일 주소 등) 임시 비밀번호의 절반을 표시하고 나머지 절반은 이메일 계정으로 전송합니다. 전자 메일 계정이 손상된 경우 같은 사람이 중간자 공격을 수행했을 가능성이 거의 없습니다. (영국 정부 게이트웨이에서 본)

  • 이메일 및 다른 매체를 통해 신원 확인-예를 들어 텍스트를 통해 등록 된 모바일로 전송되는 코드. (eBay / PayPal에서 보임)

이 두 가지 극단 사이에 보안 질문을 구현하는 것은 DaveG가 언급 한 것처럼 진행될 수 있습니다.


6

등록시 이메일 주소를 포함하는 경우 "암호 분실"버튼은 해당 이메일 주소로 이메일을 보냅니다. 정보가 신뢰할 수있는 이메일로 전송되도록합니다.

(데이터베이스가 해킹되지 않은 한 안전하지는 않습니다).


5

다음은 비밀번호 재설정에 대한 정보를 제공하는 매우 유용한 링크입니다.

  1. http://jtauber.com/blog/2006/03/20/account_management_patterns/

  2. (사용자가 GET을 사용하여 확인하지 못하게 함) : http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15

  3. http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf

희망이 도움이됩니다. 그들은 분명히 문제를 이해하는 데 도움이되었습니다.


4

계정 전체에 고유 한 이메일 주소를 적용하고 싶습니다.

그런 다음 사용자가 비밀번호를 변경할 수있는 임시 페이지에 대한 링크를 보내는 것이 간단합니다. (24 시간 이하 허용)

이 시나리오에서는 사용자의 전자 메일 계정이 가장 약한 링크입니다.


2

사용자에게 비밀번호를 이메일로 보내지 마십시오. 자동 생성 되더라도. 최선의 접근 방식 (SANS 및 기타에서 권장 및 사용) :

  1. 비밀번호 분실 페이지에서 이메일 / 사용자 ID와 사용자의 새 비밀번호를 요청하십시오.
  2. 활성화 링크를 사용하여 해당 계정의 저장된 이메일에 대한 링크를 이메일로 보냅니다.
  3. 사용자가 해당 링크를 클릭하면 새 비밀번호를 활성화하십시오.

24 시간 내에 링크를 클릭하지 않으면 링크를 비활성화하여 더 이상 암호를 변경하지 않도록하십시오.

사용자 동의없이 비밀번호를 변경하지 마십시오. 누군가가 비밀번호 찾기 링크를 클릭하고 계정 이름을 알아 냈기 때문에 새 비밀번호를 이메일로 보내지 마십시오.


13
이 기술에 관심이 있습니다. 공격자는 이메일과 새 비밀번호를 입력합니다. 계정 소유자는 이메일을 수신하고 잘못 읽은 후 링크를 ​​클릭합니다. 1 분마다 새로운 비밀번호를 시도하는 공격자는 계정 소유자가 발생한 상황을 인식하고 결국 "비밀번호를 잊어 버렸습니다"페이지로 이동할 때까지 계정에 액세스 할 수 있습니다.
Odi-Xceed

또 다른 문제! 비밀번호 재설정 시간에 새 비밀번호를 제공하는 것은 좋은 옵션이 아닙니다. 몇 시간 후에 이메일을 확인하면 새 비밀번호를 다시 잊어 버릴 수 있습니다!
Yazid Erman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.