我一直在想,也許我的登錄系統並不像我想的那樣安全。首先,我要用口頭向你解釋我在做什麼。密碼「鹽」 - 我做對了嗎?
當用戶註冊時,會生成16個字符的鹽。 我的鹽儲存在一個字段中的數據庫稱爲「鹽」 我存儲哈希密碼+鹽(它們被散列一起hash("sha256", $salt.$password);
)在一個被稱爲「密碼」域
當用戶試圖登錄,我從數據庫中獲取「密碼」字段和「鹽」字段以及其他一些內容。
要檢查,如果他們進入他們的密碼正確,我這樣做:
$hashed = hash("sha256", $row['salt'].$pass);
if ($row['password'] == $hashed) {
//success
($行是從數據庫$行[「鹽」]所取得的數組是在數據庫中,$鹽pass是他們輸入的密碼,而$ row [「password」]是數據庫中的哈希合格+ salt)
我在想,它在我看來,我的鹽提供很少(或沒有)所有。我向你們提出的所有問題僅僅是:我的方法是否提供了額外的安全性(或者它甚至可以保護所有安全嗎?)
另外,我還有第二個'問題'。我想驗證這個「檢查登錄」腳本不能被欺騙/欺騙,以便在沒有他們的密碼的情況下進入某人的賬戶。
session_start();
require_once 'db_connect.php';
//If the session variable "id" isn't set (i.e. they aren't logged in)
if (!isset($_SESSION['id'])) {
//Check if they wanted to be "remembered" (so they have 2 cookies
if (isset($_COOKIE['rem_user']) && isset($_COOKIE['rem_pass']))
{
$query = "SELECT
id,
password,
auth,
email,
username
FROM users
WHERE
username='".$_COOKIE['rem_user']."'
AND active IS NULL"
$res = mysql_query($query);
if (mysql_num_rows($res) == 1)
{
$row = mysql_fetch_array($res);
// If the "remember me" cookie containing their password
// is equal to the one in the database, log them back in.
if ($_COOKIE['rem_pass'] == $row['password'])
{
$_SESSION['id'] = $row['id'];
$_SESSION['username'] = $row['username'];
$_SESSION['auth'] = $row['auth'];
$_SESSION['email'] = $row['email'];
$logged_in = 1;
}
}
}
else
$logged_in = 0;
}
else
//Since the session variable "id" WAS set, they ARE logged in.
$logged_in = 1;
我認爲,只有這樣,才能就是登錄...
- 欺騙,我不認爲這是可能的,而不服務器訪問
- 欺騙帶有cookie的會話變量加密的密碼+ salt,我相信這幾乎不可能訪問數據庫。
反饋將不勝感激。我想確保我的系統是安全的。 :)
謝謝!
如果你自己在做:不,它是*不*正確的:)好吧,這有點sn,,但這個同樣的問題不斷出現在不同的形式,並展示了許多問題,自己的安全。 – 2012-04-02 23:55:05
如果攻擊者獲得了直接訪問數據庫的權限,他們將無法使用預先生成的彩虹表(或類似)來查找與密碼哈希值相沖突的問題,從而爲您提供安全性。 – 2012-04-02 23:55:39
pst,怎麼樣?什麼會更好? o3o @Oli Charlesworth好的,這很有道理,但是鹽是用來做什麼的?我一直認爲會有更多的安全性。 – fruitcup 2012-04-02 23:57:33