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

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

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

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

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

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



답변

업데이트 : 더 나은 접근 방식을 위해 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. 사용자는 ‘비밀번호를 잊어 버렸습니다’페이지로 이동하여 사용자 이름 또는 이메일 (고유 한)을 입력하여 비밀번호 재설정을 요청합니다.

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

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

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

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

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

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

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


답변

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

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

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

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

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

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

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

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

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

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

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


답변

나는 함께 갈 것이다 :

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

답변

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

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

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

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

편집 : 업데이트 링크


답변

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

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

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

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


답변

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

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