programing

가장 좋은 "비밀번호 분실"방법은 무엇입니까?

kingscode 2021. 1. 15. 08:26
반응형

가장 좋은 "비밀번호 분실"방법은 무엇입니까?


중복 가능성 : 비밀번호 찾기 :
비밀번호 찾기 기능을 구현하는 가장 좋은 방법은 무엇입니까?

저는 커뮤니티 웹 사이트를 프로그래밍하고 있습니다.

"비밀번호 찾기"기능을 만들고 싶습니다.

여러 사이트를 살펴보면 다음 세 가지 옵션 중 하나를 사용하는 것으로 나타났습니다 .

  1. 사용자 에게 비밀번호를 변경할 수 있는 고유하고 숨겨진 URL (Gmail 및 Amazon)에 대한 링크가 포함이메일을 보냅니다.

  2. 사용자에게 무작위로 생성 된 새 비밀번호 (Wordpress) 이메일을 보냅니다.

  3. 사용자 에게 현재 암호 (www.teach12.com)를 보냅니다.

옵션 # 3 이 사용자에게 가장 편리해 보이지만 암호를 MD5 해시로 저장했기 때문에 MD5가 되돌릴 수 없기 때문에 옵션 # 3을 어떻게 사용할 수 있는지 알 수 없습니다 . 이것은 또한 웹 사이트가 암호를 일반 텍스트로 어딘가에 저장해야하고 최소한 일반 텍스트 암호가 안전하지 않은 전자 메일을 통해 사용자에게 전송된다는 것을 의미 하므로 안전하지 않은 옵션 인 것 같습니다 . 아니면 여기에 뭔가 빠졌나요?

그래서 1 번 옵션을 할 수 없다면, 2 번 옵션 은 사용자의 비밀번호를 변경하여 그에게 보내야하기 때문에 프로그램 하기 가장 간단한 것 같습니다 . 이 있지만 다소 불안 은 라이브 암호를 통해 안전하지 않은 전자 메일을 전달하고 있어야하기 때문이다. 그러나 이것은 또한 문제를 일으키는 사람들이 임의의 이메일을 입력하고 다양한 사용자의 암호를 지속적으로 변경하여 사용자괴롭히기 위해 오용 할 수 있습니다 .

옵션 # 1가장 안전 해 보이지만 만료되는 숨겨진 URL 등을 처리하기 위해 약간의 추가 프로그래밍이 필요하지만 큰 사이트에서 사용하는 것 같습니다.

이러한 다양한 옵션을 사용 / 프로그래밍 한 경험은 무엇입니까? 내가 놓친 옵션이 있습니까?


4) 두 개의 무작위 금액을 은행 계좌에 입금하고 입력하도록 요청합니다.
5) Snail에게 새 비밀번호를 메일로 보내고 입력하도록 요청합니다.
6) 문자를 보내거나 전화를 걸어 전화에 값을 입력합니다. 파일에 등록 된 휴대폰 번호.
7) Stack Overflow, Facebook, 블로그 엔진 등과 같은 OpenID 제공 업체에 아웃소싱하여 비밀번호 관리 문제를 완전히 해결하세요.

그 외에는 옵션 # 1 또는 # 2를 사용하여 둘 다 한 시간 내에 만료되는 추가 기능을 사용하십시오.


나는 # 1과 # 2를 동등하게 설명하는 답변에 대한 찬성 투표에 충격을 받았습니다. 전혀 그렇지 않습니다. 사용자에게 암호를 변경하기위한 단기 링크를 보내는 것은 대역 외 상호 작용 (메일, 텍스트 메시지 등)을 포함하지 않는 가장 편리하고 가장 일반적으로 사용되며 가장 안전한 접근 방식입니다. 몇 가지 이유 :

  1. 비밀번호 분실 링크를 통해 임시 비밀번호를 설정하면 사용자가 사용자의 로그인을 알고있는 경우 사용자의 비밀번호를 효과적으로 변경하고 사용자를 계정에서 잠글 수 있습니다. 링크를 통해 사용자는 누군가가 엉망이되고 있으며 액세스에 영향을 미치지 않는다는 것을 알 수 있습니다.
  2. 암호 재설정 링크는 짧은 기간 동안 만 유효하므로 공격자가 공격 할 수있는 매우 작은 창이 있습니다. 그리고 그들이 그렇게하더라도 공격자가 링크를 가로 채서 암호를 변경하는 데 사용하면 재설정 링크가 더 이상 작동하지 않기 때문에 사용자는 알 수 있습니다. 사용자가 새로 할당 된 암호를 즉시 변경하지 않으면 암호 를 가로 챈 공격자가 사용자를 무기한으로 가장 할 수 있습니다 . 따라서 큰 차이점은 해커가 비밀번호 재설정 링크 이메일을 가로 챌 수 있지만 링크를 사용하여 사용자의 비밀번호를 변경 하면 링크가 작동하지 않고 또 다른 비밀번호 재설정을 생성하기 때문에 사용자가 무언가 잘못되었음을 알게됩니다. 의뢰.
  3. 사용하기 더 쉬움-사용자는 생성 한 새 임의의 비밀번호를 입력하는 대신 이메일의 링크를 클릭하기 만하면됩니다.

그리고 보안 질문은 종종 사이트의 보안을 떨어 뜨리는 것이 아니라 덜 안전하게 만듭니다. 이는 또 다른 공격 벡터이며 가장 취약한 링크입니다. 이 주제에 대한 훌륭한 토론을 위해 웹 애플리케이션 해커 핸드북읽는 것이 좋습니다 .


옵션 # 2는 또한 이전 암호를 추적하고 24 시간 이내에 사용하지 않으면 새 임의 암호를 만료하도록 요구합니다.

그렇지 않으면 새로운 임의의 비밀번호를 반복해서 발행하여 짜증을 낼 수 있습니다. 이메일 근처에 있지 않으면 일반 비밀번호로 로그인 할 수없는 이유를 모를 수 있습니다.

또한 "식별 질문"을 요구 하지 마십시오 . 이러한 질문에 대한 답은 일반적으로 실제 암호보다 추측 / 조회하기가 훨씬 더 쉽기 때문에 모든 사람이 자신을 나로 식별 할 수 있습니다. 이것이 얼마나 안전하지 않은지에 대한 최근의 예 Sarah Palin 이야기를 참조하십시오 .


옵션 1과 2는 서로 안전하지 않습니다.

그곳에. 내가 말했어. 사용자의 이메일 계정이 유출 된 경우 주소, 어머니의 결혼 전 이름과 같은 더 많은 개인 정보를 수집하지 않는 한 작업을 수행 할 합리적인 안전한 방법이 없습니다. 모두 추측 할 수 있습니다.

내가 본 최고의 (가장 성가신) 버전은 비밀 질문 비밀 답변을 기억해야하는 곳 입니다. 이는 사용자가 어떤 질문을했는지 기억해야 함을 의미하며, 어떤 질문은 항상 잊혀 질 수 있습니다!

그들이 질문을 잊고 당신이 "진짜"회사 인 경우, 모든 보안을 재설정하는 방법에 대한 지침과 함께 게시물을 통해 사용자에게 토큰을 보낼 수있는 옵션이 항상 있습니다. 해커가 액세스 권한을 가질 가능성은 거의 없습니다. 그들의 실제 메일에.

사용자가 계정을 만들 때 전화 번호를 수집하는 것이 왜곡됩니다. 그것이 존재하고 그들이 그들의 세부 사항을 기억할 수 없다면, 당신은 그들의 세부 사항을 재설정하는 방법을 알려주는 일종의 자동 호출 시스템을 설정할 수 있습니다.

그리고 # 2에 대해 언급 할 한 가지 : 프로세스가 현재 계정 암호를 덮어 쓰지 않도록하십시오. 이런 일이 발생하면 누군가 계정의 비밀번호를 잊어 버렸다고 말하여 원치 않는 비밀번호 변경을 많이 유발할 수 있습니다.


옵션 1 또는 2의 보안에는 실질적인 차이가 없습니다. 옵션 1은 양식에 새 암호를 미리로드하는 것과 사실상 동일합니다.

사실, 피싱 공격이 널리 퍼짐에 따라 긴 URL로 옵션 1을 사용하도록 장려하면 사람들이 긴 미스테리 한 URL을 클릭하는 것에 대해주의를 덜 기울일 수 있다고 주장 할 수 있습니다.


OWASP 상위 10 개읽고 방법이 규정을 준수하는지 확인하십시오.

여기 에 직접 링크가 있습니다.


귀하의 질문과 관련되지 않은 사항에 대한 간단한 메모입니다. MD5를 사용하여 저장된 암호를 해시했다고 언급하셨습니다. 옵션 1을 사용하든 2를 사용하든 (분명한 이유로 3이 가장 안전하지 않음) MD5는 크랙 된 해싱 알고리즘이며 실제로 해커가 MD5 해싱.

다음 URL에서 취약점에 대한 자세한 내용을 읽을 수 있습니다. en.wikipedia.org/wiki/MD5

더 나은 해싱 솔루션은 여전히 ​​안정적이고 안전한 해싱 알고리즘 인 SHA와 같은 것입니다. 옵션 # 1 또는 # 2와 결합하여 가장 확고한 해커를 제외한 모든 사용자의 암호를 보호하기 위해 합리적으로 안전한 시스템을 갖추어야합니다.


옵션 # 1이 아마도 최고 일 것입니다. # 3은 안전하지 않습니다 (또한 SHA1과 같은 MD5보다 강력한 것을 사용하는 것이 좋습니다). 옵션 # 2는 보안 질문을 사용하지 않는 한 이메일을 확인할 때까지 임의의 사람이 귀하의 계정을 잠글 수 있기 때문에 좋지 않습니다. 그리고 보안 질문은 암호보다 해독하기가 더 쉽습니다.


옵션 # 1은 # 2에 비해 몇 가지 주요 이점이 있습니다. 임의의 사용자가 "비밀번호를 잊어 버렸습니다"상자에 내 이메일 주소를 입력하면 내 비밀번호가 재설정되지 않습니다. 또한 Gmail받은 편지함에 영구적으로 저장된 사이트 비밀번호 기록이 없다는 점에서 약간 더 안전합니다.

여기서 중요한 누락 부분은 # 1에서 제공하는 링크 가 한 번의 암호 재설정에만 작동하고 시간 제한이 있다는 것입니다.

이러한 모든 솔루션은 이메일받은 편지함을 모두를 지배하는 "하나의 링"으로 취급하고 있음을 의미합니다. 어쨌든 대부분의 온라인 서비스는 요즘 이런 일을하는 것 같습니다.

내가 선호하는 접근 방식은 가능한 경우 openid를 사용하는 것입니다. 암호 관리는 아무도 옳지 않은 것처럼 보입니다. 이 문제를 다른 사람에게 넘기는 것이 더 쉽습니다.


옵션 4 : 사용자가 계정 이름과 이메일 주소를 입력하여 비밀번호를 재설정하도록 요구합니다. 사이트에 실제 이름이나 이메일 주소를 공개하지 않는 한 (현재 시대에 왜 그렇게 하시겠습니까?) 이것은 합리적으로 안전하고 변조 방지 방법입니다. 비밀번호 자체가 아닌 재설정 페이지에 대한 링크를 보냅니다.

옵션 5 : OpenID를 사용 하고 책임을 제 3 자에게 넘겨서 걱정할 수 있습니다.

Honestly though this is a lot more effort than most sites require. I for one LIKE receiving plaintext passwords by email because I store them in a "registrations" folder in my inbox. That way I can lookup passwords for sites when I forget them (which happens a lot!). If somebody is reading my email I have bigger problems to worry about than people using my twitter account (if I had one). Of course banks and corporations have stronger requirements but you didn't specify what your site is. That's the key to the best answer.


I agree with your comments about option #3 being insecure.

As for programming either #1 or #2, option #2 is easier to program but #1 isn't much harder and both are probably about as secure as each other.

Whichever option you choose, you can also consider making it more secure by including requests for personal information (that you obtain during registration) as part of the forgotten password process.

I've programmed systems where you have a username and to get a new password you have to enter both your username and your email address. You can get sent a reminder of your username but the main point is that someone probably won't be able to guess your username and your email but if you do it just on email, there's less secure.

Secret questions are an approach to the personal information part. I personally think they don't offer a lot of value as people tend to choose questions that many people will either know the answer to, be able to guess or be able to find out. It is better than nothing however so long as you use it in conjunction with an already relatively secure method.

Obviously the more of this you do, the more programming work it is.

The simplest method is:

  1. Have a "remind me of my username" link (enter email). Don't tell the user if an email was sent or not because people can use that to find out if an email address is of a member. Always tell the user to check their inbox for the reminder email but only send it if someone is a member; and
  2. Require both username and email to get sent a new one-time password. That password should only last an hour or so. When the user uses it, they should be forced to change their password immediately.

Either option 1 or 2 would be fine. As you said, option 3 is insecure as you would need to store the clear text password. You could probably get fancy and use a reversible encryption algorithm to store/retrieve the password, but with better alternatives available to you there's no reason to go down that road.


There is an additional option that you can use in combination with any of the options that you mention:

You can let the user write a reminder for their password, that you send to them as the first step when they have forgotten the password. If the reminder doesn't help the user, you can go on to the next option.

As the reminder isn't the password itself, it's safe to send by mail (or perhaps even display directly on the page).


If you are hashing them Option 3 is unavailable and if you are not hashing them, shame on you. :)

I prefer option 1, sending a reset password link sent to their email which allows them (for a limited time) to reset their password. It does require more work, but it's easy for them to use and ultimately as secure as their email login process.


You could made a mix between #1 and #2, taking advantages from both:

Send the user an email with a link to a unique, hidden URL that allows him to change a new randomly generated password.

That page could be SSL, and the password could expire in 12-24 hours.


I've tried a couple of methods that I've not really been happy with. What I've settled on for the next project is to:

  1. User enters username and email address
  2. Email sent with link containing url and guid param which has been stored in db with 48 hour expiry
  3. User confirms password to be reset
  4. New password is emailed to user
  5. Login with new password displays message or redirects to change password page.

Instruct the user come personally to your offices and prove her identity with id card or passport.

This, of course, assumes that you have offices near your users and that the account are valuable enough to justify this procedure. Suitable for example banks.

ReferenceURL : https://stackoverflow.com/questions/901639/what-is-the-best-forgot-my-password-method

반응형