簡體   English   中英

Java中的客戶端和服務器端密碼加密

[英]Client and Server side password encryption in Java

我正在使用Java / JSP創建一個小型社交網站。 我想先加密密碼,然后將其存儲在數據庫中。 我想知道當今是否需要使用javascript(sha1,md5,..)加密客戶端密碼,然后將其發送到服務器,還是可以忽略客戶端而僅在服務器端加密密碼就足夠安全了。

您需要通過TLS(SSL)在客戶端和服務器之間傳輸密碼。 然后,使用成本系數為16或更高的bcrypt (或具有64k迭代或更高的PBKDF2)在服務器上哈希密碼。

如果您不使用SSL,則在使用Javascript進行客戶端加密或哈希運算時會存在安全漏洞,因為中級攻擊者可以在將頁面傳遞給用戶之前刪除客戶端哈希碼。

如果您確實使用SSL,那么實現額外的客戶端安全性將無濟於事。 唯一有益的情況是,攻擊者可以破壞加密,但不能破壞流的完整性(因此,他們只能嗅探數據)。 這似乎不太可能,但是有可能。

防止這種情況的額外安全性要求您首先對密碼進行哈希處理,以匹配服務器對其進行哈希處理的方式(因此包括鹽),然后使用服務器提供的隨機生成的令牌對密碼進行哈希處理(服務器還記得會話中的密碼) 。 這樣可以確保無法通過嗅探連接的人獲得密碼(前提是不損害流的完整性),並確保不能在重放攻擊中使用哈希版本(隨機服務器令牌會阻止其重用)。 如果僅由客戶端自己對密碼進行哈希處理,則沒有什么可以阻止攻擊者僅使用該哈希值來登錄自己。 請記住,這是對SSL的補充,而不是代替SSL。

無論密碼如何傳輸,都應僅在數據庫中存儲密碼的鹽化哈希版本。 理想情況下,使用每用戶鹽(也要存儲)和安全哈希函數(例如SHA-2而不是SHA-1或MD5)。

最好的方法是使用:

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

選項1通常就足夠了,但是它仍然可以被監聽,因此發送散列/加密版本會很有用。 但是,此發送的版本不應該是您存儲在數據庫中的版本,它應該具有某種其他的熵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM