2013-05-19 485 views
1

目前我正在使用特定的方案來保護密碼,我想我有一些要改進的地方。這個實現是用Java編寫的,所以我更喜歡使用SHA-2 512作爲加密表單。密碼安全

目前,我有一個客戶端 - 服務器模型,所以這些事情都可能發生:

  • 客戶希望登錄,他把他的一次正常的SHA-2 512加密在網絡上的密碼。
  • 服務器將密碼存儲在數據庫中,例如SHA-2_512(SHA-2_512(password)+ salt),內部SHA-2_512(密碼)是通過網絡接收的'加密'密碼。
  • 密碼檢查是在服務器端完成的,沒有任何方法可以從服務器泄漏出來,唯一可能的漏洞是如果有人能夠讀出我認爲的RAM。

我有以下問題:

  • 攻擊者通常想破解密碼時產生的碰撞攻擊。但是,碰撞攻擊如何充分?如果密碼需要用於Outlook.com,Facebook等其他應用程序(可能使用另一種鹽,因爲它們與我的應用程序無關),那麼碰撞攻擊是如何進行的?你不需要真正的密碼嗎?

  • SHA-2 512是否已經使用迭代?即使如此,我是否應該將自己的加密方法更改爲自動使用多次迭代以及優先迭代次數?我也讀過使用隨機數的迭代(在一個範圍內),我如何存儲隨機因子?

  • 我應該爲服務器代碼中的每次迭代存儲系統機密嗎?見http://blog.mozilla.org/webappsec/2011/05/10/sha-512-w-per-user-salts-is-not-enough/。我可以存儲一個數組,每個迭代都會保存一個靜態的祕密,第n個祕密是第n次迭代。沒有人可以知道祕密,他們被計算一次(我猜想是加密一些隨機字符串),然後基本上存儲在服務器的RAM中。

  • 目前我只是將密碼從客戶端發送到服務器,只是SHA-2_512(密碼),這個過程是否應該改進,如果是這樣,怎麼做?我不能使用鹽,因爲客戶沒有可用的鹽。

問候。

回答

5

TLDR:您需要使用加密通道(如TLS)發送密碼。考慮使用bcrypt進行密碼散列。

SHA-2 512不是加密算法,它是一種消息摘要算法。加密算法需要密鑰和消息來加密。它產生密文。重要的是加密算法具有解密算法。

ciphertext = E(key, plaintext); 
plaintext = D(key, ciphertext); 

消息摘要需要一段明文併產生消息摘要。沒有相應的反向機制來獲取消息摘要並檢索原始消息。也沒有祕密鑰匙。

digest = hash(plaintext); 

如果攻擊者能夠訪問與哈希數據庫,攻擊者就可以通過檢索野蠻原始密碼強迫,試圖用大量的散列算法的猜測。

digest1 = hash(guess1); 
digest2 = hash(guess2); //repeat with lots of guesses 

首先,在網絡上發送哈希安全。它需要通過SSL等安全通信機制發送。如果攻擊者可以通過通信攔截散列,他們可能能夠計算出原始密碼。

A hash collision與暴力強制密碼不一樣。當兩個不同的消息產生相同的消息摘要時會引起哈希衝突。

digest1 = hash(plaintext1); 
digest2 = hash(plaintext2); 
if ((plaintext1 != plaintext2) && (digest1 == digest2)) 
    // hash collision 

SHA-512沒有旨在防止暴力行爲的迭代。 SHA算法集被設計爲高效的。散列密碼時添加迭代的原因是增加強制密碼所需的時間。與具有數百萬個密碼的攻擊者相比,這個想法執行合法登錄嘗試並執行100次迭代的代價很小,每個密碼需要100次迭代。增加更多迭代有助於減少處理器速度提高的影響(這將有助於攻擊者更快地嘗試更多迭代)。

您應該將迭代次數設置爲針對每個用戶存儲的可配置限制。因此,您爲每個用戶存儲密碼哈希值,鹽值和迭代次數。這意味着將來您可以增加迭代次數來考慮增加的硬件功耗。

以明文形式發送SHA-2 512不安全。您應該在一個加密的頻道(如SSL)中發送它。儘管如此,SHA-2的設計並不是密碼散列算法。它專爲消息驗證而設計,並且效率很高。考慮使用專門構建的密碼散列算法。一個例子是bcrypt。它被設計爲計算困難,並有內置的鹽和迭代。

+0

我研究了一下,我認爲這是一個重要的注意要補充:BCrypt應該做客戶端授權(和服務器端一次註冊/密碼更改)。所以服務器上的壓力真的很低。如果錯了,請糾正我。有沒有辦法確定一個好的工作因素? – skiwi

+0

@skiwi我不認爲你應該在客戶端執行bcrypt計算。你能分享你的參考嗎?服務器上使用bcrypt的壓力仍然很低,但是攻擊者試圖通過嘗試1000次猜測來強制攻擊的壓力非常大。 – Steve

+0

查看http://stackoverflow.com/questions/4443476/optimal-bcrypt-work-factor確定工作因子。 – Steve