2015-10-24 129 views
1

我正在創建一個移動REST API。我需要加密祕密訪問密鑰嗎?

當前,當用戶使用電子郵件和密碼登錄時,我生成密鑰會話密鑰(64個字符長),將其存儲在數據庫中併發送給用戶,以便用戶無需再次登錄以便將來請求,直到他們註銷。

對於下一個請求,我只是檢查提供的會話密鑰是否與數據庫中的密鑰相同。

但是,我在這個方案中看到了一個很大的安全漏洞。如果攻擊者能夠訪問數據庫,他們可以使用密鑰並冒充任何人而不知道密碼。除了掩蓋用戶的真實密碼之外,在這種情況下加密密碼有什麼意義 - 它不會阻止其他任何事情。

所以,我的問題是你如何正確存儲這些訪問密鑰?

Twitter將在其API上登錄時發送會話密鑰。那麼,他們如何存儲這些密鑰?

謝謝。

回答

0

它甚至更好散列會話密鑰,就好像它是一個密碼,並將散列值存儲在數據庫中。

password hashing唯一的區別在於,由於您的會話密鑰(我希望至少)是由secure random number generator生成的並且時間足夠長以至於無法通過蠻力推測(我推薦至少128位隨機性),所以,你:

  • 不需要單獨的鹽,和
  • 可以用一個簡單的cryptographic hash function像SHA-256,而不是像PBKDF2故意緩慢的密碼散列方案。

不使用salt也允許您使用(散列)會話密鑰在數據庫中查找會話記錄,因此您不需要單獨的會話ID。

所以,總結一下:

  1. 當開始一個新的會話,使用安全RNG產生會話密鑰,存儲在數據庫中的會話密鑰的SHA-256散列,併發送(非哈希)會話密鑰給客戶端。

  2. 當客戶端發出請求時,使用SHA-256散列客戶端發送的會話密鑰,並在數據庫中查找相應的記錄。

您也可能希望限制會話密鑰的生命週期,並提供一些機制,爲客戶明確地無效所有的用戶會話,以減輕個人會話密鑰的一個折中的效果。

+0

但是這個方案不允許從多個設備登錄到同一個帳戶,除非我有一對多關係數據庫表的會話密鑰。因爲在第二次登錄時,我們不會再知道(非哈希)會話密鑰。是對的嗎? – moeseth

+0

@moeseth:對,您無法以這種方式在多個客戶端設備之間共享相同的會話密鑰。通常,人們會將這些視爲單獨的*會話*屬於相同的*用戶*。 –

相關問題