Tek bir sorgu ve kullanıcı başına şifre tuzu ile Kullanıcı Girişi

4 Cevap php

Ben veritabanında saklanan bir kullanıcı başına tuz kullanarak kullanıcı giriş uygulamaya karar verdik. Tuz SHA ile karma ve databse saklanan bir şifre öneki.

Ben bir tuz kullanmadığınız zaman Geçmişte kullanıcı girilen kullanıcı adı ve şifresini kullanarak bir sorgu tarafından döndürülen satırların sayısını sayma tipik yöntemini kullanırsınız. Bir kullanıcı başına tuz ile ancak, size saklanan şifre karma ile karşılaştırabilirsiniz önce tuz almak gerekir.

Yani girilen kullanıcı adı dayalı tek bir sorguda tuz ve karma şifre almak için karar (giriş kimlik bilgilerini doğrulamak için tuz ve başka almak için 1) iki sorgu zorunda kalmamak için. Gibi bir şey

SELECT users.salt, users.password
        FROM users   
        WHERE username = ?'

ve sonra serverside kodu (PHP) Ben girilen şifre ile tuz birleştirmek, bunu karma ve zaten veritabanından alınan şifre ile karşılaştırın.

Açık değilse, ben temel fark, ikinci yöntemde ben bu veritabanında yapıldı puanlık önce PHP kimlik bilgilerini kontrol ediyorum sanırım.

Bu yöntemin herhangi bir dezavantajı şartları güvenlik ya da başka var mı

4 Cevap

Böyle bir sorguda bunu başarabilir:

SELECT 
   SHA1(CONCAT(users.salt, "password-input")) = users.passwordhash
WHERE 
   username = "username-input"

... Ve "sunucu tarafı kodu (PHP) 'in sunucu hangisi? Ben DBMS sunucu ve her şey istemcisi olan bir dünyadan geliyor. Ben bir sunucunun kendisinde zorunlu olarak ayrı bir gizmo olarak değil 'sunucu tarafında' ve DBMS gibi bir web sunucusu bakıyoruz şüpheli. Ah evet, bu tür bakış açılarının görelilik teorisi. (Ve ben müşterileri vs X11 sunucuları üzerinde başladı alamadım!)

Evet, sadece tek bir işlemle kullanıcı adı için tuz ve tuzlu, karma şifrenizi toplamak ve daha sonra PHP sağlanan şifrenizi ve tuz SHA sonucu üretmek, alınan karma şifre değeri ile karşılaştırarak mantıklıdır. Hatta parola veritabanı sunucusuna PHP seyahat etmez, böylece iletişim (PHP ve DBMS aynı makinede olmayan durum) veya şifreli değilse önemli değil demektir. Ayrıca PHP DBMS hesaplama yükünü; Bu bir yararı olmadığını PHP göreceli iş yükleri ve DBMS bağlıdır.

Başka bir cevap da belirttiği gibi, bu DBMS kullanıcının sağlanan bir parola gönderme ve DBMS karma hesaplaması yapmak zorunda tarafından cevap almak mümkün. Sadece kullanıcı girişi alıntı dikkat - SQL enjeksiyon engellemek için kaçış. Bu potansiyel DBMS PHP gezi gözetleme için şifreyi ortaya koyar. Ne kadar önemli sizin altyapıya bağlıdır.

Ben sizin yaklaşım genellikle ses olduğunu düşünüyorum. Kullanmak ne kadar sorgu daha önemli, kötü bir parola kullanıcı tarafından girişi bile tel üzerinden geçerli veritabanı parolası alınıyor olmadığıdır. Db sunucu üzerinde bir şifreleme işlevi yararlanarak, bu kaçınarak ve işler daha güvenli yapıyoruz oysa sorgu, bu yok.

Hatta daha güvenli, tel üzerinde SQL sorguları koklama, veya başka yollarla herkes gelen şifreleme türünü (ya da herhangi bir hatta kullanılıyor olması) gizleyen bir saklı yordam veya işlev kullanmak yapmak için (örneğin, neden SQL enjeksiyon açıklarını kullanarak görünür olmasını sorgular, ya da) bir hata iletisi sorguyu açarak.

Ben onunla hiçbir sakınca görüyorum. "Gahooa" de mükemmel bir cevap verdi. Bu veritabanı sunucusu, web sunucusu işleme maliyetini kayması olacak, ama bu yüke daha uygun bir sizin için sadece bir soru.