YASAL UYARI : Bu cevap 2008 yılında yazılmıştır.
O zamandan beri, PHP bize verdi password_hash
ve password_verify
ve girişlerinden beri, önerilen şifre hashing ve kontrol yöntemidir.
Cevap teorisi yine de iyi bir okuma.
TL; DR
Yapılmaması Gerekenler
- Kullanıcıların şifreler için girebilecekleri karakterleri sınırlamayın. Bunu sadece aptallar yapar.
- Parolanın uzunluğunu sınırlamayın. Kullanıcılarınız içinde supercalifragilisticexpialidocious içeren bir cümle istiyorsa, kullanmasını engellemeyin.
- Şifrede HTML ve özel karakterleri sıyırmayın veya kaçmayın.
- Kullanıcı şifrenizi asla düz metin olarak saklamayın.
- Hiç bir zaman kendi parolalarını kaybettiler dışında bir kullanıcıya e-posta gönderin ve geçici bir şifre gönderdiniz.
- Asla, şifreleri hiçbir şekilde kaydetmeyin.
- SHA1 veya MD5 veya hatta SHA256 ile şifreleri asla karma etmeyin ! Modern krakerler (sırasıyla) 60 ve 180 milyar karmayı aşabilir.
- Bcrypt'i karıştırmayın ve karma () işlevinin ham çıktısıyla, hex çıktısını kullanın veya base64_encode. (Bu
\0
, içinde haydut olabilecek ve güvenliği ciddi şekilde zayıflatabilecek herhangi bir girdi için geçerlidir .)
Dos
- Mümkün olduğunda scrypt kullanın; bcrypt yapamıyorsanız.
- SHA2 karmalarıyla bcrypt veya scrypt kullanamıyorsanız PBKDF2 kullanın.
- Veritabanı tehlikeye girdiğinde herkesin şifrelerini sıfırlayın.
- Makul 8-10 karakterlik bir minimum uzunluk uygulayın, ayrıca en az 1 büyük harf, 1 küçük harf, bir sayı ve bir sembol gerektirir. Bu, parolanın entropisini geliştirir ve kırılmasını zorlaştırır. (Bazı tartışmalar için "İyi şifre nedir?" Bölümüne bakın.)
Neden karma şifreler?
Parolaları karmaşanın arkasındaki amaç basittir: veritabanını tehlikeye atarak kullanıcı hesaplarına kötü amaçlı erişimin önlenmesi. Bu yüzden parola karmaşasının amacı, düz metin parolaları hesaplamak için çok fazla zaman veya paraya mal olan bir hacker veya krakeri caydırmaktır. Ve zaman / maliyet cephaneliğinizin en iyi caydırıcılarıdır.
Bir kullanıcı hesabında iyi, sağlam bir karma istemenin başka bir nedeni, sistemdeki tüm şifreleri değiştirmek için yeterli zaman vermektir. Veritabanınızın güvenliği ihlal edilmişse, veritabanındaki her parolayı değiştirmezseniz, en azından sistemi kilitlemek için yeterli zamana ihtiyacınız olacaktır .
Whitehat Security'nin CTO'su Jeremiah Grossman, kısa bir süre önce şifre kurtarma işleminin şifre korumasının kırılmasını gerektiren bir şifre kurtarma işleminden sonra White Hat Security blogunda şunları söyledi :
İlginç bir şekilde, bu kabusu yaşarken, şifre kırma, depolama ve karmaşıklık hakkında bilmediğim çok şey öğrendim. Parola depolamanın neden parola karmaşıklığından çok daha önemli olduğunu anlamaya başladım. Parolanızın nasıl saklandığını bilmiyorsanız, gerçekten güvenebileceğiniz tek şey karmaşıklıktır. Bu, şifre ve kripto uzmanları için ortak bilgi olabilir, ancak ortalama InfoSec veya Web Güvenliği uzmanı için bundan şüpheliyim.
(Vurgu benim.)
Zaten iyi bir şifre ne yapar ?
Entropi . (Randall'ın bakış açısına tamamen abone olduğumdan değil.)
Kısacası, entropi şifre içinde ne kadar varyasyon olduğunu gösterir. Bir şifre sadece küçük harflerle yazılmışsa, bu sadece 26 karakterdir. Çok fazla varyasyon değil. Alfasayısal şifreler 36 karakterle daha iyidir. Ancak sembollerle büyük ve küçük harfe izin vermek yaklaşık 96 karakterdir. Bu sadece harflerden çok daha iyi. Bir sorun, şifrelerimizi unutulmaz kılmak için entropiyi azaltan desenler ekliyoruz. Hata!
Şifre entropisi kolayca tahmin edilebilir. Ascii karakterlerinin tamamını kullanmak (kabaca 96 yazılabilir karakter), her şifre için karakter başına 6.6'lık bir entropi sağlar; bu parola için 8 karakterde gelecekteki güvenlik için hala çok düşüktür (52.679 bit entropi). Ancak iyi haber şu ki: daha uzun parolalar ve unicode karakterlere sahip parolalar, bir parolanın entropisini gerçekten arttırır ve kırılmasını zorlaştırır.
Crypto StackExchange sitesinde şifre entropisi hakkında daha uzun bir tartışma var . İyi bir Google araması da birçok sonuç doğurur.
Yorumlarında ben dikkat çekti @popnoodles, konuştuk uygulayan X birçok harfler, sayılar, semboller, vs X uzunlukta bir şifre politikası, aslında şifre düzeni daha öngörülebilir hale getirerek entropi azaltabilir. Katılıyorum. Rastgele, mümkün olduğunca rastgele, her zaman en güvenli ama en az unutulmaz çözümdür.
Söyleyebildiğim kadarıyla, dünyanın en iyi şifresini yapmak bir Catch-22. Ya unutulmaz, çok öngörülebilir, çok kısa, çok fazla unicode karakter (bir Windows / Mobil cihazda yazmak zor), çok uzun, vb. Hiçbir şifre gerçekten bizim amacımız için yeterince iyi değil, bu yüzden onları sanki onlar korumalı Fort Knox'taydı.
En iyi uygulamalar
Bcrypt ve scrypt mevcut en iyi uygulamalardır. Scrypt zaman içinde bcrypt'ten daha iyi olacaktır, ancak Linux / Unix veya web sunucuları tarafından bir standart olarak benimsenmeyi görmemiştir ve henüz algoritmasının ayrıntılı incelemelerini yayınlamamıştır. Ama yine de, algoritmanın geleceği umut verici görünüyor. Ruby ile çalışıyorsanız, size yardımcı olacak bir scrypt gem var ve Node.js'nin artık kendi scrypt paketi var. Scrypt'i PHP'de Scrypt uzantısı veya Libsodium uzantısıyla kullanabilirsiniz (her ikisi de PECL'de mevcuttur).
Eğer bcrypt'in nasıl kullanılacağını anlamak veya kendinize iyi bir sarıcı bulmak veya daha eski bir uygulama için PHPASS gibi bir şey kullanmak istiyorsanız , crypt işlevi için belgeleri okumayı şiddetle tavsiye ederim . 15 ila 18 değilse, en az 12 tur bcrypt öneririm.
Bcrypt'in değişken bir maliyet mekanizmasıyla sadece blowfish'in temel programını kullandığını öğrendiğimde bcrypt kullanma hakkındaki fikrimi değiştirdim. İkincisi, blowfish'in zaten pahalı olan anahtar programını artırarak bir şifreyi kaba kuvvetle işleme maliyetini artırmanıza izin verir.
Ortalama uygulamalar
Artık neredeyse bu durumu hayal edemiyorum. PHPASS PHP 3.0.18 ila 5.3'ü destekler, bu nedenle akla gelebilecek hemen hemen her kurulumda kullanılabilir ve ortamınızın bcrypt'i desteklediğinden emin değilseniz kullanılmalıdır .
Ancak bcrypt veya PHPASS kullanamayacağınızı varsayalım. Sonra ne?
Ortamınızın / uygulamanızın / kullanıcı algınızın tolere edebileceği maksimum tur sayısına sahip bir PDKBF2 uygulamasını deneyin . Tavsiye edeceğim en düşük sayı 2500 mermidir. Ayrıca, işlemi çoğaltmayı zorlaştırmak için hash_hmac () kullandığınızdan emin olun .
Gelecek Uygulamalar
PHP 5.5'te gelmek, bcrypt ile çalışmanın tüm acılarını ortadan kaldıran tam bir şifre koruma kütüphanesidir . Çoğumuz PHP 5.2 ve 5.3 ile çoğu ortak ortamda, özellikle de paylaşılan ana bilgisayarlarda takılı kalırken, @ircmaxell, gelecek API için PHP 5.3.7 ile geriye dönük uyumlu bir uyumluluk katmanı oluşturdu.
Kriptografi Özeti ve Feragat
Karma bir şifreyi kırmak için gereken hesaplama gücü mevcut değildir. Bilgisayarların bir parolayı "kırması" için tek yol, parolayı yeniden oluşturmak ve güvenliğini sağlamak için kullanılan karma algoritmayı simüle etmektir. Karma hızı doğrusal olarak kaba-zorlanma kabiliyeti ile ilişkilidir. Daha da kötüsü, çoğu karma algoritma daha hızlı performans göstermesi için kolayca paralelleştirilebilir. Bu yüzden bcrypt ve scrypt gibi maliyetli planlar çok önemlidir.
Eğer kullanıcıları korumak için en iyi çabayı böylece muhtemelen saldırı tüm tehditleri veya caddeleri öngörmek ve olamaz ön . Bunu yapmazsanız, çok geç olana kadar saldırıya uğradığınız gerçeğini bile özleyebilirsiniz ... ve siz yükümlüsünüz . Bu durumdan kaçınmak için, başlamak için paranoyak davranın. Kendi yazılımınıza (dahili olarak) saldırın ve kullanıcı kimlik bilgilerini çalmaya veya diğer kullanıcıların hesaplarını değiştirmeye veya verilerine erişmeye çalışın. Sisteminizin güvenliğini test etmezseniz, kendinizden başka kimseyi suçlayamazsınız.
Son olarak: Ben bir kriptograf değilim. Söylediklerim benim düşüncem, ama bunun sağduyuya ve birçok okumaya dayandığını düşünüyorum. Unutmayın, olabildiğince paranoyak olun, işleri mümkün olduğunca zor hale getirin ve sonra hala endişeleniyorsanız, kodunuz / sisteminiz hakkında ne söylediklerini görmek için beyaz şapka korsanına veya kriptografa başvurun.