TL;DR
Don'ts
- Kullanıcıların şifreleri için girebileceğiniz ne karakter sınırı yok. Sadece aptallar bunu.
- Bir şifre uzunluğunu sınırlamak etmeyin. Kullanıcıların içinde supercalifragilisticexpialidocious bir cümle istiyorsanız, bunu kullanarak engel yok.
- Düz metin olarak kullanıcının parolasını saklamak asla.
- Lütfen kullanıcı için bir şifre e-posta asla except when they have lost theirs, and you sent a temporary one.
- , Şimdiye kadar herhangi bir şekilde şifreleri giriş asla.
- SHA1 veya MD5 şifreleri karma Asla! Modern crackers 60 ve 180 milyar sağlamalarının / saniye (sırasıyla) aşabilir.
Do's
- Zaman yapabilirsiniz scrypt kullanın; yapamazsan Bcrypt.
- Eğer SHA2 karmaları ile, Bcrypt veya scrypt kullanabilirsiniz edemez eğer PBKDF2 kullanın.
- Veritabanı tehlikeye olduğunda herkesin şifrelerini sıfırlayın.
- Makul 8-10 karakter minimum uzunluğu uygulamak, artı en az 1 büyük harf 1 küçük harf, numara ve sembol gerektirir. Bu da şifre entropi, zor çatlak yapma artıracaktır. (Bazı tartışma için "Ne iyi bir şifre yapar?" Bölümüne bakın.)
Why hash passwords anyway?
Karma şifreleri arkasındaki amacı basit: veritabanı ödün tarafından kullanıcı hesaplarına kötü niyetli erişimi engelliyor. Yani şifre sağlama amacı düz metin şifreleri hesaplamak için onları çok fazla zaman ve para maliyeti bir hacker ya kraker caydırmak etmektir. Ve zaman / maliyet cephanelik iyi onleyicilerdir.
Bir kullanıcı hesapları üzerinde bir iyi, sağlam bir karma istediğiniz başka nedeni size sistemdeki tüm şifreleri değiştirmek için yeterli zaman vermek. Veritabanı veritabanındaki her şifre değiştirmek eğer, least sistemini kilitlemek de yeterli zamana ihtiyacınız olacak tehlikeye eğer.
Jeremiah Grossman, WhiteHat Güvenlik CTO, stated on his blog onun şifre koruması brute-force kırılmasını gerekli yeni şifre kurtarma sonra:
İlginçtir, bu kabus dışarı yaşayan, ben şifre kırma, depolama, ve karmaşıklığı hakkında bilmiyordum öğrendim. I’ve come to appreciate why password storage is ever so much more important than password complexity. If you don’t know how your password is stored, then all you really can depend upon is complexity. Bu şifre ve kripto profesyoneller için ortak bilgi olabilir, ama ortalama InfoSec veya Web Güvenlik uzmanı için, ben çok şüpheliyim.
(Vurgu benim.)
What makes a good password anyway?
Entropy. (Ben tam Randall bakış abone değil.)
Kısacası, entropi varyasyon şifre içinde ne kadar olduğunu. Bir şifre sadece küçük roman harf olduğunda, o sadece 26 karakter bulunuyor. O kadar varyasyon değildir. Alfa-nümerik şifreleri 36 karakterleri ile, daha iyi. Ama üst ve alt harf sağlayan, sembollerle, kabaca 96 karakterdir. Bu sadece harflerden çok daha iyi. Bir sorun bizim şifreleri biz entropi azaltır desen-hangi eklemek unutulmaz yapmak için vardır. Oops!
Şifre entropi approximated kolayca. ASCII karakter (kabaca 96 tiplendirilemeyen karakter) dizi kullanarak bir şifre 8 karakter gelecekteki güvenlikleri için hala (entropi 52,679 bit) çok düşük olduğu karakterin başına 6.6 bir entropi, verir. Ama iyi haber: uzun şifreler ve unicode karakterleri ile şifreler, gerçekten bir şifre entropi artırmak ve zor çatlamak yapmak.
Crypto StackExchange sitede şifre entropi uzun bir tartışma var. İyi bir Google arama da sonuç bir sürü kadar dönecek.
Yorumlarında ben vs X pek harfler, sayılar, semboller, X uzunluğu enforcing bir şifre politikası, aslında şifre düzeni daha öngörülebilir yaparak entropi azaltabilir dikkat çekti @ popnoodles ile konuştuk. Ben katılıyorum. Mümkün olduğu kadar tamamen rasgele Randomess, her zaman güvenli ama en unutulmaz çözümdür.
Şimdiye kadar ben söylemek mümkün oldum gibi, dünyanın en iyi şifresini yapma Catch-22 olduğunu. Onun unutulmaz değil, çok öngörülebilir, çok kısa, çok unicode karakter (hard Windows / Mobile cihazı yazmak için), ya çok uzun, vb Şifre yok bizim amaçlarımız için gerçekten yeterince iyi olduğunu, bu yüzden sanki biz onları korumak gerekir onlar Fort Knox vardı.
Best practices
Bcrypt ve scrypt mevcut en iyi uygulamalar vardır. Scrypt zamanında bcrypt daha iyi olacak, ama Linux / Unix veya webserverlarda tarafından bir standart olarak kabul görmemiştir, ve kendi algoritması gönderilmemiş derinlemesine yorumlar olmamıştır. Ama yine de, algoritmanın geleceği umut verici görünüyor. Eğer Ruby ile çalışıyorsanız olduğu bir scrypt gem size yardımcı olacaktır, ve node.js artık kendi scrypt paketi vardır.
Ben çok good wrapper Eğer bcrypt kendi kullanımını rulo istiyorsanız crypt function için belgeleri okuyarak, ya da kendinizi bulma önermek veya {[gibi bir şey kullanabilirsiniz (3)]}, daha eski uygulama için. Ben değilse 15-18, bcrypt 12 mermi az öneririz.
Ben bcrypt sadece bir değişken maliyet mekanizması ile, Blowfish'in anahtar çizelgesi kullanır öğrendim Bcrypt kullanma hakkında fikrimi değiştirdim. İkincisi sen Blowfish'in zaten pahalı anahtar çizelgesini artırarak bir şifre kaba-zorlamak için maliyet artışı sağlar.
Average practices
Neredeyse artık bu durumu hayal edemiyorum. PHPASS 5.3 ile PHP 3.0.18 destekler, bu yüzden hemen hemen her kurulum üzerinde kullanılabilen hayal-ve know for certain ortamınız Bcrypt destekler olmadığı takdirde kullanılmalıdır.
Ama hiç Bcrypt ya PHPASS kullanamazsınız varsayalım. Sonra ne?
Ortamınız / uygulama / kullanıcı-algı tahammül ki PDKBF2 maximum number of rounds ile bir uygulama deneyin. Ben tavsiye ederim düşük sayısı 2500 mermi olduğunu. Ayrıca, yeniden operasyon zorlaştırmaya varsa hash_hmac() kullandığınızdan emin olun.
Future Practices
PHP 5.5 'te gelen bir full password protection library o bcrypt ile çalışan herhangi ağrıları uzak soyutlayan olduğunu. Çoğumuz ircmaxell PHP 5.3.7 için geriye dönük uyumlu önümüzdeki API için bir compatibility layer inşa etti @, en yaygın ortamlarda PHP 5.2 ve 5.3 ile özellikle paylaşılan ana sıkışmış iken.
Cryptography Recap & Disclaimer
Aslında crack bir karma parolası yoksa gerekli hesaplama gücü. Bir parola "crack" bilgisayarlar için tek yolu, onu yeniden ve sabitlemek için kullanılan karma algoritmayı taklit etmektir. Karma hızı doğrusal kaba zorla olma yeteneği ile ilgilidir. Daha da kötüsü, çoğu karma algoritmalar kolay, daha hızlı gerçekleştirmek için parallelized edilebilir. Bcrypt ve scrypt gibi pahalı düzenleri kadar önemli olmasının nedeni budur.
Muhtemelen saldırının tüm tehditleri ya da yollar önceden tahmin edemez, ve böylece kullanıcıları korumak için en iyi çabayı up front. Bunu yapmazsanız, o zaman bile çok geç olana kadar saldırıya gerçeğini kaçırabilir ... and you're liable. Bu durumu önlemek için, başlamak için paranoyak hareket. Kendi yazılımını (dahili) saldırı ve kullanıcı kimlik bilgilerini çalmak için çalışırsanız, veya diğer kullanıcıların hesaplarını değiştirmek veya kendi veri erişim. Eğer sistem güvenliğini test yoksa, o zaman kimseyi suçlamıyorum ama kendiniz olamaz.
Son olarak: Ben bir cryptographer değilim. Ne olursa olsun ben söyledim benim görüşüm, ama iyi ol 'sağduyu ... ve okuma sürü dayanıyor düşünmek olur. Mümkün olduğunca davetsiz zor gibi şeyler yapmak, ve sonra, hala endişeli iseniz, onlar sizin kodu / sistem hakkında söylediklerini görmek için bir beyaz şapka hacker ya Cryptographer başvurun, mümkün olduğunca paranoyak olmak, unutmayın.