PHP şifreleri için güvenli karma ve tuz


1174

Şu anda MD5'in kısmen güvensiz olduğu söyleniyor. Bunu göz önünde bulundurarak, şifre koruması için hangi mekanizmanın kullanılacağını bilmek istiyorum.

Bu soru, “çifte hash” bir şifreyi sadece bir kere hash etmekten daha az güvenli midir? oysa birden çok kez karma, iyi bir fikir olabileceğini düşündürmektedir Nasıl bireysel dosyalar için şifre koruması uygulamak için? tuz kullanmanızı önerir.

PHP kullanıyorum. Güvenli ve hızlı bir şifre şifreleme sistemi istiyorum. Bir şifreyi milyon kez karıştırmak daha güvenli, ancak daha yavaş olabilir. Hız ve güvenlik arasında iyi bir denge nasıl sağlanır? Ayrıca, sonucun sabit sayıda karaktere sahip olmasını tercih ederim.

  1. Karma mekanizması PHP'de mevcut olmalıdır
  2. Güvenli olmalı
  3. Tuz kullanabilir (bu durumda, tüm tuzlar eşit derecede iyidir mi? İyi tuz üretmenin bir yolu var mı?)

Ayrıca, veritabanında iki alan (örneğin MD5, diğeri SHA kullanarak) depolamalıyım? Daha güvenli mi yoksa güvensiz mi olur?

Yeterince net olmamam durumunda, hangi hash fonksiyon (lar) ını ve güvenli ve hızlı bir şifre koruma mekanizmasına sahip olmak için iyi bir tuzun nasıl seçileceğini bilmek istiyorum.

Sorumu tam olarak içermeyen ilgili sorular:

PHP'de SHA ve MD5 arasındaki fark nedir
Basit Şifre Şifreleme
Anahtarları, asp.net için şifreleri saklamanın güvenli yöntemleri
Tomcat 5.5'te tuzlanmış şifreleri nasıl uygularsınız?


13
openwall.com/phpass da çok iyi bir kütüphane
Alfred

51
Md5 şimdi tamamen güvensiz
JqueryToAddNumbers

3
@NSAwesomeGuy Ne için kullandığınıza bağlıdır. Gökkuşağı eşleşmesi veya sadece kaba kuvvet tuzsuz MD5 şifreleri için önemsizdir, ancak iyi tuzlama ile, şifre setlerinin hızlı kırılması için bir gökkuşağı tablosu oluşturmak hala pratik değildir ve kaba kuvvet bir umut değildir.
Craig Ringer


Yanıtlar:


982

YASAL UYARI : Bu cevap 2008 yılında yazılmıştır.

O zamandan beri, PHP bize verdi password_hashve password_verifyve 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.


9
parola DB'nizin zaten gizli olması gerektiği için bir sır işe yaramaz - eğer o DB'yi tutabilirlerse, kullandığınız sırrı da bulabilirler. bununla birlikte tuzun rastgele olması önemlidir.
frankodwyer

2
not edin, 'şifre çözme için hesaplama gücünün' henüz mevcut olmadığı doğru değildir. parolaların çoğu sözlük sözcükleri veya sözlükten türetilmiş olduğundan, sözlüğe dayalı saldırı genellikle çok etkilidir (bu nedenle parola ilkelerinin ve yineleme sayılarının kullanılması).
frankodwyer

6
@wicked pire, seninle tartışmıyorum. Sadece işimizin bu alanının ne kadar kıvrık ve karmaşık olduğuna dikkat çekmek. Küçük bir web sitesinin içerik yönetim sistemini kurmak için her şeyden önce, en akıllısı ve en iyi uygulamadan yararlanmayı umuyorum. Hala burada öğreniyorum. ... mantıklı bir şey her okuduğumda, yakında onunla çelişen 5 gönderi fark edeceğim. bu yuvarlak ve hızlı bir şekilde baş
döndürüyor

4
İlginç revizyon. Kullanıcı kimliği (örneğin, bir otomatik artış BIGINT) iyi bir nonce mi? Yoksa rastgele olmadığı için iyi değil mi? Ayrıca, her kullanıcı için nonce veritabanında saklamak zorunda kalacak ... Site anahtarı + nonce + HMAC, birden çok kez yinelenen bir tuzlu (kullanıcı kimliği ile) karma üzerinde önemli ölçüde gelişmiş güvenlik sağlıyor mu? Benzer şekilde, HMAC'yi yinelemek güvenlik için iyi mi?
luiscubal

4
Kullanıcının ilk kez kullandığında e-posta yoluyla geçici bir parola göndermek ve parolalarını ayarlamalarını sağlayan e-posta üzerinden "güvenli" bir bağlantı göndermek eşit derecede risklidir. Her iki durumda da, e-postaya müdahale eden herhangi biri, istenen alıcı yapmadan önce bağlantıyı veya şifreyi kullandıkları sürece hesaba erişebilir.
Tim Gautier

138

Çok daha kısa ve daha güvenli bir cevap - kendi şifre mekanizmanızı hiç yazmayın, denenmiş ve test edilmiş bir mekanizma kullanın.

  • PHP 5.5 veya üstü: password_hash () iyi kalitede ve PHP çekirdeğinin bir parçasıdır.
  • Eski PHP sürümleri: OpenWall'ın phpass kütüphanesi çoğu özel koddan çok daha iyidir - WordPress, Drupal vb.

Çoğu programcı, güvenlik açıkları getirmeden kriptoyla ilgili kodu güvenli bir şekilde yazma uzmanlığına sahip değildir.

Hızlı kendi kendine test: şifre germe nedir ve kaç yineleme kullanmalısınız? Cevabı bilmiyorsanız, password_hash()parola genişletme artık çok daha hızlı CPU'lar ve parolaları saniyede milyarlarca tahmin hızında kırmak için GPU ve FPGA'ların kullanılması nedeniyle parola mekanizmalarının kritik bir özelliği olduğu için kullanmalısınız. GPU'ları olan ( ).

Örneğin, 5 masaüstü bilgisayarda 25 GPU kullanarak 8 karakterlik Windows parolalarının tümünü 6 saatte kırabilirsiniz . Bu kaba kuvvettir, yani her 8 karakterlik Windows parolasını numaralandırmak ve kontrol etmek özel karakterler de dahil olmak üzere ve bir sözlük saldırısı değildir. Bu, 2012'de oldu, 2018 itibariyle daha az GPU kullanabilir veya 25 GPU ile daha hızlı çatlayabilirsiniz.

Sıradan CPU'larda çalışan ve çok hızlı olan Windows şifrelerinde birçok gökkuşağı tablosu saldırısı da vardır. Tüm bunlar, Windows hala Windows 10'da bile parolalarını tuzlamıyor veya genişletmiyor - Microsoft'un yaptığıyla aynı hatayı yapmayın!

Ayrıca bakınız:

  • mükemmel cevap neden daha fazla password_hash()veya phpassgitmek için en iyi yoldur.
  • bcrypt, scrypt ve PBKDF2 gibi ana algoritmalar için önerilen 'çalışma faktörleri' (yineleme sayısı) veren iyi bir blog makalesi .

1
ancak bu sistemler daha iyi bilinmektedir ve belki de zaten tehlikeye girmiştir. ama ne yaptığınızı bilmediğinizde kendinizinkini yapmaktan geçer.
JqueryToAddNumbers

14
Re "bu sistemler daha iyi bilinir ve belki de zaten tehlikeye atılmış" - kimlik doğrulaması için iyi tasarlanmış bir sistemin, sadece daha iyi bilindiği için "zaten tehlikeye atılmış" olması için hiçbir neden yoktur. Phpass gibi kütüphaneler uzmanlar tarafından yazılır ve birçok kişi tarafından ayrıntılı olarak incelenir - iyi bilinmeleri, farklı insanlar tarafından ayrıntılı inceleme ile birlikte gider ve güvenli oldukları anlamına gelme olasılığı daha yüksektir.
RichVel

LinkedIn, Last.fm ve diğerlerinden gelen son şifre karması dökümleri göz önüne alındığında, bu oldukça günceldir. Kendi parola mekanizmanızı nasıl yazacağınızı bilmeden iyi bir şirketdesiniz!
RichVel

3
@PP - Bence, bir NSA arka kapısına sahip hakemli bir şifre karma algoritması olasılığı çok düşük. Gerçek bir kripto uzmanı olmayan birinin, diğer güvenlik açıkları olmadan yeni bir parola karma mekanizması yazma olasılığı çok daha düşüktür. Ve tipik webapp sadece MD5 veya SHA-1 karma kullanır, bu korkunç - hatta Chris Shiflett'in başka büyük Temel PHP Güvenlik kitabı bile MD5 önerir ...
RichVel

1
@RichVel - password_hash () işlevi. Daha önce de belirtildiği gibi, PHP çekirdeğine (aka / ext / standard) dahil edilmiştir.
CubicleSoft

43

Şifre karma iki farklı şekilde saklamak olmaz, çünkü o zaman sistem en az kullanılan karma algoritmaların en zayıf kadar zayıftır.


şifre karması için değil. saldırganın parolayı almak için yalnızca bir karmayı kırması gerekir. ne MD5 ne de SHA1'in şifre senaryosunda herhangi bir pratik sonu olmadığı için nokta zaten tartışmalıdır.
frankodwyer

2
Üzgünüm, cevabınızı iki karma kullanmayı önererek yanlış okudum ... aslında haklısınız. İki karma kullanmak, parola durumunda sistemi zayıflatır, çünkü yalnızca zayıf karma değerini kırmaları gerekir.
frankodwyer

40

PHP 5.5'ten itibaren PHP, parolaları, password_hash () ve password_verify () işlevlerini doğrulamak ve doğrulamak için basit, güvenli işlevlere sahiptir

$password = 'anna';
$hash = password_hash($password, PASSWORD_DEFAULT);
$expensiveHash = password_hash($password, PASSWORD_DEFAULT, array('cost' => 20));

password_verify('anna', $hash); //Returns true
password_verify('anna', $expensiveHash); //Also returns true
password_verify('elsa', $hash); //Returns false

Zaman password_hash()kullanılır, rasgele bir tuzunu oluşturan ve (maliyet ve kullanılan algoritmaya.) İle birlikte, çıktı karma içinde içeren password_verify()daha sonra bu karma okur ve kullanılan tuz ve şifreleme yöntemi belirler ve Resim düz metin şifre karşı doğrular o.

Sağlamak PASSWORD_DEFAULT talimatını PHP PHP kurulu sürümünün varsayılan karma algoritmasını kullanmak. Tam olarak hangi algoritmanın gelecekteki sürümlerde zamanla değişmesi amaçlanmıştır, böylece her zaman mevcut en güçlü algoritmalardan biri olacaktır.

Artan maliyet (varsayılan değer 10'dur) hash'i kaba kuvvete zorlaştırır, ancak hash üretme ve bunlara karşı parolaları doğrulama sunucunuzun CPU'su için daha fazla çalışma anlamına gelir.

Varsayılan karma algoritması değişebilse de, kullanılan algoritmanın karma içinde saklandığı ve password_verify()üzerine geldiği için eski karmaların gayet doğrulamaya devam edeceğini unutmayın .


33

Her ne kadar soru cevaplanmış olsa da, sadece karma için kullanılan tuzların rastgele ve ilk cevapta önerildiği gibi e-posta adresi gibi olmaması gerektiğini tekrarlamak istiyorum.

Daha fazla açıklama şu adreste bulunabilir: http://www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

Son zamanlarda rastgele bitlerle tuzlanmış parola karmalarının tahmin edilebilir veya bilinen tuzlarla tuzlanmış olandan daha güvenli olup olmadığı hakkında bir tartışma yaptım. Bakalım: Rastgele tuz depolayan sistem kadar şifrenin saklandığı sistem de tehlikeye girerse, saldırganın tuzun yanı sıra hash'a da erişimi olacaktır, bu yüzden tuzun rastgele olup olmadığı önemli değildir. Saldırgan, karmayı kırmak için önceden hesaplanmış gökkuşağı tabloları üretebilir. İşte ilginç kısım - önceden hesaplanmış tablolar oluşturmak o kadar önemsiz değil. Şimdi WPA güvenlik modelini ele alalım. WPA şifreniz hiçbir zaman Kablosuz Erişim Noktasına gönderilmez. Bunun yerine, SSID'nizle (ağ adı benzeri Linksys, Dlink vb.) Birleştirilir. Bunun nasıl çalıştığına dair çok iyi bir açıklama burada. Karma'dan parola almak için, tuzun yanı sıra şifreyi de bilmeniz gerekir (ağ adı). Wifi Kilisesi zaten en iyi 1000 SSID ve yaklaşık 1 milyon şifre içeren önceden hesaplanmış hash tablolarına sahiptir. Tüm tabloların boyutu yaklaşık 40 GB'dir. Sitelerinde okuyabileceğiniz gibi, birisi bu tabloları oluşturmak için 3 gün boyunca 15 FGPA dizisi kullandı. Kurbanın SSID'yi “a387csf3 as ve şifresini“ 123456 ″ olarak kullandığını varsayarsak, bu tablolar tarafından kırılacak mı? Hayır! .. olamaz. Parola zayıf olsa bile, tablolarda SSID a387csf3 için karma yoktur. Bu rastgele tuz almanın güzelliğidir. Önceden hesaplanmış masalarda gelişen krakerleri caydırır. Kararlı bir hacker'ı durdurabilir mi? Muhtemelen değil. Ancak rastgele tuzların kullanılması ek savunma katmanı sağlar. Biz bu konuyla ilgili olarak, rastgele tuzları ayrı bir sistemde depolamanın ek avantajını tartışalım. Senaryo # 1: Parola karmaları sistem X'ta depolanır ve karma için kullanılan tuz değerleri Y sisteminde depolanır. Bu tuz değerleri tahmin edilebilir veya bilinir (örn. Kullanıcı adı) Senaryo # 2: Parola karmaları sistem X ve depolanmış tuz değerleri için kullanılır. karma sistem Y'de depolanır. Bu tuz değerleri rasgele. Tahmin edebileceğiniz gibi, X sisteminin tehlikeye girmesi durumunda, ayrı bir sistemde rastgele tuz kullanmanın büyük bir avantajı vardır (Senaryo # 2). Saldırganın karmaları kırabilmek için ek değerler tahmin etmesi gerekir. 32 bit tuz kullanılırsa, tahmin edilen her şifre için 2 ^ 32 = 4,294,967,296 (yaklaşık 4,2 milyar) yineleme gerekebilir. Parola karmaları sistem X'te depolanır ve karma için kullanılan tuz değerleri Y sisteminde depolanır. Bu tuz değerleri tahmin edilebilir veya bilinir (örn. Kullanıcı adı) Senaryo # 2: Parola karmaları sistem X'te depolanır ve karma için kullanılan tuz değerleri Bu tuz değerleri rastgeledir. Tahmin edebileceğiniz gibi, X sisteminin tehlikeye girmesi durumunda, ayrı bir sistemde rastgele tuz kullanmanın büyük bir avantajı vardır (Senaryo # 2). Saldırganın karmaları kırabilmek için ek değerler tahmin etmesi gerekir. 32 bit tuz kullanılırsa, tahmin edilen her şifre için 2 ^ 32 = 4,294,967,296 (yaklaşık 4,2 milyar) yineleme gerekebilir. Parola karmaları sistem X'te depolanır ve karma için kullanılan tuz değerleri Y sisteminde depolanır. Bu tuz değerleri tahmin edilebilir veya bilinir (örn. Kullanıcı adı) Senaryo # 2: Parola karmaları sistem X'te depolanır ve karma için kullanılan tuz değerleri Bu tuz değerleri rastgeledir. Tahmin edebileceğiniz gibi, X sisteminin tehlikeye girmesi durumunda, ayrı bir sistemde rastgele tuz kullanmanın büyük bir avantajı vardır (Senaryo # 2). Saldırganın karmaları kırabilmek için ek değerler tahmin etmesi gerekir. 32 bit tuz kullanılırsa, tahmin edilen her şifre için 2 ^ 32 = 4,294,967,296 (yaklaşık 4,2 milyar) yineleme gerekebilir. Bu tuz değerleri rastgeledir. Tahmin edebileceğiniz gibi, X sisteminin tehlikeye girmesi durumunda, ayrı bir sistemde rastgele tuz kullanmanın büyük bir avantajı vardır (Senaryo # 2). Saldırganın karmaları kırabilmek için ek değerler tahmin etmesi gerekir. 32 bit tuz kullanılırsa, tahmin edilen her şifre için 2 ^ 32 = 4,294,967,296 (yaklaşık 4,2 milyar) yineleme gerekebilir. Bu tuz değerleri rastgeledir. Tahmin edebileceğiniz gibi, X sisteminin tehlikeye girmesi durumunda, ayrı bir sistemde rastgele tuz kullanmanın büyük bir avantajı vardır (Senaryo # 2). Saldırganın karmaları kırabilmek için ek değerler tahmin etmesi gerekir. 32 bit tuz kullanılırsa, tahmin edilen her şifre için 2 ^ 32 = 4,294,967,296 (yaklaşık 4,2 milyar) yineleme gerekebilir.


7
Saldırgan tuzu alsa bile, belirli bir kullanıcı olmadığı sürece saldırganın her kullanıcı için tablolar oluşturması gerektiğinden (böylece saldırı çok yavaşlar) bir "sitesalt: usersalt: password" dizesi hala önceden hesaplanmış tablolara karşı dirençlidir. hedefleniyor ...
luiscubal

"Saldırgan tuzu alsa bile, bir" sitesalt: usersalt: password "dizesi önceden hesaplanmış tablolara karşı hala dirençlidir", Tamamen katılıyorum. Demek istediğim, sitealtının rastgele ve uzun yapılması durumunda, sistemi (sitesalt) öngörülebilir olmaktan daha güvenli hale getirecektir. Tuz olarak e-posta kimliği vb. Kullanılmasını tavsiye eden bazı insanlar gördüm ve bunu caydırıyorum.
Gaurav Kumar

Yazdıklarımı kaçırdın. Ben kayıt ile saklanan rastgele bir nonce, PLUS e-posta adresini kullanmayı söyledi. E-posta adresinin eklenmesi, bilgisayar korsanının üzerinde çalışması için ekstra entropi sağlar. O zamandan beri cevabımı bcrypt lehine yeniden yazdım.
Robert K

28

Ben sadece PHP 5.5 etrafında bir sarıcı sağlayan bir şifre karma API içerdiğini işaret etmek istiyorum crypt(). Bu API, şifre karmaları sağlama, doğrulama ve yeniden canlandırma görevini önemli ölçüde basitleştirir. Yazar ayrıca PHP 5.3.7 ve sonraki sürümlerini kullanan ve şu anda kullanmak isteyenler için bir uyumluluk paketi yayınladı (sadece requirekullandığınız tek bir password.php dosyası biçiminde ).

Şimdilik sadece BCRYPT'yi destekliyor, ancak diğer parola karma tekniklerini içerecek şekilde kolayca genişletmeyi hedefliyor ve teknik ve maliyet karma işleminin bir parçası olarak saklandığından, tercih edilen karma tekniğinizde / maliyetinizde yapılan değişiklikler mevcut karma değerleri geçersiz kılmayacak, çerçeve otomatik olarak, doğrularken doğru tekniği / maliyeti kullanır. Ayrıca, kendinizinkini açıkça tanımlamazsanız "güvenli" bir tuz üretmeyi de sağlar.

API dört işlevi ortaya koyar:

  • password_get_info() - verilen karma hakkında bilgi döndürür
  • password_hash() - şifre karması oluşturur
  • password_needs_rehash()- verilen karmanın verilen seçeneklerle eşleşip eşleşmediğini kontrol eder. Karma işleminin mevcut teknik / maliyet planınıza uygun olup olmadığını kontrol etmek için yararlıdır
  • password_verify() - bir şifrenin karma ile eşleştiğini doğrular

Şu anda bu işlevler, şu anda eşanlamlı olan PASSWORD_BCRYPT ve PASSWORD_DEFAULT şifre sabitlerini kabul etmektedir; fark, PASSWORD_DEFAULT'un "daha yeni, daha güçlü karma algoritmalar desteklendiğinde daha yeni PHP sürümlerinde değişebilmesidir". Girişte PASSWORD_DEFAULT ve password_needs_rehash () kullanmak (ve gerekirse yeniden şekillendirmek) karmalarınızın sizin için çok az veya hiç çalışma olmadan kaba kuvvet saldırılarına karşı makul derecede dayanıklı olmasını sağlamalıdır.

EDIT: Az önce bunun Robert K'nin cevabında kısaca bahsedildiğini fark ettim. Bu cevabı burada bırakacağım, çünkü nasıl çalıştığı ve güvenliği bilmeyenler için sağladığı kullanım kolaylığı hakkında biraz daha fazla bilgi sağladığını düşünüyorum.


19

Hemen hemen her PHP projesinde kolayca uygulanabilen basit bir tek dosya PHP sınıfı olan Phpass kullanıyorum . Ayrıca bkz H .

Varsayılan olarak, bcryptWordpress gibi çerçevelere geriye dönük uyumluluk sağlamak için MD5'e kadar olan ve diğer şifrelere geri dönen Phpass'da uygulanan en güçlü şifrelemeyi kullanmıştır .

Döndürülen karma olduğu gibi veritabanında saklanabilir. Karma oluşturmak için örnek kullanım:

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

Parolayı doğrulamak için aşağıdakiler kullanılabilir:

$t_hasher = new PasswordHash(8, FALSE);
$check = $t_hasher->CheckPassword($password, $hash);

14

HATIRLANACAK ŞEYLER

PHP için Şifre şifreleme hakkında çok şey söylendi, bunların çoğu çok iyi bir tavsiyedir, ancak şifre şifrelemesi için PHP kullanma sürecine başlamadan önce aşağıdakilerin uygulandığından veya uygulanmaya hazır olduğundan emin olun.

SUNUCU

LİMANLAR

PHP ve DB'yi çalıştıran sunucuyu düzgün bir şekilde güvende tutmazsanız, şifrelemeniz ne kadar iyi olursa olsun, tüm çabalarınız değersizdir. Çoğu sunucu nispeten aynı şekilde çalışır, onlara ftp veya kabuk aracılığıyla uzaktan erişmenizi sağlamak için atanmış bağlantı noktaları vardır. Uzak bağlantısının etkin olduğu varsayılan bağlantı noktasını değiştirdiğinizden emin olun. Bunu yapmazsanız, saldırganın sisteminize erişimde bir adım daha atmasını sağladınız.

KULLANICI ADI

Dünyada iyi olan her şey için admin, root veya benzeri bir kullanıcı adı kullanmayın. Ayrıca, unix tabanlı bir sistemdeyseniz root hesabı girişini erişilebilir hale getirmeyin, her zaman sadece sudo olmalıdır.

PAROLA

Kullanıcılarınıza saldırıya uğramamak için iyi parolalar yapmalarını söylersiniz, aynısını yapın. Arka kapıyı tamamen açtığınızda ön kapınızı kilitlemenin tüm çabalarından geçmenin anlamı nedir?

VERİ TABANI

SUNUCU

İdeal olarak DB ve UYGULAMA ayrı sunucularda istiyorum. Maliyet nedeniyle bu her zaman mümkün değildir, ancak saldırganın sisteme tam olarak erişmek için iki adımdan geçmesi gerekeceğinden biraz güvenlik sağlar.

KULLANICI

DB'ye erişmek için uygulamanızın her zaman kendi hesabı olmalıdır ve ona yalnızca ihtiyaç duyacağı ayrıcalıkları verin.

Ardından, uygulamada bile sunucuda herhangi bir yerde saklanmayan ayrı bir kullanıcı hesabınız olsun.

Her zaman olduğu gibi bu kökü veya benzer bir şeyi YAPMAYIN.

PAROLA

Tüm iyi parolalarla aynı yönergeleri izleyin. Ayrıca aynı şifreyi aynı sistemdeki herhangi bir SERVER veya DB hesabında tekrar kullanmayın.

PHP

PAROLA

ASLA DB'nizde bir şifre saklamayın, bunun yerine karma ve benzersiz tuzu saklayın, nedenini daha sonra açıklayacağım.

Karma işlemi

TEK YÖNLENDİRME !!!!!!! aynı şekilde ve iki karmayı karşılaştırın. Bu, bir saldırgan DB'ye erişse bile, gerçek parolanın ne olduğunu bilmediğini, sadece sonuçta ortaya çıkan karma olduğunu gösterir. Bu, olası en kötü senaryoda kullanıcılarınız için daha fazla güvenlik anlamına gelir.

Orada iyi karma fonksiyonları vardır ( password_hash,, hashvb ...) ama karma etkili olması için iyi bir algoritma seçmeniz gerekir. (bcrypt ve buna benzer olanlar iyi algoritmalardır.)

Hashing hızı anahtar olduğunda, Brute Force saldırılarına karşı daha yavaş dirençli olur.

Karmadaki en yaygın hatalardan biri, karmaların kullanıcılara özgü olmamasıdır. Bunun nedeni, tuzların benzersiz bir şekilde üretilmemesidir.

tuzlama

Parolalar, karma işleminden önce her zaman tuzlanmalıdır. Tuzlama, parolaya rastgele bir dize ekler, böylece benzer parolalar DB'de aynı görünmez. Bununla birlikte, tuz her kullanıcı için benzersiz değilse (yani: sabit kodlanmış bir tuz kullanırsınız), tuzunuzu neredeyse değersiz hale getirmişsinizdir. Çünkü bir saldırgan bir şifre tuzunu bulduktan sonra hepsinin tuzunu alır.

Bir tuz oluşturduğunuzda, tuzlu olduğu şifreye özgü olduğundan emin olun, ardından hem tamamlanmış karma hem de tuzu DB'nizde saklayın. Bunun yapacağı şey, bir saldırganın erişim elde edebilmek için her bir tuzu ve hashı ayrı ayrı kırması gerekecek. Bu, saldırgan için çok daha fazla çalışma ve zaman anlamına gelir.

ŞİFRE YARATAN KULLANICILAR

Kullanıcı ön uçtan bir şifre oluşturuyorsa, bu sunucuya gönderilmesi gerektiği anlamına gelir. Bu bir güvenlik sorunu açar çünkü şifrelenmemiş parola sunucuya gönderilir ve bir saldırgan dinleyebilir ve PHP'deki tüm güvenliğinizin değersiz olduğunu öğrenebilirse. HER ZAMAN verileri GÜVENLİ bir şekilde iletir, bu SSL ile yapılır, ancak SSL'nin bile kusursuz olmadığından yorgun olun (OpenSSL'nin Heartbleed kusuru buna bir örnektir).

Ayrıca kullanıcının güvenli bir şifre oluşturmasını sağlayın, basittir ve her zaman yapılmalıdır, kullanıcı sonunda bunun için minnettar olacaktır.

Son olarak, hiçbir şey almamanız gereken güvenlik önlemleri% 100 güvenli olursa olsun, koruma teknolojisi ne kadar gelişmiş olursa saldırılar o kadar gelişmiş hale gelir. Ancak bu adımları izlemek sitenizi daha güvenli ve saldırganların peşinden gitmesi için çok daha az arzu edilir hale getirecektir.

İşte bir parola için bir karma ve tuz oluşturan bir PHP sınıfı

http://git.io/mSJqpw


1
Çok hızlı olduğu için SHA512'yi iyi karma algoritmalar listenizden vurmalısınız. Sadece PBKDF2 ile birlikte kullanın. BCrypt, blowfish'e dayanırken, blowfish'in kendisi, karma için değil, şifreleme için bir algoritmadır.
martinstoeckli

1
Rastgele tuzu DB'de nasıl saklarsınız? Bence hash (doğrulama için kullanılamaz) veya açık bir şekilde saklamıyorsunuz (saldırgan DB'yi okuyabilirse gerçek bir fayda yok). Peki, nasıl yapıyorsun?
Iazel

wmfrancia şunu yazdı: "Tuzlama parolaya rastgele bir dize ekler, böylece benzer parolalar DB'de aynı görünmez". Bu benim için bir anlam ifade etmiyor. DB'deki karmalar zaten farklı görünecektir çünkü bu, karma işlevlerinin bir özelliğidir.
H2ONaCl

wmfancia, sürekli bir tuzla ilgili olarak şunları yazdı: "Bir saldırgan tek bir şifre tuzunu bulduktan sonra hepsinin tuzunu alır". Aynı şey, bilgisayar korsanı hangi DB alanının tuz olduğunu tespit ederse, hepsinin tuzları olduğunu söyleyebilir. Sabit bir tuz muhtemelen DB'de olmayacağından, sabit bir tuz hakkında iyi bir şeydir.
H2ONaCl

Tabii ki, bu yorumlar kullanıcı başına rastgele bir tuzun uygulama başına bir tuzdan daha iyi olmadığını düşündürmemektedir. Daha iyi.
H2ONaCl

12

Google, SHA256'nın PHP için kullanılabilir olduğunu söylüyor.

Kesinlikle bir tuz kullanmalısınız. Rastgele baytlar kullanmanızı öneririm (ve kendinizi karakter ve sayılarla sınırlamayın). Genellikle, ne kadar uzun süre seçerseniz, o kadar güvenli, yavaşlar. 64 bayt iyi olmalı sanırım.


13
64 bit herkes için yeterli olmalı mı?
Konerak

@Konerak, 20 yıl sonra buna geri dönecektim. :) Ama SHA256 evet gerçekten kullanılabilir.
SHA256'nın

8

Sonunda, matematiksel olarak çift karma, hiçbir fayda sağlamaz. Bununla birlikte, pratikte, gökkuşağı tablosu tabanlı saldırıları önlemek için yararlıdır. Başka bir deyişle, uygulamanızda veya sunucunuzda çok daha az işlemci süresi gerektiren bir tuzla karıştırmaktan daha fazla fayda sağlamaz.


2
çoklu karma, sözlük ve kaba kuvvet saldırılarına karşı da koruma sağlar - yani bunların hesaplanması daha uzun sürer.
frankodwyer

6
çifte hash size önemli bir avantaj sağlamaz, ancak çok yönlü hashing yinelemeleri hala sözlük ve bruce kuvvet saldırılarına karşı uygulanabilir bir savunmadır. Endüstriyel güç şifre karmaları 1000'den fazla tur kullanır. PKCS # 5'in PBKDF1'i minimum 1000 tur öneriyor.
Berk D. Demir

8

Burada bu konuda mükemmel bir konu buldum: https://crackstation.net/hashing-security.htm , bundan faydalanmanızı istedim, burada da zamana dayalı saldırılara karşı önleme sağlayan kaynak kodu var.

<?php
/*
 * Password hashing with PBKDF2.
 * Author: havoc AT defuse.ca
 * www: https://defuse.ca/php-pbkdf2.htm
 */

// These constants may be changed without breaking existing hashes.
define("PBKDF2_HASH_ALGORITHM", "sha256");
define("PBKDF2_ITERATIONS", 1000);
define("PBKDF2_SALT_BYTES", 24);
define("PBKDF2_HASH_BYTES", 24);

define("HASH_SECTIONS", 4);
define("HASH_ALGORITHM_INDEX", 0);
define("HASH_ITERATION_INDEX", 1);
define("HASH_SALT_INDEX", 2);
define("HASH_PBKDF2_INDEX", 3);

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" . 
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

function validate_password($password, $good_hash)
{
    $params = explode(":", $good_hash);
    if(count($params) < HASH_SECTIONS)
       return false; 
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}

// Compares two strings $a and $b in length-constant time.
function slow_equals($a, $b)
{
    $diff = strlen($a) ^ strlen($b);
    for($i = 0; $i < strlen($a) && $i < strlen($b); $i++)
    {
        $diff |= ord($a[$i]) ^ ord($b[$i]);
    }
    return $diff === 0; 
}

/*
 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
 * $algorithm - The hash algorithm to use. Recommended: SHA256
 * $password - The password.
 * $salt - A salt that is unique to the password.
 * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000.
 * $key_length - The length of the derived key in bytes.
 * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise.
 * Returns: A $key_length-byte key derived from the password and salt.
 *
 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
 *
 * This implementation of PBKDF2 was originally created by https://defuse.ca
 * With improvements by http://www.variations-of-shadow.com
 */
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
    $algorithm = strtolower($algorithm);
    if(!in_array($algorithm, hash_algos(), true))
        die('PBKDF2 ERROR: Invalid hash algorithm.');
    if($count <= 0 || $key_length <= 0)
        die('PBKDF2 ERROR: Invalid parameters.');

    $hash_length = strlen(hash($algorithm, "", true));
    $block_count = ceil($key_length / $hash_length);

    $output = "";
    for($i = 1; $i <= $block_count; $i++) {
        // $i encoded as 4 bytes, big endian.
        $last = $salt . pack("N", $i);
        // first iteration
        $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
        // perform the other $count - 1 iterations
        for ($j = 1; $j < $count; $j++) {
            $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
        }
        $output .= $xorsum;
    }

    if($raw_output)
        return substr($output, 0, $key_length);
    else
        return bin2hex(substr($output, 0, $key_length));
}
?>

Bize hiçbir
Michael

6

Genellikle kullanıcı kimliğiyle SHA1 ve tuz kullanıyorum (veya kullanıcıya özgü başka bir bilgi parçası) ve bazen ek olarak sabit bir tuz kullanıyorum (bu yüzden tuz için 2 parçam var).

SHA1 şimdi de bir şekilde tehlikeye atılmış, ancak MD5'ten çok daha az derecede kabul ediliyor. Bir tuz (herhangi bir tuz) kullanarak , karmalarınıza saldırmak için genel bir gökkuşağı tablosu kullanılmasını önlersiniz (bazı insanlar karma'yı arayarak Google'ı bir tür gökkuşağı tablosu olarak kullanmada başarılı olmuştur). Bir saldırgan, tuzunuzu kullanarak bir gökkuşağı tablosu oluşturabilir, bu yüzden kullanıcıya özgü bir tuz eklemeniz gerekir. Bu şekilde, tüm sisteminiz için tek bir sistem değil, sisteminizdeki her kayıt için bir gökkuşağı tablosu oluşturmak zorunda kalacaklar! Bu tür bir tuzlama ile MD5 bile oldukça güvenlidir.


2
sürekli tuz harika bir fikir değildir ... muhtemelen ölümcül bir kusur değildir, ancak şemayı gereksiz yere zayıflatır.
frankodwyer

MD5 ve SHA1 hızlıdır, bu kötü bir şeydir.
CodesInChaos

4

SHA1 ve bir tuz (doğal olarak, Fort Knox için bir şey kodlayıp kodlamadığınıza veya alışveriş listeniz için bir giriş sistemi olup olmadığına bağlı olarak ) öngörülebilir gelecek için yeterli olmalıdır. SHA1 sizin için yeterince iyi değilse, SHA256 kullanın .

Bir tuz fikri, hash sonuçlarını dengede bırakmaktır. Örneğin, boş bir dizenin MD5 karmasının olduğu bilinmektedir d41d8cd98f00b204e9800998ecf8427e. Yani, eğer yeterince iyi bir hafızaya sahip biri, bu karmayı görür ve bunun boş bir dizenin karması olduğunu bilirdi. Ancak dize tuzlanırsa (örneğin, " MY_PERSONAL_SALT" dizesiyle ), "boş dize" karmasının (yani " MY_PERSONAL_SALT") karması aeac2612626724592271634fb14d3ea6geri izlemeye açık değildir. Bunun kullanmak daha olduğunu söylemeye çalıştığım şey , herhangi değil daha, tuz. Bu nedenle, hangi tuzu kullanacağınızı bilmek çok önemli değildir .

Aslında sadece bunu yapan web siteleri vardır - bir (md5) hash besleyebilir ve o belirli hash üreten bilinen bir düz metin tükürür. Düz md5 karmaları depolayan bir veritabanına erişirseniz, yöneticinin karmasını böyle bir hizmete girmeniz ve oturum açmanız önemsiz olacaktır. Ancak, şifreler tuzlanırsa, böyle bir hizmet olur etkisiz.

Ayrıca, çift hashlama genellikle kötü yöntem olarak kabul edilir, çünkü sonuç alanını azaltır. Tüm popüler karmalar sabit uzunluktadır. Böylece, bu sabit uzunluğun sadece sonlu değerlerine sahip olabilirsiniz ve sonuçlar daha az değişir. Bu olabilir tuzlama diğer bir şekli olarak kabul edilebilir, ama bunu tavsiye etmem.


Hedef site çok hassas bir şey içermemelidir (bir banka değil), ancak yine de güvence altına almayı tercih ederim.
luiscubal

1
çift ​​karma sonuç alanını azaltmaz. yinelemeli sağlama, sözlük ve kaba kuvvet saldırılarına karşı ortak bir kontroldür (bunları, şifre kontrolünüzü yavaşlattığından çok daha fazla yavaşlatır).
frankodwyer

2
@frankodwyer: evet, kötü. sha1(sha1($foo))etkin bir şekilde çıktı alanını azaltır, çünkü iç fonksiyondaki herhangi bir çarpışma otomatik olarak dış fonksiyonun çarpışması haline gelir. Bozunma doğrusaldır, ancak yine de endişe konusudur. Yinelemeli karma yöntemleri, her turda verileri geri besler $hash = sha1(sha1($salt . $password) . $salt). Ama bu hala iyi değil ... PBKDF2 veya Bcrypt ile sopa ...
ircmaxell

-7

tamam tuzlu tuz ihtiyacımız benzersiz olması gerekir, bu yüzden üretelim

   /**
     * Generating string
     * @param $size
     * @return string
     */
    function Uniwur_string($size){
        $text = md5(uniqid(rand(), TRUE));
        RETURN substr($text, 0, $size);
    }

Ayrıca sha512 kullanıyorum hash ihtiyacımız var en iyisi ve php

   /**
     * Hashing string
     * @param $string
     * @return string
     */
    function hash($string){
        return hash('sha512', $string);
    }

şimdi güvenli parola oluşturmak için bu işlevleri kullanabiliriz

// generating unique password
$password = Uniwur_string(20); // or you can add manual password
// generating 32 character salt
$salt = Uniwur_string(32);
// now we can manipulate this informations

// hashin salt for safe
$hash_salt = hash($salt);
// hashing password
$hash_psw = hash($password.$hash_salt);

şimdi $ hash_psw değişken değerimizi ve $ salt değişkenimizi veritabanına kaydetmemiz gerekiyor

ve yetkilendirmek için aynı adımları kullanacağız ...

müşterilerimizin şifrelerini korumanın en iyi yoludur ...

Ps son 2 adımda kendi algoritmanızı kullanabilirsiniz ... ancak kullanıcı yetkilendirmeniz gerektiğinde bu karma şifreyi gelecekte oluşturabildiğinizden emin olun ...


4
Bu soru parola karmalarıyla ilgiliydi. 1'in sha512(tuzlanmış olsa bile) yürütülmesi, parola koruması için yeterince iyi değildir. (ayrıca RNG'nin kriptografik olarak güvenli olmadığı için şifre oluşturmak için kullanmak risklidir).
luiscubal

2
Ne yaptığına dair hiçbir fikrin yok. Bu gönderideki en iyi yanıtları okuyun ve kodunuzun neden sadece güvensiz olmadığını, aynı zamanda anlamsız olduğunu görebilirsiniz.
şifreli

tamam. kodum güvenli değil. öyleyse bana algoritmalarınızda neden kullandığınızı bildirin ony sha256 ??? Sha512'nin neden kullanmamanın en iyi olduğunu biliyorum ???
shalvasoft

1
@shalvasoft sha512 genel amaçlı karma için oldukça iyidir, ancak parola koruması çok özel özelliklere sahip karma gerektirir ("yavaş olmak" garip bir şekilde iyi bir şeydir ve sha512 oldukça hızlıdır). Bazı insanlar parola karma işlevlerini oluşturmak için sha512'yi bir yapı taşı olarak kullanmıştır, ancak günümüzde önerilen yaklaşım "bcrypt kullanmak ve gözünü gizlemek" tir.
luiscubal
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.