2012-06-06 69 views
0

我重寫PHP登錄系統,我只是面對這個登錄系統的Hash鹽

function createSalt() 
{ 
    $string = md5(uniqid(rand(), true)); 
    return substr($string, 0, 3); 
} 
$salt = createSalt(); 
$hash = hash('sha256', $salt . $hash); 

Actualy我從來沒有與鹽析工作之前,我搜索了一下,發現它是有用的。 但我的回答是,這是一個用鹽工作的好方法嗎? 會不會$string = sha1(uniqid(mt_rand(), true))更好?

那麼只返回散列的3個字符?我真的不明白。

你覺得呢?

+0

這是一個比簡單哈希更好的子原子位。但是有更好的工具,比如[phppass](http://www.openwall.com/phpass/)或[PBKDF2](https://defuse.ca/php-pbkdf2.htm),它們更安全。你只需要確保你使用的任何新函數你仍然可以驗證舊的哈希(並且你必須檢測哈希是舊的還是新的)。 – vstm

回答

1

我更喜歡sha1或sha256,md5是超級過時的,sha功能更好。但這是我的看法,選擇你想要的。

在這種情況下真正重要的是鹽。 salt總是以明文形式與散列一起存儲,並用於提高密碼長度(如果要散列密碼,當然可能是其他內容),以防止基於彩虹/查找表的攻擊。這不能防止使用暴力破解密碼(這對md5非常有效,所以使用sha256很難破解)。

因此,如果你使用32個隨機字符作爲散列,或者類似md5(mt_rand()) - 重要的是長度,這是完全不重要的。我會使用類似

$hash = md5(mt_rand()) . md5(mt_rand()); 

MD5()導致32字節的字符串,根據隨機數(mt_rand()是更好然後UNIQUEID())。有了這個simpel行,你會得到一個非常「強大」的散列,它應該保護每個密碼不受彩虹表的影響。

+0

__這些算法都沒有(md5,sha1,sha256)適合密碼散列,並且使用它們是危險的。他們在2012年也不合適。這裏唯一正確的選項是真正的密碼哈希算法,如bcrypt,scrypt或Argon2i。 –

0

我不同意給定的功能createSalt()-主要是出於同樣的原因。

我的這種做法是

define(SALT_LENGTH,32); 

function createSalt() 
{ 
    $string=''; 
    for ($i=0;$i<SALT_LENGTH;$i++) $string.=chr(rand(0,255)); 
    return $string; 
} 

一個好的鹽是隨機字節序列 - 無MD5或SHA-1使任何意義,因爲沒有什麼可哈希!

3

考慮使用PHP的crypt()而不是重新發明輪子。它專門設計用於密碼散列,並提供適合該目的的散列算法。

0

我沒有掌握PHP程序員,但我一直在爲登錄系統使用相同的哈希腳本。

林存放在GitHub上 - https://github.com/revitalagency/PHP5-Salt-Super-Admin

我使用創造了我的散列...

hash_hmac('sha256', $_POST['pass'], GLOBAL_SALT); 

GLOBAL_SALT是不是在一個數據庫中的配置文件提供額外的保護規定。