php parola / giriş sistemi

5 Cevap php

Php bir giriş sistemi için bu işe nasıl uygun bir taslak olacaktır:

Kullanıcıların tipleri kullanıcı adı ve şifre, tıklama butonu giriş.

  1. Checks if kullanıcı exists in database,
  2. if it does, then retrieve the salt for that kullanıcı
  3. hash the password and salt (would this be done on the client or server side? I think client side would be better, but php is server side so how would you do this?)
  4. check value against value in database,
  5. if the values match then kullanıcı has typed in correct password and they are logged in.

5 Cevap

Daha sonra şifre ve tuz karma kullanıcı için tuz almak durumunda kullanıcı, veritabanında var bakar

No Bu iki kere veritabanı isabet demektir.

parola ve tuz (bu istemci veya sunucu tarafında yapılması olacaktır karma? ben istemci tarafında daha iyi olacağını düşünüyorum

Birisi veritabanı tavizler varsa, onlar (kolayca) o kullanıcı olarak oturum açmak için sisteminizde (veya diğer sistemler) göndermek için gerekenleri öğrenmek değil, böylece No şifreyi karma bir nokta.

Eğer sunucuya göndermeden önce parola hash, sonra saldırgan JS bypass ve sisteminize veritabanından okuma prehashed şifre gönderebiliriz.

  1. Kullanıcı adınızı ve şifrenizi gönderir
  2. Şifre sistemi için standart tuz ile karılır
  3. = Adı your_users DAN bazı cols SEÇ? ve şifre =?
  4. Veritabanından döndürülen satırların sayısını.

Daha sonra şifre ve tuz (bu istemci veya sunucu tarafında yapılır olacağını kullanıcı karma için tuz almak durumunda kullanıcı, veritabanında var bakar? Ben istemci tarafında daha iyi olacağını düşünüyorum, ama php yüzden nasıl olur sunucu tarafı Bunu?)

Hatırlanması gereken önemli şey, never ever kimlik doğrulaması, sunucu tarafında mümkün olduğunca yapmalıyım söz konusu olduğunda gelir kullanıcıyı güven olmasıdır. Mümkün olduğunca kullanıcı olarak biraz bilgi vermek ve bir şey ile onlara güvenmiyorum.

Sorunuza gelince, bariz nokta kullanıcı karma precompute izin verirseniz ilgili çok fazla veri transferi olmasıdır. Aksine, tek bir istek ve cevaptan daha gerekli 3 istekleri ve yanıtları vardır. Ayrıca JavaScript etkinleştirilmiş bir tarayıcı bir tarayıcı gereksinimleri artar. Hedef kitleniz üzerinde kullanıcıların bir sürü olarak JavaScript (NoScript eklentisi yoluyla genellikle) devre dışı olabilir.

Kullanıcı tuz Eğer tuz birleştirmek ve şifre nasıl yaptığını onlara göstererek, gökkuşağı tabloları karşı savunma etkisi olmaz görmek için izin verirken, güvenlik ile ilgili.

Web arayüzü üzerinden kaba kuvvet girişimleri umarım saatte sadece adı başına 5 (veya çok) giriş girişimlerini sağlayacak gibi that, bir çok sorunu zaten değildir. Tuz bilmek ve algoritma karma (Bu sadece sever yükünü azaltır ;)) hiç yardımcı olmuyor. Ancak onlar bir veritabanı var ve çok daha kolay bir kaba kuvvet saldırısı yapmak için bu hale tuz ve karma birleştirmek için nasıl biliyorsanız.

Bilinmezlik aracılığıyla güvenlik gerçek bir savunma olsa da, onu kırmak çok zor sistem yapmak yok, bu yüzden istemci tarafında hash yapmak girişimi olmadığını öneriyoruz.

Bu Server Side olmalı

Sen doğru yolda, ama bana senin sistemini geliştirmeye yardımcı olsun.

Güçlü bir rasgele bir anahtar oluşturmak ve belge kök üstünde bir dosyada saklayabilirsiniz:

/home/username/key
/home/username/public_html/login.php

Dosya mümkün olduğu kadar çok rasgele gücü ile ikili veri (sözde) içermelidir. Rasgele veri 512-bit oldukça iyi olmalıdır.

Sonra sistemde her kullanıcı için benzersiz bir tuz oluşturur. Bu tuz rasgele ikili veri 16-bit daha güçlü olmak zorunda değildir.

Son olarak, şifre sağlamalarının gibi bir şey olmalıdır:

hash('sha256', $password . $salt . $key);

hash algoritması çok önemli yere. MD5 veya SHA-1 kullanmayın. SHA-2 ailesi kullanın, tipik SHA-256 veya SHA-512. Ayrıca, Whirlpool iyi bir seçimdir.

Eğer daha sistem geliştirmek istiyorsanız, yinelenen tekrar ve tekrar gibi karma olabilir:

public static function hash($algorithm, $data, $iterations = 1, $rawOutput = false)
{
    if ($iterations < 1)
        throw new Exception('There must be at least one iteration.');

    while ($iterations--)
    {
        $data = hash($algorithm, $data, true);
    }

    return ($rawOutput ? (binary) $data : bin2hex($data));
}

Neden böyle birçok hamle?

  1. Kullanıcı veritabanında varsa verilen tuzlu karma şifre ile kontrol
  2. öyle ise, o kullanıcı bilgilerini almak

hepsi bu

Eğer sunucuya istemci güvenli şifre transferi söz ediyorsanız - bu başka bir hikaye, sen şema için yetkilendirme açıklama sindirmek HTTP başvurabilirsiniz. Kısacası, sunucu tarafında saklanan rastgele bir kerelik belirteci kullanarak istemci tarafında şifre karma bulunuyor. OR SSL, tabii