Nasıl iyi mağaza kullanıcı bilgileri ve kullanıcı adı ve şifre

8 Cevap php

Ben Mysql kullanıyorum ve iki farklı tabloya bir kullanıcıların kişisel bilgilerini ve bunların giriş ve şifre ayırmak ve sonra sadece ikisi arasında referans onları daha iyi olduğunu varsayarak.

Note: Yazımın açıklığa kavuşturmak için, ben şifre (hash, tuz, vb) güvence tekniklerini anlamak. Ben sadece benim hayatımın diğer bölgelerinde (yatırım, veri yedekleme, hatta kişisel depolama) den uygulamaları takip ediyorum eğer tablolar arasında bölünmüş bir bilgiye sahip potansiyel sağladığını kötü durum senaryosu (oluşan tablo veya yangın) koruyacak şekilde olduğunu biliyorum sizin Ek veri.

8 Cevap

Şifreleri tutmayın. Hiç bir disk üzerinde oturuyor, bu çalıntı olabilir. Bunun yerine, deposu şifresi sağlamalarının. Use the right hashing algorithm, bcrypt (bir tuz içerir) gibi.

EDIT: OP o Yukarıdaki sorunu anladığını yanıt verdi.

Giriş gelen fiziksel olarak farklı bir tablo parolayı depolamak için gerek yok. Bir veritabanı tablo ele geçirilirse, bu aynı veritabanındaki başka bir tabloya erişmek için büyük bir sıçrama değil.

Güvenlik ve güvenlik-in-derinliği hakkında yeterince endişeleriniz varsa, etki alanı verilerinden tamamen ayrı bir veri deposunda kullanıcı kimlik bilgilerini depolamak düşünebilirsiniz. Bir yaklaşım, yaygın olarak yapılır, bir LDAP dizin sunucusu kimlik bilgilerini depolamak için. Bu da daha sonra yapılacak herhangi bir tek-sign-on çalışmaları ile yardımcı olabilir.

Parolaları düz metin okuma engelleyen bir tersinir olmayan bir işlemdir bir kriptografik karma olarak saklanmalıdır. Kullanıcıların kimlik doğrulaması yaparken, şifre giriş aynı karma işlemine tabi ve karmaları karşılaştırılır.

MD5 veya SHA1 gibi hızlı ve ucuz karma kullanmaktan kaçının; nesnel (karma çarpışmalar göre) gökkuşağı tabloları hesaplamak için bir saldırgan için pahalı yapmaktır; Hızlı bir karma bu dengeler. Bu karma bir tek kaçak hiçbir etkisi olacak çünkü pahalı bir karma kullanımı, kimlik doğrulama senaryoları için bir sorun değildir.

Sağlama ek olarak, rasgele oluşturulmuş bir değer ile karma tuz; daha sonra veritabanında saklanan ve önceden sağlama için veri ile birleştirilmiş bir şimdiki zaman,. Bu çarpışmalar hesaplama oluşturulacak olması olası kombinasyonların sayısını artırır ve böylece gökkuşağı tabloları oluşturma genel zaman karmaşıklığı artar.

Sizin parola hash sütun sabit bir uzunlukta olabilir; sizin şifreleme karma tüm sağlamalarının için aynı olacak, sabit bir uzunluk içine kodlanmış olabilir çıkış değerleri olmalıdır.

Mümkün, kendi parola kimlik doğrulama mekanizması haddeleme önlemek; gibi varolan bir çözümü kullanın bcrypt.

Mükemmel şifreleri işlemek için nasıl açıklama ve ne ile kendinizi endişe gerekir, http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes bulunabilir.

Son bir not olarak, bir saldırganın veritabanına erişimi edinirse, o zaman acil endişe muhtemelen onlar erişimi olabilecek hassas ya da kişisel tanımlayıcı bilgiler ve yaptıkları herhangi bir hasar olması gerektiğini lütfen unutmayın.

Aynı tabloda koyarak yanlış bir şey yok. Aslında, çok daha hızlı olurdu, bu yüzden kesinlikle tavsiye ederim. Eğer onu bölmek isterdim neden bilmiyorum.

Ben orijinal soruyu cevaplamak için deneriz. Sadece toplamak için kişisel bilgilerin bir sürü yoksa tek bir tabloda tüm olması gayet iyi. Bu durumda onu bölmek için mantıklı olabilir. Bu karar ile ilgileniyor ve ne sıklıkla erişilen gereken konum kişisel bilgilerin miktarına göre yapılmalıdır.

Ben tek bir tabloda böyle bir şey yapardı çoğu zaman söylemek istiyorum:

UserID, FirstName, LastName, Email, Password, TempPassword

Ama ... sen bundan çok daha fazla bir araya eğer. Eğer, telefon, faks, doğum tarihi, biyografi, vb topluyoruz Ve bu bilgilerin çoğu nadiren erişilen eğer o zaman ben muhtemelen kendi tablosunda ve bir-bir ilişkisi ile bağlamak koymak istiyorum söylüyorlar. Sonuçta, daha az sütun bir tablo üzerinde olması, bu tabloya karşı hızlı sorgular olacaktır. Ve bazen en çok erişilen tabloları basitleştirmek için mantıklı. Göz önünde bulundurmanız gerekir bu kişisel bilgilere erişmek gerekiyor rağmen her JOIN, böylece bir şey ile bir performans isabet vardır.

EDIT - Ben sadece bir şey düşündüm, biliyorum. Eğer kullanıcı adı veya e-posta alanına (hangisi tercih) bir dizin oluşturursanız, neredeyse tamamen bir kullanıcı tabloda pek çok sütun oluşturma performans dezavantajı ortadan kaldırmak gerekir. Ben WHERE yan tümcesi giriş ne zaman, çünkü aslında bir dizin var ve bu tablodaki 100 sütun varsa önemli değil eğer kullanıcı adı bulmak için son derece hızlı olacağını söylüyorlar. So I've changed my opinion. I'd put it all in one table. ;)

Güvenlik popüler bir konu gibi görünüyor çünkü her iki durumda da, şifre karma değeri olmalıdır. (Eğer bu konuda gerçekten endişeleriniz varsa veya SHA256) Ben SHA1 öneririm. TempPassword da bir karma kullanmak gerekir ve o şifremi unuttum işlevselliği için sadece orada bulunuyor. Açıkçası bir karma ile şifresini ve kullanıcı özgün parolasını gönderemezsiniz. Yani bunun yerine onlar ile giriş yapabilirsiniz geçici bir şifre oluşturmak ve ardından giriş yaptıktan sonra tekrar kendi parolasını değiştirmek için zorlamak.

İlk olarak, devlet (umarım) belirgin, herhangi bir şekilde tüm bunu adları ve şifreleri depolamak önlemek eğer; büyük bir sorumluluk ve kimlik mağaza ihlal eğer o (nedeniyle şifre paylaşımı) aynı kullanıcılar için pek çok başka yerlere erişim sağlayabilir.

Eğer kimlik bilgileri saklamanız gerekir:

  • Tersine çevrilebilir formu tutmayın; SHA-256 gibi tanınmış algoritma kullanarak bir karma saklayın. Bir saygın güvenilir bir kaynaktan şifreleme yazılımı kullanın - KENDİ ROLL KALKIŞMAYIN, büyük olasılıkla onu YANLIŞ KAZANACAK.
  • Her kimlik seti için, karma veri ile birlikte bir tuz saklamak; Bu kullanıldığı için "prime" iki özdeş şifreleri aynı karma üretmek değil karma şekilde - yani şifreleri aynı olduğunu ele veriyor beri.
  • Bir güvenli rasgele jeneratör kullanın. Zayıf rastgele şifreleme ilgili güvenlik hatalarına değil, şifreleme algoritmaları bir numaralı nedenidir.

Eğer saklamak gerekiyorsa reversible kimlik bilgileri:

  • AES-256, 3DES (tarih), ya da bir ortak anahtar şifreleme - iyi bir şifreleme algoritması seçin. Bir saygın güvenilir bir kaynaktan şifreleme yazılımı kullanın - KENDİ ROLL KALKIŞMAYIN, büyük olasılıkla onu YANLIŞ KAZANACAK.
  • Her kimlik seti için, şifreli veri ile birlikte (şifrelenmemiş) bir tuz saklamak; Bu kullanıldığı için "prime" iki aynı şifre aynı şifre metin üretmek değil şifreleme, öyle ki - bu şifreleri aynı olduğunu ele veriyor beri.
  • Bir güvenli rasgele jeneratör kullanın. Zayıf rastgele şifreleme ilgili güvenlik hatalarına değil, şifreleme algoritmaları bir numaralı nedenidir.
  • Sadece uygulamalar zamanı profilinize erişilebilir bir O / S güvenli dosyasında, senin veritabanından ayrı şifreleme / şifre çözme anahtarı (ler) saklayın. DB ihlal ise genel olarak HDD erişim gerektirir, çünkü bu şekilde, (örneğin, SQL enjeksiyon yoluyla) anahtar, otomatik savunmasız değildir. Senin O / S için bir tercihe bağlı dosya şifrelemeyi destekler varsa, onu kullanın - bu sadece yardımcı olabilir ve bu (örn. NTFS şifreleme), genellikle şeffaf.
  • Pratik, kendilerini birincil şifre ile şifrelenmiş anahtarlarını saklamak. Bu genellikle uygulama anlamına gelir. başlangıçta girilmezse bu şifreye ihtiyacınız olacak - sizin HDD ihlal edilirse eğer anahtar dosyası ve komut hem de görülebilir olduğunu varsaymak gerekir çünkü bir komut bir parametre bunu sağlamak için hiçbir iyi yapar.
  • Adı hesap kaydı şifrelemek kullanıcı adı ve şifre hem de bulmak için gerekli değilse.

Benim kişisel deneyim, bireysel veritabanlarında kişisel bilgileri ve oturum açma bilgilerini depolamak bu durumda en iyi uygulamadır. (Köstebek veritabanı (ler) iç düzenini bilen olmadığı sürece) varlık bir SQL enjeksiyon yer almalıdır nedeni, bu verilerin tüm çakıltaşı erişim sağlayan aksine verileri ile ilgilidir tabloya sınırlıdır.

Ancak, bu daha fazla sorgular, dolayısıyla bir performans isabet gerçekleştirmek için ihtiyacı pahasına gelebilir olduğunu unutmayın.

Tüm bu veriler, her zaman kullanıcı ile 01:01 ilişki var mı? Kullanıcıların vb birden adresleri, telefon numaraları, için izin öngörüyoruz olabilir, o ayrı bir tabloya kişisel bilgileri dışarı kırmak isteyebilirsiniz.

Sen aynı tabloda saklayabilirsiniz, ve tek yönlü şifreleme kullanmak gerek. MD5 çalışır, fakat zayıf, bu yüzden SHA1 veya başka bir yöntemle gibi bir şey düşünebilirsiniz olacaktır. Ayrı tablolarda 2 öğeleri saklamak için hiçbir yararı yok.