'Şifremi unuttum' uygulaması için en iyi yol? [kapalı]


154

"Şifremi unuttum" özelliğini uygulamak için en iyi yöntemi arıyorum.

2 fikirle çıktım:

  1. Kullanıcı şifremi unuttum'u tıkladığında, kullanıcı adını, e-postayı ve belki de doğum tarihini veya soyadını girmesi gerekir. Ardından, kullanıcı e-posta hesabına geçici şifreli bir posta gönderilir. Kullanıcı oturum açmak için geçici şifreyi kullanır ve şifresini sıfırlar.

  2. Benzer, ancak e-postada kullanıcının şifresini sıfırlamasına izin veren bir bağlantı bulunur.

Yoksa biri bana daha iyi ve güvenli bir yol önerebilir mi? Ayrıca geçici parola veya bağlantı göndermeyi, kullanıcıyı 24 saat içinde parolayı sıfırlamaya zorlamaya çalışıyorum, aksi takdirde geçici parola veya bağlantı kullanılamaz. Bu nasıl yapılır?


JSF'nin ötesine geçtiği için yazıyı yeniden etiketledim - muhtemelen bu şekilde daha fazla yanıt alırsınız.
McDowell

6
@Her kim bu ay meta üzerinde "XYZ çünkü bu kapalı soruyu silelim" dalgası var. Çözümlerin kusurlu olduğu kanıtlanmadığı ve varlığının kelimenin tam anlamıyla güvenlik vakasına yardımcı olduğundan daha fazla acı verdiğini kanıtlamadığı sürece, bu özel sorunun silinmemesi gerektiğini belirtmek isterim.
Félix Gagnon-Grenier

1
Unutulan bir şifre kurtarma stratejisi için OWASP "kopya kağıdı": owasp.org/index.php/…
daiscog

@Megaflop tarafından önerilen bağlantı ne yazık ki kesildi, işte yeni bağlantı: cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

Yanıtlar:


187

Güncelleme: Mayıs 2013'te daha iyi bir yaklaşım için revize edildi

  1. Kullanıcı kullanıcı adını girer ve "şifremi unuttum" a basar. Kullanıcı adları bazen de unutulduğundan, kullanıcı adı yerine e-posta adresini girme seçeneğini de öneririm.
  2. Sistem bir tablo vardır password_change_requestssütunlu ID, Timeve UserID. Yeni kullanıcı düğmeye bastığında, tabloda bir kayıt oluşturulur. TimeSütun kullanıcı "Şifremi Unuttum" butonuna basıldığında saati içerir. Bu IDbir dizedir. Uzun bir rastgele dize oluşturulur (örneğin, bir GUID) ve daha sonra bir parola (kendi içinde ayrı bir konu olan) gibi karma hale getirilir . Bu karma daha sonra tabloda 'ID' olarak kullanılır.
  3. Sistem kullanıcıya içinde bağlantı içeren bir e-posta gönderir. Bağlantı ayrıca orijinal kimlik dizesini içerir (karma işleminden önce). Bağlantı böyle bir şey olacaktır: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. Forgotpassword.jsp sayfası ID parametresini alabilmelidir. Üzgünüz, Java bilmiyorum, bu yüzden daha spesifik olamam.
  4. Kullanıcı e-postadaki bağlantıyı tıkladığında sayfanıza taşınır. Sayfa ID, URL'den alınır, tekrar karmalanır ve tabloya karşı kontrol edilir. Böyle bir kayıt varsa ve 24 saatten daha eski değilse, kullanıcıya yeni bir parola girmesi istenir .
  5. Kullanıcı yeni bir parola girer, Tamam'ı vurur ve herkes sonsuza dek mutlu yaşar ...

1
Bunu uygulamanın en uygun yolu - geçici parola sıfırlama belirtecini kullanıcıya düz metin olarak e-posta olarak göndermek (ancak DB'de asla düz metin olarak saklamamak) olacaktır - kullanıcı bu sıcaklığa girdikten sonra onu hemen yeni bir şifre girin. - paranoyak için, smtp sunucunuzda SSL olduğundan emin olun, böylece hassas bilgiler içeren postalarınız göz ardı edilmez. çoğu durumda, bu yaklaşım oldukça güvenlidir. davanız daha fazla güvenlik gerektiriyorsa, muhtemelen şifrelerini unutan kullanıcılara sahip olmamalısınız: S
Kaushik Gopal

6
Neden rastgele bir dize / guid oluşturmalı, hash ve hash kullanmalı? Rehber yeterli değil mi?
Jeroen K

15
@jeroenk - Eğer birisi DB'nizi çalarsa, bir "Şifreyi Sıfırla" bağlantısı kurup birinin şifresini değiştiremez.
Vilx-

4
bu aslında bir parolayı düzgün bir şekilde sıfırlamanın açıklanan yoludur crackstation.net/hashing-security.htm#faq
TruthOf42

1
@David - Ach, yazıyı düzenlemek istedim ama konu kilitlendi. :( Tamam, tekrar deneyelim: sütunları da yer alır tablo: ID, UserID, Time, TokenHash.. Sen İKİ uzun, rastgele dizeleri üretecektir ilk dizeyi ( "id") koyun IDsütununda; karma ikinci ( "belirteç" ) ve karmayı TokenHashsütuna koyun . Bağlantıyı oluşturmak gibi forogotPassword.jsp?id=asdasd&token=asdasd. Bağlantıdaki simge karma DEĞİLDİR. Bu şimdi mantıklı geliyor mu?
Vilx-

28

Her şey sitenize ve elde etmeye çalıştığınız güvenlik düzeyine bağlıdır, ancak bir web uygulaması için temel işlem aşağıdaki gibi bir şeydir:

  1. Kullanıcı 'şifremi unuttum' sayfasına gider ve şifre sıfırlama istemek için kullanıcı adını veya e-postasını (hangisi benzersizse) girer.

  2. İsteğe bağlı olarak bu aşamada, önceden tanımlanmış bir güvenlik sorusunun yanıtı veya doğum tarihleri ​​vb. Gibi ek bilgiler isteyerek isteği onaylayabilirsiniz. Bu ek düzey, kullanıcıların istemedikleri e-postaları almasını durdurur.

  3. Kullanıcının hesabına bakın. Geçici bir parolayı (genellikle GUID) ve zaman damgasını hesap kaydına kaydedin. Geçici şifreyi içeren kullanıcıya bir e-posta gönderin.

  4. Kullanıcı, geçici şifreyi ve e-postadaki kullanıcının tanımlayıcısını içeren bağlantıyı tıklar veya 'şifremi unuttum' sayfasına gider ve geçici şifreyi ve tanımlayıcılarını kopyalayıp yapıştırır. Kullanıcı yeni şifresini girer ve onaylar.

  5. Kullanıcının kaydını arayın ve geçerli saat, 2. adımda kaydedilen zaman damgasının belirtilen bir zaman sınırı içinde (örneğin 1 saat) ise, karma yapın ve yeni şifreyi kaydedin. (Açıkçası sadece geçici şifreler eşleşirse!). Geçici GUID ve zaman damgasını silin.

Buradaki temel nokta, kullanıcıya parolalarını değiştirmelerine izin veren geçici bir parola gönderilmesidir . Başlangıçta saklanan parola (karmalanmalıdır!), Kullanıcının hatırlaması durumunda hiçbir zaman geçici bir parola ile değiştirilmez.

Orijinal parola, karma ve bilinmediği için kullanıcıya hiçbir zaman gösterilmez.

Bu işlemin tamamen kullanıcının e-posta hesabının güvenliğine dayandığını unutmayın . Bu nedenle, elde etmek istediğiniz güvenlik düzeyine bağlıdır. Bu genellikle çoğu site / uygulama için yeterlidir.


24

Troy Hunt, güvenli bir şifre sıfırlama özelliği oluşturma hakkında bilmek istediğiniz her şey makalesinde bazı mükemmel noktalar sunuyor . En alakalı alıntılar:

[T] iki ortak yaklaşım:

  1. Sunucuda yeni bir şifre oluşturun ve e-postayla gönderin
  2. Sıfırlama işlemini kolaylaştıracak benzersiz bir URL'ye e-posta gönderin

Aksine çok sayıda rehberliğe rağmen, ilk nokta gerçekten olmak istediğimiz yer değil. Bunu yapmanın problemi, kalıcı bir parola anlamına gelir - geri dönüp istediğiniz zaman kullanabilirsiniz - artık güvenli olmayan bir kanal üzerinden gönderilmiştir ve gelen kutunuzda bulunur.

...

Ancak ilk yaklaşımda, bir hesabın kötü amaçlı kilitlenmesini kolaylaştıracak bir büyük sorun daha var. Bir web sitesinde bir hesabı olan birinin e-posta adresini biliyorsanız, o zaman sadece şifresini sıfırlayarak lütfen ne zaman istersen onları dışarı kilitleyebilirsiniz; gümüş bir tepside servis reddi saldırısı! Bu nedenle sıfırlama, yalnızca istekte bulunanın bunu yapma hakkını başarıyla doğruladıktan sonra yapılması gereken bir şeydir.

Bir sıfırlama URL'si hakkında konuşurken, sıfırlama işleminin bu özel örneğine özgü bir web sitesi adresinden bahsediyoruz.

...

Yapmak istediğimiz şey, sıfırlama URL'sinin bir parçası olarak bir e-postada gönderilebilen ve daha sonra kullanıcının hesabıyla birlikte sunucudaki bir kayıtla eşleştirilebilen benzersiz bir token oluşturmaktır, böylece e-posta hesabı sahibinin gerçekten parola. Örneğin, belirteç “3ce7854015cd38c862cb9e14a1ae552b” olabilir ve sıfırlamayı gerçekleştiren kullanıcının kimliğinin ve belirtecin oluşturulduğu zamanın (bir anda daha fazla) yanında bir tabloda saklanır. E-posta gönderildiğinde, “Sıfırla /? İd = 3ce7854015cd38c862cb9e14a1ae552b” gibi bir URL içerir ve kullanıcı bunu yüklediğinde, sayfa belirtecin varlığını kontrol eder ve sonuç olarak kullanıcının kimliğini doğrular ve parolanın değiştirilebilir.

...

Sıfırlama URL'si ile yapmak istediğimiz diğer bir şey de, sıfırlama işleminin belirli bir süre içinde, örneğin bir saat içinde tamamlanması için jetonu zaman sınırlamasıdır.

...

Son olarak, bunun bir defalık bir süreç olmasını sağlamak istiyoruz. Sıfırlama işlemi tamamlandıktan sonra, sıfırlama URL'sinin artık çalışmaması için belirteç silinmelidir. Önceki noktada olduğu gibi, bu da bir saldırganın sıfırlama URL'sini kötüye kullanabileceği çok sınırlı bir pencereye sahip olmasını sağlamaktır. Elbette sıfırlama işlemi başarıyla tamamlandıysa jetona artık gerek yoktur.

Bilgi sızıntılarından, CAPTCHA'lardan, iki faktörlü kimlik doğrulamasından ve elbette şifre karmaşası gibi temel en iyi uygulamalardan kaçınmak konusunda çok daha iyi noktalara değiniyor. Bruce Schneier'in uygulama konusundaki şüpheciliğini tercih ederek, Troy ile güvenlik sorularının yararlılığına katılmadığımı belirtmek önemlidir :

Tüm bu soruların noktası aynı: bir yedek şifre. Şifrenizi unutursanız, gizli soru kimliğinizi doğrulayabilir, böylece başka bir şifre seçebilir veya sitenin mevcut şifrenizi size e-postayla göndermesini sağlayabilirsiniz. Müşteri hizmetleri açısından harika bir fikir - bir kullanıcının ilk evcil hayvanının adını rastgele bir paroladan daha az unutması olasıdır - ancak güvenlik için korkunçtur. Gizli sorunun cevabını tahmin etmek iyi bir şifre olmaktan çok daha kolaydır ve bilgiler çok daha halka açıktır.


1
Bu bağlantının net NSFW görüntüleri var, bunu değiştirmek için bir bağlantı var, ancak birçok kişi önce bir sayfayı tarar. Aptalca bir fikir!
nik0lai

Troy Hunt'un makalesinin bağlantısı değişti. Goto troyhunt.com/everything-you-ever-wanted-to-know
knarfancho

@knarfancho Düzeltildi, teşekkürler!
Dave Liepmann

15

Şununla gideceğim:

  1. Kullanıcıdan e-posta isteyin, e-postanın kayıtlı olup olmadığını kontrol edin
  2. GUID oluşturun ve bu e-postaya gönderin
  3. Henüz şifreyi sıfırlama
  4. Kullanıcı bağlantıyı tıklatır ve ardından yeni geçiş girmesi gerekir
  5. Parolayı yalnızca kullanıcı sitenize girdikten sonra sıfırlayın ve yeni geçiş yazdıktan sonra sıfırla düğmesini tıkladıysanız.
  6. Daha güvenli hale getirmek için GUID'yi kısa bir süre içinde süresi dolabilir hale getirin.

Sormakta zorlanmak istemiyorum? ama cevabınızla ilgili. GUID'i nasıl oluşturuyorsunuz?
KingAndrew

2
-1, kişiye gönderdiğiniz bağlantıya bir tür karma uygulamadığınız için
TruthOf42

11

Herhangi bir bilgiyi e-posta ile gönderdiğinizde güvenli olmayacaktır. Birinin bunu elde etmesinin çok fazla yolu var. Bilgilerinizi çalmak isteyen yetenekli bir hacker için çocuk oyuncağı olurdu.

Parolalar ve gelir bilgileri gibi kişisel bilgileri e-posta yoluyla göndermekten kaçının, çünkü bu bilgiler sızdırılırsa veya çalınırsa sizin ve kuruluşunuz için ÇOK UCUZ olabilir. Güvenliği ciddiye alın. Tüm tuğlaların düşmesi sadece bir olayı alır.

Şifre almaya gelince, Şifremi Unuttum En İyi Uygulamalarını iyice okuyun .

Sonuç olarak, en iyi uygulamaları izleyen bir uygulama kullanıcının kendi şifresini sıfırlamasına izin vermelidir. Kişisel güvenlik soruları kullanılmalıdır. Uygulama e-posta göndermemeli, şifreleri görüntülememeli veya geçici şifreler ayarlamamalıdır.

DÜZENLE: Güncellenmiş bağlantı



Şifremi Unuttum En İyi Uygulamalar bağlantısını denedim ve 500 sunucu hatası aldım. Sunucu şu anda çalışmıyor mu yoksa takip edilecek başka bir bağlantı var mı?
KingAndrew


bağlantı tekrar öldü.
Eric Cope


7

Söylendiği gibi, gerekli güvenlik seviyesine bağlıdır, ancak daha yüksek bir seviyeye ihtiyacınız varsa, gördüğüm bazı yeni çözümler arasında;

  • Kullanıcının kimliği doğrulandığında geçici şifrenin yarısının (güvenlik sorusu, e-posta adresi vb.) Görüntülenmesi, diğer yarısının e-posta hesabına gönderilmesi. E-posta hesabının güvenliği ihlal edilmişse, aynı kişinin ortadaki adam saldırısını da gerçekleştirmesi olası değildir. (İngiltere Devlet Geçidi'nde görülüyor)

  • Kimliği e-posta ve başka bir araçla onaylama - örneğin, kayıtlı bir cep telefonuna metin yoluyla gönderilen bir kod. (EBay / PayPal'da görüldü)

Çünkü bu iki uç arasında bir yerde güvenlik soruları uygulamak DaveG tarafından belirtildiği gibi gidilebilir.


6

Kayıtlı bir e-posta adresi eklerseniz. "Parolayı unut" düğmesi söz konusu e-posta adresine bir e-posta gönderir. Bilgilerin güvenilir bir e-postaya gönderilmesini sağlar.

(Veritabanı saldırıya uğramadıkça, ancak hiçbir şey güvenli değilse).



4

Hesaplar arasında benzersiz e-posta adreslerini zorunlu tutarım.

O zaman geçici bir sayfaya bağlantı göndermek, kişinin şifresini değiştirmesini sağlayan basit bir konudur. (24 saat veya daha azına izin verin)

Kullanıcının e-posta hesabı, bu senaryodaki en zayıf bağlantıdır.


2

Kullanıcıya asla bir şifre göndermeyin. Otomatik olarak oluşturulmuş olsa bile. En iyi yaklaşım (SANS ve diğerleri tarafından önerilir ve kullanılır):

  1. Şifremi unuttum sayfasında, e-posta / kullanıcı kimliğini ve kullanıcıdan YENİ bir şifre isteyin.
  2. Bir etkinleştirme bağlantısıyla söz konusu hesaba ait saklanan e-postanın bağlantısını e-postayla gönderin.
  3. Kullanıcı bu bağlantıyı tıkladığında yeni şifreyi etkinleştirin.

24 saat içinde bağlantıyı tıklamazsa, bağlantıyı devre dışı bırakın (böylece artık parolayı değiştirmez).

Kullanıcı izni olmadan asla şifreyi değiştirmeyin. Birisi şifreyi unuttum bağlantısını tıklayıp hesap adını çözdüğü için yeni bir şifre göndermemeniz anlamına gelir.


13
Bu teknikle ilgileniyorum. Saldırgan e-postanızı ve YENİ bir şifre girer. Hesap sahibi e-postayı alır, bir şeyi yanlış yazar ve bağlantıyı tıklar. Saldırgan beklemede, her dakika yeni şifre denemekle hesap sahibi ne olduğunu anlayana ve sonunda "şifremi unuttum" sayfasına gidene kadar hesaba erişim kazanır.
Odi - Xceed

Başka bir sorun! şifre sıfırlama süresinde yeni bir şifre sağlamak iyi bir seçenek değildir. Saatler sonra e-postamı kontrol edersem yeni şifreyi tekrar unutabilirim!
Yazid Erman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.