天天看點

MongoDB中使用的SCRAM-SHA1認證機制

scram是密碼學中的一種認證機制,全稱salted challenge response authentication mechanism。

scram适用于使用基于『使用者名:密碼』這種簡單認證模型的連接配接協定。

scram是一個抽象的機制,在其設計中需要用到一個哈希函數,這個哈希函數是用戶端和服務端協商好的,包含在具體的機制名稱中。比如scram-sha1,使用sha1作為其哈希函數。

基于『使用者名:密碼』這種簡單認證模型的協定中,用戶端和服務端都知道一個使用者名(username)對應一個密碼(password)。在不對信道進行加密的前提下,無論是直接使用明文傳輸『username:password』,還是給password加個哈希的方法都low爆了,很容易被黑客攻擊。一個安全性高的認證機制起碼應該是具備雙向認證的,即:

服務端需要驗證連接配接上來的用戶端知道對應的password

用戶端需要知道這個聲稱是服務端的人是真正的服務端

我們來看看scram是怎麼做的。

服務端使用一個salt和一個iteration-count,對password進行加鹽哈希(使用h表示哈希函數,這裡就是sha1,iteration-count就是哈希疊代次數),得到一個password[s]:

服務端拿這個password[s]分别和字元串『client key』和『server key』進行計算hmac摘要,得到一個key[c]和一個key[s]:

服務端儲存username、h(key[c])、key[s]、salt和iteration-count,沒有儲存真正的password

用戶端發送client-first-message給服務端,包含username和client-nonce,其中client-nonce是用戶端随機生成的字元串

服務端傳回用戶端server-first-message,包含salt,iteration-count和client-nonce|server-nonce,其中server-nonce是服務端随機生成的字元串

用戶端發送client-final-message給服務端,包含client-nonce|server-nonce和一個proof[c]。這個proof[c]就是用戶端的身份證明。首先構造出這次認證的變量auth如下:

服務端使用其儲存的h(key[c])和auth計算hmac摘要,再和proof[c]進行異或,得出key[c],再對這個key[c]進行哈希,和其儲存的h(key[c])進行比較是否一緻。如果一緻,則用戶端的認證通過,服務端接下來會構造一個proof[s]用來向用戶端證明自己是服務端:

用戶端使用password[s]得到key[s],然後使用相同算法計算key[s]和auth的hmac摘要,驗證服務端發送過來的proof[s]是否和計算出來的一緻,進而認證服務端的身份。

q:proof[c]為什麼不能是和proof[s]一樣使用hmac(key[c], auth)算得?

a:服務端沒有儲存key[c],而是儲存h(key[c]),這是因為如果服務端的key[c]洩露,那麼黑客可以輕易構造出proof[c],進而僞裝成用戶端了。

q:那麼直接使用hmac(h(key[c]), auth)呢?

a:同樣,如果服務端的h(key[c])洩露,黑客又可以輕易構造出proof[c],進而僞裝成用戶端了。是以必須要加上key[c]的異或,進而證明用戶端知道key[c]的值。

q:但是如果服務端的h(key[c])洩露,再通過網絡洩露了proof[c]和auth,就可以根據proof[c]和hmac(h(key[c]), auth)異或得到key[c]了?

a:是的,是以如果要求更高的安全性,還是推薦使用信道加密。

q:nonce的作用?

a:client-nonce和server-nonce都是随機生成的字元串,這主要是為了每次認證都有個不同的auth變量,以防止被重播攻擊。

分析下以下幾種情況下scram的安全性:

網絡流量被監聽:

如果某次認證的網絡流量被監聽,黑客可以拿到salt、iteration-count和auth,但是無法僞裝成服務端,因為沒有key[s],無法生成proof[s],完成不了最後一次認證。

服務端被脫褲:如果服務端被脫褲,黑客可以拿到username、h(key[c])、key[s]、salt和iteration-count,但是生成不了key[c],是以無法生成proof[c],不能僞裝成用戶端。

如果很不幸的網絡流量被監聽,服務端又被脫褲,那麼對不起,被爆菊了,要應對這種情況,隻能使用信道加密了。

improved password-based authentication in mongodb 3.0: scram explained - pt. 1

improved password-based authentication in mongodb 3.0: scram explained (part 2)

維基百科:salted challenge response authentication mechanism

阿裡雲mongodb雲服務

繼續閱讀