2011-05-24 150 views
0

我測試SHA1和MD5的幾種組合:PHP的用戶的密碼保護

<?php 
$test = 'fail test'; 
echo nl2br ("Text: $test\n"); 
echo nl2br ("md5: ".md5($test)."\nsha1: ".sha1($test)."\nsha1(md5): ".sha1(md5($test))."\nmd5(sha1): ".md5(sha1($test))); 
?> 

輸出:

Text: fail test 
md5: 748410d0085967c496d54dd8fcbecc96 
sha1: d730125e8cb8576459173655148fb6896ef44c09 
sha1(md5): faa3ebeecfec45e509e93e6b245a69e2a78785ea 
md5(sha1): b48e89b85c350c91eb302c1de96d4249 

哪一個更好,也許用戶別的東西嗎?如果是,那麼呢?

+0

我不確定你在測試什麼? – Neal 2011-05-24 18:09:12

+4

更適合什麼目的?如果你正在尋找安全性,我不會使用MD5。使用兩者都不會增加安全性。在某些情況下,它實際上可以減少它。 – 2011-05-24 18:10:39

+0

也許話題是不正確的,但想找到解決方案如何讓用戶通過破解不可能或使它只是很難破解它。 – ZeroSuf3r 2011-05-24 18:12:19

回答

1

散列散列不會增加額外的安全性。 (事實上​​,如果這個人有一個散列哈希查找表,它可能會變得更糟)。

最好的哈希將是計算上最昂貴的執行沒有任何漏洞。我會散列密碼至少sha-256。

總是使用醃製密鑰來散列您的密碼。此密鑰應該是唯一的每個密碼。它不需要私人儲存。醃製密碼的用途是,獲得對數據庫訪問權限的黑客不能簡單地將散列與已知的與通用密碼對應的散列列表進行比較。相反,他必須嘗試通過嘗試每個可能的密碼來強制密碼。

通過對每個密碼使用唯一的salt,即使它們使用相同的密碼,也可以保證數據庫中的每個散列值都不相同。

爲了使用密碼,只需創建一個隨機字符串並將其附加到密碼。下面是一個帶有48位salt和sha-256的示例哈希:

function make_password($password) 
{ 
    # random 48-bit salt (8 chars when base64 encoded) 
    $salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff))); 

    return $salt.hash('sha256', $salt.$password); 
} 

function check_password($password, $hash) 
{ 
    $salt = substr($hash, 0, 8); 
    return hash('sha256', $salt.$password) == substr($hash, 8); 
} 

$password = 'password'; 
$hash = make_password('password'); 

echo $hash."\n"; 

var_dump(check_password('password', $hash)); 
var_dump(check_password('wrong', $hash)); 

每次運行它時,哈希將會不同。要驗證密碼,請選擇用戶名匹配的行,然後致電check_password($password_from_user, $hash_from_db)

下面是一個示例輸出:

AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496 
bool(true) 
bool(false) 

,如果你願意的話,可以使用更大的鹽或更強的哈希算法。但至少,我會使用類似上述的東西。

2

它們都是隻能單向操作的加密散列函數,主要區別在於MD5輸出大小是128位,而SHA-1是160位。簡而言之,儘管現在MD5更常見,但我沒有看到它們與使用它們有很大不同。

奇怪的是,當他們全部加密爲32個字符長的字符串時,我無法真正瞭解md5($ text)與md5(sha($ text))的不同之處,那麼md5($ text。「token 「) 例如?

而且,你的意思是什麼更好?這是更好看還是更安全?如果你更喜歡安全性,請參閱bcrypt維基百科:http://en.wikipedia.org/wiki/Bcrypt

+0

它們是散列函數,而不是加密函數。加密意味着能夠解密它們。除了基本的突破數學理論或者哈希方法中以前未知的缺陷,sha1和md5都是單向操作。 – 2011-05-24 18:33:35

+0

我明白你的意思了:)我知道MD5被定義爲一個密碼散列函數,但有時我會說一個動詞,描述將一個普通字符串轉換爲一個md5字符串的行爲,我通常會說「使用md5加密它」。這似乎是理論上的錯誤,但人們只是說...謝謝你讓我知道。 – 2011-05-24 18:48:45

1

你應該用你的密碼,永遠。這並不能阻止通過登錄表單進行暴力破解,但如果有人設法獲得細節信息,破解就會困難得多(除非他們設法弄到你的鹽,否則彩虹桌子將毫無用處)

本質上,如果你添加到原始數據或以受控方式進行重組,將使安全性更好一些。沒有人可以顛倒散列,但他們可以找到與散列匹配的其他輸入。處理用戶輸入會讓黑客更難登錄。

例如,如果用戶的通行證是123456(只有延遲會使用這個例子,但是它是一個例子),如果你添加一個「salt」的鹽,所以它變成123456salt,這個MD5就是207acd61a3c1bd506d7e9a4535359f8a。一個黑客可以破解這個成爲123456salt,但是當涉及到在你的登錄表單中使用它時,你的代碼會再次添加salt,登錄將失敗。