2011-12-02 166 views
2

我正在使用Java/JSP製作一個小型社交網站。我想要密碼加密,然後存儲在數據庫中。我想知道現在是否需要使用JavaScript(sha1,md5,..)加密密碼客戶端,然後將其發送到服務器,或者它足夠安全,可以忽略客戶端並僅在服務器端加密密碼。Java中的客戶端和服務器端密碼加密

+1

如果啓用'HTTPS',則不需要在客戶端加密密碼。 – srkavin

回答

1

做到這一點的最好辦法是使用:

  1. SSL
  2. 客戶端和服務器端加密。

選項1通常是足夠的,但它仍然可以被嗅探,因此可以發送散列/加密版本。這個發送的版本不應該是你在數據庫中存儲的,它應該有一些其他的熵。

+0

是不是SSL的全部重點,如果有人嗅探它,他們得到加密的文本?... – corsiKa

+0

@ glowcoder它可以欺騙,以便您使用他們可以解密的僞造證書(與mitm攻擊) – jli

+0

@jl if你有一個mitm攻擊,那麼它發送並不重要 - 即使你在你身邊加密它,他們將能夠解密你發送給他們的任何東西...... – corsiKa

2

您需要通過TLS(SSL)在客戶端和服務器之間傳輸密碼。然後,使用成本因子爲16或更高的bcrypt(或PBKDF2具有64k次迭代或更多)來在服務器上散列密碼。

2

如果您不使用SSL,那麼在使用Javascript進行客戶端加密或散列操作時會存在安全漏洞,因爲中間的攻擊者中的一個人可能會在將頁面傳遞給用戶之前刪除客戶端散列代碼。

如果您確實使用SSL,那麼通過實施額外的客戶端安全性幾乎沒有什麼收穫。唯一的好處是攻擊者可以危及加密而不是流的完整性(因此他們只能嗅探數據)。這似乎不太可能,但這是可能的。

爲防止出現這種情況,額外的安全措施要求您首先對密碼進行哈希以匹配服務器如何對其進行哈希處理(包括salt),然後使用提供隨機生成的令牌的服務器對其進行哈希處理(服務器也會記住在會議中)。這確保了某人嗅探連接無法獲取密碼(假設流的完整性未受損),並確保散列版本不能用於重播攻擊(隨機服務器令牌阻止重用)。如果你只在自己的客戶端哈希密碼,那麼沒有什麼可以阻止攻擊者僅僅使用該哈希值來登錄自己。請記住,這是SSL的補充,而不是它的位置。

無論密碼如何傳輸,您應該只在數據庫中存儲密碼的哈希散列版本。理想情況下,使用每個用戶salt(您也要存儲)以及一個安全散列函數(例如SHA-2,而不是SHA-1或MD5)。