Şifreyi veritabanında saklamanın en iyi yolu [kapalı]


475

Kimlik doğrulaması (kullanıcı adı ve şifre) olması gereken bir proje üzerinde çalışıyorum

Ayrıca bir veritabanına bağlanır, bu yüzden kullanıcı adını ve şifreyi orada saklayacağımı düşündüm. Ancak, veritabanında oturan bir tablodaki bir metin alanı gibi parolalara sahip olmak iyi bir fikir gibi görünmemektedir.

C # kullanıyorum ve 2008 ekspres sunucusuna bağlanıyorum. Herkes (olabildiğince çok örnekle) bu tür verileri depolamanın en iyi yolunun ne olacağını önerebilir mi?

PS: Ben iyi bir neden sağlanabilir eğer bu bilgi veritabanında saklanmadığı fikrine açıkım


1
Ne yaparsanız yapın, şifreleme ile giderseniz, anahtarı kodda önceki bir poster olarak saklamayın. Bu sadece kötü bir uygulama.
Woody

12
'Parolalar nasıl doğru yapılır?' hayati bir sorudur. Bu zor bir problem ve hataların ciddi sonuçları var (Tesco ve LinkedIn'e ne olduğunu hatırlayın). Bu sorunun programmers.stackexchange.com
Albay Panik

2
Bu standartlara uymaları daha iyidir - bkz en.wikipedia.org/wiki/PBKDF2 Yalnızca dilinde bir uygulama bulmak zorunda
Boris Treukhov

5
Bu soru güvenlik forumunda kapsamlı bir şekilde cevaplanmıştır: security.stackexchange.com/questions/211/…
gioele

Yanıtlar:


405

Parolayı düz metin alanında saklamanın korkunç bir fikir olduğu konusunda haklısınız . Ancak, konum kadarıyla , karşılaşacağınız çoğu durumda (ve dürüstçe herhangi bir karşı örnek düşünemiyorum) veritabanında bir parola temsilini saklamak için uygun bir şeydir. Temsilin olarak derken karma (her kullanıcı için farklı olmalıdır) bir tuz ve güvenli bir 1-yönlü algoritma ve mağaza kullanarak şifreyi istediğiniz anlamına olduğunu , orijinal şifreyi atıyor. Ardından, bir parolayı doğrulamak istediğinizde, değeri aynı hash algoritmasını ve tuzu kullanarak hash eder ve veritabanındaki hashed değeriyle karşılaştırırsınız.

Yani, bunun hakkında düşündüğünüz iyi bir şey ve iyi bir soru olsa da, aslında bu soruların bir kopyası (en azından):

Tuzlama bitinde biraz daha açıklığa kavuşturmak için, sadece bir parola hash etme ve depolama ile tehlike, bir izinsiz giriş yapan kişi veritabanınızı ele geçirirse, yine de gökkuşağı tabloları olarak bilinenleri , şifre (en azından gökkuşağı tablosunda gösterilenler). Bunun üstesinden gelmek için, geliştiriciler parolalara, uygun şekilde yapıldığında gökkuşağı saldırılarını yapmayı olanaksız hale getiren bir tuz ekler . Yaygın bir yanlış anlama, tüm şifrelere aynı benzersiz ve uzun dizeyi eklemektir; bu korkunç olmasa da, her şifreye benzersiz tuzlar eklemek en iyisidir. Daha fazlası için bunu okuyun.


40
Şifreyi başka bir yerde saklamak yerine veritabanında saklamak istedim. Bu cümleyi bağlamdan çıkarmak, düz parolaları saklamayı destekliyorum gibi görünüyor, gerisini okuduysanız açıkçası bilmiyorum.
Paolo Bergantino

14
Sadece söylediğim gibi, onu tuzları ve daha fazlasını tartışan çok sayıda mesaja yönlendirdim ...
Paolo Bergantino

1
@Paolo Bergantino: Gönderinizde yazım hatası olmadığından emin misiniz? Diyor ki "Çoğu durumda karşılaşacağınız (ve dürüstçe herhangi bir karşı örnek düşünemiyorum) veritabanında parola depolamak yapmak için doğru bir şey." ??? Yorumlarınızı çelişiyor gibi görünüyor
Mitch Wheat

3
Paolo'nun söyledikleri doğrudan kendisiyle çelişir. Bir şifrenin tuzlanmış karması bir şifre değildir. Şifrenin tuzlanmış bir karmasını veritabanında saklamak, şifreyi veritabanında saklamamaktadır. Cevabın bedeni mükemmel bir şekilde uygundur, ancak ilk cümlesi son derece yanıltıcıdır.
Robert Rossney

40
@Robert: Bu küçük bir anlambilim oyununa tehlikeli bir şekilde yaklaşıyor, ancak yine de düzeltirim ...
Paolo Bergantino

54

Arka Plan Hiçbir zaman ... gerçekten ... kullanıcının şifresini bilmeniz gerekmez. Sadece gelen kullanıcının bir hesabın şifresini bildiğini doğrulamak istiyorsunuz.

Hash It: Kullanıcı parolalarının karma değerini (tek yönlü şifreleme) güçlü bir karma işlevi aracılığıyla depolar. "C # şifreleri şifreleme" araması bir sürü örnek verir.

Karma işlevinin ne ürettiği hakkında bir fikir edinmek için çevrimiçi SHA1 karma yaratıcısına bakın (Ancak SHA1'i karma işlevi olarak kullanmayın, SHA256 gibi daha güçlü bir şey kullanın).

Şimdi, karma parolalar sizin (ve veritabanı hırsızlarının) bu karma değerini orijinal parolaya geri çevirememeniz gerektiği anlamına gelir.

Nasıl kullanılır: Ama diyorsunuz ki, veritabanında saklanan bu parola parolasını nasıl kullanırım?

Kullanıcı oturum açtığında, size kullanıcı adını ve şifreyi (orijinal metninde) verir. Saklanan sürümü almak için bu şifreyi yazmak için aynı karma kodu kullanırsınız.

Bu nedenle, iki karma şifreyi (kullanıcı adı için veritabanı karma ile girilen & karma şifreyi) karşılaştırın. Karmalarını karşılaştırarak "yazdıklarının" orijinal kullanıcının parolaları için ne girdiğini "uyuşup uyuşmadığını" anlayabilirsiniz.

Ekstra kredi:

Soru: Veritabanınız olsaydı, o zaman Ripper John gibi bir kraker alıp depolanmış, karma şifrelerinizle eşleşene kadar karma yapmaya başlayamadım mı? (kullanıcılar kısa, sözlük kelimeleri yine de seçtiği için ... kolay olmalı)

Cevap: Evet ... evet yapabilirler.

Yani, şifrelerinizi 'tuzlamalısınız'. Tuz hakkındaki Wikipedia makalesine bakın

Bkz. "Tuz ile veri karma nasıl yapılır" C # örneği


14
Bir şey hariç güzel yazı: md5 ve sha1 her ikisi de kırıldı. Muhtemelen SHA2 ailesi gibi daha güçlü bir algoritma ile gitmelisiniz.
Paolo Bergantino

3
Teşekkürler Paolo - haklısın. SHA2 kullanımı MD5 ve SHA1'i kullanmak kadar kolay olduğundan, lütfen daha güçlü karma algoritması kullanın.
JoeJ

5
SHA-1 kırılmadı. Ama Bruce Schneier'i tefekkür etmek için: Yürü, kaçma, SHA-2'ye.
Ian Boyd

2
"Peki, şifrelerinizi 'tuzlamalısınız" ... Ama tuz genellikle şifreyle birlikte veritabanında saklanır, bu nasıl yardımcı olur? Saldırgan, test ettiği sözlük saldırısı cümlelerine tuz eklemelidir. Yinelenen şifreleri göstermekten başka nasıl daha güvenli?
trusktr

4
@joej "Asla ... gerçekten ... kullanıcının şifresini bilmen gerekmiyor" - bu çok kısa görüşlü bir varsayım. Geri alınabilecek şekilde bir parola depolamanın gerçekten gerekli olduğu birçok uygulama türü vardır. Örneğin, kullanıcı tarafından sağlanan ve güncellenen, kayıtlı kimlik bilgileriyle başka bir sisteme sık sık oturum açması gereken bir uygulama.
Francisco Zarabozo

29

Sha-512 gibi güvenli bir algoritma kullanılarak, anahtarla sertleştirilmiş tuzlanmış bir karma olarak.


6
Bence, şifreleri saklamak için her zaman yavaş algoritmalar (örneğin Blowfish gibi) kullanmalısınız. Bu yazı çok daha iyi bir cevaptır: security.stackexchange.com/questions/211/… . Sadece buraya koymak, çünkü bu sayfa arama sonuçlarında hala yüksek görünüyor.
Dynom

2
Şifre saklama için bu tavsiyeye uymak onu yanlış bir şekilde yanlış yapıyor olacaktır.
mlissner

27

En iyi güvenlik uygulaması şifreyi hiç saklamak (hatta şifrelenmemiş) değil, şifrelenmiş şifrenin tuzlanmış karmasını (şifre başına benzersiz bir tuzla) saklamaktır.

Bu şekilde bir düz metin parola almak (neredeyse) imkansızdır.


11
Wayne, hash hesaplanmadan önce tuzlanarak, tuzun yeterli büyüklükte olması şartıyla gökkuşağı masası etkili bir şekilde yenilir.
Mike Rosenblum

11
@Wayne Hartman: Öyle değil. Tuz değeri açıksa, o tuz değeri için yeni bir gökkuşağı tablosu oluşturmanız gerekir. Gökkuşağı tablosunun amacı, önceden hesaplanmış karma değerlerine sahip olmaktır. Ve hiç kimsenin kendine özgü tuzu için bir gökkuşağı masası olmayacak.
Ian Boyd

10

Gökkuşağı tabloları ile yeterli makaleleri iyice okumanızı tavsiye ederim : Güvenli Şifre Şemaları Hakkında Bilmeniz Gerekenler [ölü bağlantı, İnternet Arşivine kopyala ] ve Güvenli Bir Şifre Nasıl Saklanır .

Ben dahil birçok kodlayıcı, güvenlik ve karmaşayı anladıklarını düşünüyor. Ne yazık ki çoğumuz yok.


1
@Johan Görünüşe göre bağlantının koptuğu anlaşılıyor ki bu bir utanç. İşte alternatif bir codahale.com/how-to-safely-store-a-password
zebrabox

6

Bir kullanıcı adı ve şifre ihtiyacından bahsettiğiniz gibi biraz konu dışı olabilirim ve bu konudaki anlayışım kuşkusuz en iyisi değil ama OpenID düşünülmeye değer bir şey mi?

OpenID kullanırsanız, teknolojiyi doğru anlarsam ve kullanıcılar zaten sahip oldukları kimlik bilgilerini kullanabilir ve uygulamanıza özgü yeni bir kimlik oluşturma gereğini ortadan kaldırırsa hiçbir kimlik bilgisini depolamazsınız.

Söz konusu uygulamanın yalnızca dahili kullanım için olması uygun olmayabilir.

RPX , OpenID desteğini bir uygulamaya entegre etmek için güzel ve kolay bir yol sağlar.


OpenID kayalar halkların yüzleri kapalı kabul ediyorum ama bu uygulama için herhangi bir yaşlı kişi oturum açmak için gelen istiyorum şüpheli bir şirket için bir ev veritabanı. Ayrıca web uygulaması bu uygulamanın düzgün çalışması için gerekli değildir, bu yüzden bunu istemekten nefret ederdim.
Crash893

3

Senaryonuzda, asp.net üyeliğine göz atabilirsiniz, kullanıcının parolasını veritabanında karma dize olarak saklamak iyi bir uygulamadır. karma gelen parolayı veritabanında saklanan parola ile karşılaştırarak kullanıcının kimliğini doğrulayabilirsiniz.

Her şey bu amaç için inşa edildi, asp.net üyeliğine göz atın


1

Karma işlemini tersine çevirmeniz gerekmiyorsa parolayı MD5 / SHA1 olurum. Kullanıcılar giriş yaptığında, verilen şifreyi şifreleyebilir ve hash ile karşılaştırabilirsiniz. Birisi veritabanına erişim sağlamaz ve zaten bir çarpışması olan bir karma görmezse, bu durumda karma çarpışmalar neredeyse imkansızdır.



3
Aslında, o kadar kırık değil. Yapabilecekleri, iki farklı dosya için aynı karma değerini bulmaktır. Yapamayacakları şey MD5'i tersine çevirmek ve çalışan bir şifre almaktır.
waiwai933

2
Peki, o zaman kırılmaz mı? Sadece aynı karmayı oluşturan diğer şifreyi girersiniz ve girersiniz. Orijinal şifreyi bilmenize gerek yoktur. Bunu düzeltmenin yolu, karma işleminden önce şifreyi tuzlamanızdır.
mjuarez

2
@mjuarez Eğer MD5 kullanmadan önce şifreye bir tuz eklerseniz çarpışma önemli değildir çünkü diğer şifreyi kullanamazsınız
WiiMaxx
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.