'İf password == XXXXXXX' minimum güvenlik için yeterli mi?


20

Orta ila düşük güvenlik riski olan bir uygulama için bir giriş oluşturursam (başka bir deyişle, bir bankacılık uygulaması veya herhangi bir şey değil), kullanıcı tarafından girilen bir şifreyi yalnızca şöyle bir şey söyleyerek doğrulamak benim için kabul edilebilir mi:

if(enteredPassword == verifiedPassword)
     SendToRestrictedArea();
else
     DisplayPasswordUnknownMessage();

Etkili olmak kolay görünüyor, ancak gerekli olan her şeyin bu olup olmadığını kesinlikle umursamıyorum. Kullanıcı adı / şifre kombinasyonu üzerinde basit bir kontrol yeterli mi?

Güncelleme: Belirli bir proje bir web hizmeti olur, doğrulama tamamen sunucu tarafındadır ve açık kaynak değildir. Alan adı, bununla nasıl başa çıkacağınızı değiştiriyor mu?


3
geçerli Parola nereden geliyor? kodlanmışsa, kodu değiştirmeden şifreyi yapılandıramaz / değiştiremezsiniz. Bir yapılandırma dosyasından geliyorsa, dosyaya erişen herkes tarafından görülebilir.
Alb

1
"kullanıcı adı / şifre combo üzerinde bir kontrol yeterli" ne yapmak için?
Chris

3
@opinion: bunun bir giriş yapmamaktan ÖNEMLİ olduğu pek olası görünmüyor. Lütfen bu kadar güçlü bir iddia için bir neden belirtin.
Morgan Herlocker

1
Terminolojiniz yanlış, bir şifreyi karşılaştırırken doğruladığınızdan, geçerli olduğundan emin değilsiniz. Lütfen farkı anlamak için zaman ayırın.
billy.bob

1
Bu sorumsuz olan düz metin parola depolaması anlamına gelir. Ayrıca, potansiyel bir saldırgana çok fazla bilgi sağlayan bir kullanıcının şifrenin yanlış olduğu konusunda uyarılması anlamına gelir. Her zaman belirsiz olmalısınız, yani "Giriş veya şifre yanlış".
Rein Henrichs

Yanıtlar:


26

SSL olmadan değil

Parola ağ üzerinden düz metin olarak gönderilirse bu güvenli değildir. Parola ağ üzerinden düz metin olarak gönderilirse, sunucu tarafında parolayı karma yapmak güvenli değildir.

HTML <input type="password"/>etiketi, içeriğini düz metin olarak gönderdiğinden, web siteniz şifreyi iletmek için SSL kullanmadığı sürece, şifreyi sunucuda nasıl saklarsanız saklayın, bu bir sorun olacaktır.

(Tarayıcıda şifre isteyen bir iletişim kutusu açan HTTP kimlik doğrulaması, sunucunun ve tarayıcının ortak kimlik doğrulama mekanizmalarına bağlı olarak açık metin olabilir veya olmayabilir. SSL.)

Site yöneticileri şüpheli değilse değil

Şimdi, web sitesini yapmak için HTTPS kullandığınızı varsayarsak, site yöneticilerinize (düz metin şifrelerini okuyabilen) ve makineye erişimi düzgün olan diğer kişilere güveniyorsanız bu güvenli olabilir. Şimdi, web sitenizle istedikleri her şeyi yapabildikleri açıktır (yönettiklerinden beri), ancak şifreyi okuyabilirlerse, çalınan giriş / şifre çiftlerini başkalarının sitelerinde de kullanabilirler.

Şifreleri yönetici tarafından güvende tutmanın bir yolu

Parolaları depolamanın ve kontrol etmenin güvenli bir yolu aşağıdaki gibidir:

def change_password user, new_password
  salt = random(65536).to_s(16) #will be 4 characters long
  password_hash = salt + hash(salt + new_password)
  store(user,password_hash)
end

def does_password_match? user, entered_password
  correct_password_hash = retrieve(user)
  salt = correct_password_hash[0...4]
  entered_password_hash = salt + hash(salt + entered_password)
  return correct_password_hash == entered_password_hash
end

Karma işlevi için, güçlü bir şey ve henüz vahşi doğada iyi gökkuşağı tabloları olmayan bir şey kullanmaya çalışın. Gerekirse tuz masalarının uzunluğunu değiştirebilirsiniz.

İçinde bulunduğunuz ortama, ağ gecikmenizdeki değişkenliğe ve kullanıcı adlarının genel olarak bilinip bilinmediğine bağlı olarak, hash('0000'+entered_password)saldırganların hangi kullanıcı adlarının geçerli olacağına bağlı olarak parolanın yanlış olduğunu belirleyin.


1
İyi tavsiyeler :) SSL ile ilgili olarak, vahşi ortamda işe yarayacak bir şey tasarlamamız ve şifreyi (Javascript gerektirir) kodlamak ve daha sonra sunucuda kodunu çözmek için asimetrik kriptografi kullanmamız gerekiyordu. Daha sonra tuz + karması normal olarak oluşur. Ayrıca, ortak anahtar web sayfasıyla gönderildiğinden, sık sık keyfi olarak değişebilir.
Matthieu M.

1
@Matthieu M .: Birisi web sayfanızı taklit edebildiğinde, oradaki ortak anahtarı, kendisinin karşılık gelen özel anahtarı bildiği bir anahtarla da değiştirebilir. Yani fikriniz ortadaki adama karşı değil, sadece pasif okuma saldırılarına karşı yardımcı olur.
Paŭlo Ebermann

@Paulo: evet, SSL'nin sadece şifreleme değil, aynı zamanda sertifika ile ilgili olduğunu da kabul ediyorum, ne yazık ki burada çekimleri çağırmıyorum ve insanlar web sayfasını düzenli bir http://bağlantıyla kullanmak istediklerini söylediklerinde sinir bozucu: /
Matthieu M.

@Matthieu: Bu, public_key'i genel web sayfasının bir parçası olarak gönderdiğiniz encrypt(entered_password, public_key), istemcide bilgi işlem yaptığınız ve bu sonucu gerçekleştiren sunucuya gönderdiğiniz anlamına does_password_match?(user, decrypt(encrypted_password, private_key))mı geliyor?
Ken Bloom

@Ken: az ya da çok, şifrelemeyi doğru yaptınız. Şifreyi eşleştirmek does_password_match(user, salt, decrypt(encrypted, key))için kullanıcıya bağlı olarak tuzla daha fazla . Söylediğim gibi, bariz sorun ortadaki adam korumasının olmamasıdır.
Matthieu M.

52

Bu, düşük güvenlik senaryolarında bile şifreleri açık metin olarak tuttuğunuzu gösterir.

Şunlara sahip olmalısınız:

if(hash(enteredPassword) == storedHash)

Basit karmayı örneğin MD5 gibi kullanabilirsiniz


22
Şifreyi girmek için +1. Ama en azından biraz tuz da eklerdim. Aksi takdirde, kullanıcılar sistemler arasında kullanıcı adlarını ve şifreleri yeniden kullanacaklarından, düşük güvenlikli uygulamanızı ihlal etmek bir saldırganın çok daha yüksek bir güvenlik uygulamasını ihlal etmesini sağlayabilir. Örneğin, son HBGary hack, web sitelerini çalıştıran CMS sisteminden taviz vermeyi başardı ve düşük güvenlikli CMS sistemi karmalara arstechnica.com/tech-policy/ haberler / 2011/02 /…
Justin Cave

1
Kabul ediyorum ... aşağıdakileri göz önünde bulundurun .. "strings JavaFile.class | grep -i password"
Bill

Yalnızca bir kez kullanılırlarsa, parolanın düz metin olarak girilmesinde sorun nedir?

10
Kullanıcıların çünkü @Tim olmaz sadece bir kez şifreyi kullanmayın. Çalışmalar, kaç kez söylenmediklerine bakılmaksızın , kullanıcıların şifreleri birden çok kez tekrar kullandıklarını göstermektedir (ör. Theregister.co.uk/2011/02/10/password_re_use_study ).
Scott

3
@Tim: ayrıca, exe, dll, vb, bir metin düzenleyicide açın ve muhtemelen parolanızı orada göreceksiniz.
Gus Cavalcanti

14

Karma önerenlerle aynı fikirdeyim, ama burada yeniden keşfettiğiniz bir tekerlek de var. Platforma bağlı olarak, muhtemelen tüm kullanıcı yönetim malzemelerini güvenli bir şekilde ve güvenli bir şekilde kapsayan bir rol / kullanıcı yönetimi aracı bulabilirsiniz.


Sadece ASP.Net Üyelik Sağlayıcılarını keşfettim ama "kaç kere böyle bir şey uygulayarak zamanımı boşa harcadım?" Diye düşündüm.
glenatron

8

Güvenlik çok hassas bir konudur, çünkü özellikle kullanıcılarınızı rahatsız etmekle bilgilerinin güvenli olduğundan emin olmak arasında bir denge olması gerekir. Tipik olarak, ne kadar güvenliğe ihtiyacınız olduğu formülü, verilerin öneminin bir fonksiyonudur. Kısacası:

isSecuritySufficient = effortToBreak > rewardForBreaking

Kötü şeyler yapan insanlar hakkında yaygın bir yanlış anlama peşinde oldukları şeydir. Çoğu güveni yok etmek için dışarıdalar . Kullanıcılarınızın güvenini korumak için her zaman elinizden geleni yapmalısınız. Bunun bir kısmı, kimliklerinin güvenli olduğundan emin olmak için gereken özeni gösterir . Sakladıkları verilerle daha az ilgilenebilirler, ancak en düşük güvenlik eşiğinde bile kimliklerine önem verirler.

Kullanılabilecek bir dizi düşük maliyetli (kullanıcıyı uygulamak ve etkilemek) seçenekler vardır. Bunlardan biri şifreyi en azından çıplak olarak kullanmaktır. Parola kadar hassas bir şeyi düz metin olarak saklayan herhangi bir hizmet, saldırıya uğramanın utanmasını hak eder.

Parola Koruması için Genel İlkeler

  • Parolaları asla düz metin olarak saklamayın
  • SHA-1 veya hatta SHA-512 gibi güvenli bir karma işlevi kullanarak karma (MD5 bile eşleşen bir karma bulmak çok kolaydır)
  • Bir uygulama tuzu değeri kullanın. Tuz, tahmin etmeyi zorlaştırmak için bir parolaya eklenen rastgele bayttır. Tuz, çalışma zamanında ve herhangi bir şekilde depolanıp referans verilmek yerine bir tohum değeri olarak makine hakkındaki bilgiler kullanılarak üretilmelidir.
  • Kullanıcıya özgü bir tuz değeri kullanın. Bunu uygulama tuzunuzla birlikte kullanın.
  • Ağ üzerinden geçen tüm kimlik doğrulama isteklerini şifreleyin . Bu, web uygulamaları için SSL kullanılması anlamına gelir.

Kimlik doğrulama için SSL kullanacağınız için, en azından kullanıcının hesabıyla ilgili tüm sayfaları da şifrelemek istersiniz. Bu, bir kullanıcının kimliğinin mümkün olduğunca korunmasını sağlar.

Parola yönetimi hakkında bir not : Kullanıcılar zaman zaman parolalarını unutacaktır. Mutlak kötü Yapabileceğiniz şey bir e-posta onlara şifrelerini göndermektir. Yukarıda belirtilen ilkeleri uygularsanız, bunu yine de yapamazsınız. Kayıtlı e-posta adreslerine gönderilen bir bağlantıyı kullanarak şifrelerini sıfırlamanın bir yolunu sağlamak daha iyidir. Bu sıfırlama bağlantısının, sayfaya erişen kişinin kendisinin olduğundan emin olmak için bir kerelik kullanım kodu olacaktır.


1
İlk başta uygulama tuzu + kullanıcı tuzu fikrinden çok etkilendim, ama ne kadar çok düşünürsem, o kadar az ikna oldum. Örneğin, 4 karakter uygulama tuzu ve 4 kullanıcı tuzu kullandıysanız, bu ve 8 karakter kullanıcı tuzu arasındaki fark, tuzun yarısının her kullanıcı için aynı olacağıdır. Uygulama tuzundan ziyade, kullanıcı tuzunun boyutunu arttırmanın daha güvenli olacağı anlaşılmaktadır. Ayrıca, uygulama tuzu donanıma dayalıysa, tüm parolaları geçersiz kılmadan donanımı yükseltemez veya değiştiremezsiniz.
David Conrad

Sorun, kullanıcı tuzunun kullanıcı şifresiyle birlikte veritabanı satırına dahil edilmesidir. Kötü bir insan bir tuzun ne için olduğunu bilirse (ve yaparlarsa) ve veritabanında görürlerse, o zaman tamamen nasıl kıracağını bilirler. Uygulamaya hesaplanan (sakladığınız her zaman aynı şekilde) bir parçayı depolamak yerine, kullanıcı tablolarını kırmayı çok daha zorlaştırır. Tabii ki bir adım daha ileri gidebilir ve 1 kısım saf rastgele tuz ve 1 kısım hesaplanmış tuz yapabilirsiniz.
Berin Loritsch

Ah, görüyorum, tuzun bir kısmını veritabanından uzak tut. Bu mantıklı. Teşekkür ederim.
David Conrad

Satır başına tuzu depolarken bir sorun görmüyorum, sıra başına benzersiz olduğu sürece. İşte bir karma: "fd84235a55bbfeb1585a3dd069d48127989c9753058b51b6ba2056fd6c5a0a91" (SHA256), işte tuz: "671254bdf7944f8fa88e6c9913b948ee". Şifreyi bulabileceğini mi düşünüyorsun? O tuz için gökkuşağı masası yok (tuz verilse bile), onu zorla zorladın.
Bryan Boettcher

3

Şifre başka bir şey için kullanılmadığı sürece sorun olmaz. Kullanıcının şifreyi yeniden kullanabileceğine karar verme riski hala vardır, bu nedenle aşağıdakilerle daha da iyi olur:

if(hash(enteredPassword) == hashOfValidPassword)

Kendiniz veya parolanın düz metin olarak saklandığını bilen biri varsa, o zaman sorun yoktur.


1
Justin Cave'in vartec'in cevabına yaptığı yorumda olduğu gibi, tuz kullanın, if (hash (enteredPassword + salt) == hashOfValidSaltedPassword)ve - +muhtemelen ekleme değil, birleştirme olduğunu unutmayın . Bu, olası parolaların karma tabloları olan gökkuşağı tablolarının kullanımını gerçekten engeller.
David Thornley

tek kontrol ettiğiniz bir karma ise, saklanan karma ile aynı karma üretene kadar onlar sadece olası dizeleri bir döngü üzerinden çalıştırmak olabilir? Sonuçta, aynı karmaya karşılık gelebilecek birçok dize var.
Morgan Herlocker

@Prof Erik: Karma algoritması iyi ise çarpışma bulmak çok zordur. Modern şifrelemenin temeli budur: aslında tek yönlü işlevlerdir.

3

Kaynak kodu mevcut mu? Değilse bile, ikili kullanılabilir durumda parolanın makine talimatlarında bulunabileceğinden eminim. Bir sağlama toplamı yapmayı ve bunun yerine karşılaştırmayı öneririm.

Sizce çok önemli olmasa bile güvenliği asla göz ardı etmeyin.


2
Evet, açık kaynak kodlu bir proje ise kötü fikir :)

-1 - Kaynağa sahip olmanın bir fark yarattığını düşünüyorsanız, güvenlik hakkında hiçbir şey bilmezsiniz.
mattnz

1

Kesinlikle hayır. Bir okuma var bu , bu hacker bir güvenlik web sitesini hack açıklamaktadır. Seni zincirdeki en zayıf halka olarak yapmayı planlıyorsun.


0

Birkaç cevapta parolanın kendisini değil bir karma değerini saklamanız gerektiği ve SSL kullanmanız gerektiği belirtildi.

Diyebilirsiniz ki, önemli olan nedir? Başvurum hacklenirse, bu çok endişe verici. Kullanıcıların aynı şifreyi tüm sitelerde kullanması oldukça yaygın bir modeldir. Sitenizi hacklemek ve kullanıcının şifrelerine erişmek için bir hackerdı, hacker, bu kullanıcılar için çok daha önemli olan diğer sitelerde bu kullanıcıların çoğunu taklit edebilecektir. Bu nedenle , sitenizi hacklemek, bir bilgisayar korsanının kullanıcılar için bankacılık bilgilerine erişmesi için ilk adım olabilir .

Ve sadece şifre hash yeterli değildir. Bir tuzla karıştırmalısınız. Hackerların ters karma arama tabloları vardır, bu nedenle belirli bir karma için eşleşen bir şifre bulabilirler.

Bu özelliği uygulamamayı seçerseniz, kullanıcıları bu güvenlik eksikliğinden haberdar etmeli ve başka yerlerde kullandıkları şifreyi kullanmamaları konusunda teşvik etmelisiniz.


-2

Bu sunucu tarafı olduğu sürece .. O zaman evet.

Biraz daha fazla güvenlik istiyorsanız https için gidin ve DB'de şifreyi \ hash şifreleyin.


3
Neden bunun bir web uygulaması olduğunu varsayalım?
Chris

İyi bir nokta! Az önce yaptım.
Moronlar

4
-1 sunucu tarafında olsa bile bu hala iyi değil.
GSto
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.