2012-12-04 74 views
0

每次用戶登錄數據庫時,更改密碼值是否是一種好方法? 我已經寫了一個散列函數來散列密碼,當用戶在系統上註冊一個新帳戶。 每次用戶登錄時,數據庫中的散列值都將被更改。是好還是壞?每次登錄時更改數據庫中的密碼值

+0

這取決於你是如何做到的。我們可以看到一些代碼嗎? –

+2

你想解決什麼問題? –

+1

除非你能想出一個特定的場景,否則這聽起來會增加複雜性而沒有任何安全性的好處。 – Kitsune

回答

1

如果你設計了這個散列函數全部由你自己來完成......這是一個非常糟糕的主意。你爲什麼需要這樣的東西?如果你存儲鹽醃SHA-256哈希密碼,安全性就足夠好了。您不需要重新生成密碼,它不提供任何額外的安全性。如果讓我們說你的應用程序傾向於SQL注入,那麼這個方案將不會保護你的應用程序。你會好很多,如果您使用鹹魚和鍵控SHA-256,是這樣的:(我不是一個PHP的編碼器,我只是希望我們的應用程序是安全的)

$username = 'Admin'; 
$password = 'gf45_gdf#4hg'; 
$key = 'MySuperSecretKEY!!!!'; 
$salt = hash('sha256', uniqid(mt_rand(), true) . 'something random' . strtolower($username)); 
$hash = $salt . $password . $key; 
$hash = hash('sha256', $hash); 
$hash = $salt . $hash; 

,然後檢查:

$username = 'Admin'; 
$password = 'gf45_gdf#4hg'; 

$sql = ' 
    SELECT 
    `hash` 
    FROM `users` 
    WHERE 
     `username` = "' . mysql_real_escape_string($username) . '" 
    LIMIT 1 
    ;'; 

$r = mysql_fetch_assoc(mysql_query($sql)); 

$salt = substr($r['hash'], 0, 64); 
$hash = $salt . $password . $key; 
$hash = hash('sha256', $hash); 
$hash = $salt . $hash; 

if ($hash == $r['hash']) { 
    //OK 
} 

因此,即使攻擊者能夠欺騙他不知道的醃製算法,一把鑰匙也不會在SQL注入攻擊中重現有效的哈希值。

+0

對不起,我的意思是我得到了樣本散列,然後我修改了一下。這是源http://alias.io/2010/01/store-passwords-safely-with-php-and-mysql/我很新的PHP,真的很想從中學到很多東西。任何形式的幫助將不勝感激。感謝:D – harmandogilang

+0

對每個用戶使用不同的salt是一個好主意,它會增加破解密碼數據庫所需的時間,因爲生成的hash只能用於檢查一個帳戶。 – Wizzard

+0

@Wizzard是的,我知道,但每次用戶登錄時更改散列值都不錯?當用戶登錄時,我會調用散列函數來再次散列密碼,並且每次登錄數據庫時值都會更改,但原始密碼相同 – harmandogilang

相關問題