2014-03-06 24 views
1

我不理解存儲/處理密碼的一些概念。公共API的密碼處理?

例如,我們的網站使用提供的身份驗證爲移動應用程序(iOS,Android等)提供公共api。不要懷疑,我們不能在數據庫中存儲原始密碼,也不能在客戶端和服務器之間發送原始密碼,所以我們使用哈希和鹽。

這樣,我們加密客戶端上的密碼併發送哈希到服務器。但是,如果一個「黑帽子」竊取密碼哈希並通過它對服務器API進行身份驗證呢?

我應該在客戶端哈希密碼,發送散列,然後再次哈希他們在服務器上?

這個問題的常見解決方案是什麼?

非常感謝提前。

+1

你* *也可以散列在客戶端,但你必須*總是散列在服務器端。 –

+1

這個問題更適合於http://security.stackexchange.com/ – Samuel

回答

1

您可以使用SSL來保護客戶端和服務器之間的通信通道,併發送未加密的密碼。第二種方法 - 在服務器中存儲哈希密碼(無鹽),並進行身份驗證時 - 從服務器獲取隨機令牌(將在幾分鐘後過期),根據客戶端密碼計算哈希值並使用計算後的哈希對接收到的令牌進行編碼。然後發送編碼的令牌給服務器。服務器執行相同的操作,但使用存儲在數據庫中的散列,而不是從密碼計算它這種方法有缺點 - 需要存儲原始密碼或無鹽密碼。或者用令牌將鹽發送給客戶。

但是,如果一個「黑帽」竊取密碼哈希和驗證與它的服務器API呢?

此問題通過使用將在使用後過期的令牌解決。

1

做一個輕量級哈希客戶端(無鹽),然後重新哈希(與獨特的鹽)服務器端。存儲鹽和(雙重)哈希密碼。

服務器端散列還應該使用類似pbkdf2scrypt的東西,它可以執行數以千計的散列迭代來故意減慢散列過程。這有助於通過減緩攻擊過程來防止哈希的強力攻擊。