http認證(三) nonce與timestamp

2021-08-22 11:44:35 字數 898 閱讀 1600

nonce是由伺服器生成的乙個隨機數,在客戶端第一次請求頁面時將其發回客戶端;客戶端拿到這個nonce,將其與使用者密碼串聯在一起並進行非可逆加密(md5、sha1等等),然後將這個加密後的字串和使用者名稱、nonce、加密演算法名稱一起發回伺服器;伺服器使用接收到的使用者名稱到資料庫搜尋密碼,然後跟客戶端使用同樣的演算法對其進行加密,接著將其與客戶端提交上來的加密字串進行比較,如果兩個字串一致就表示使用者身份有效。這樣就解決了使用者密碼明文被竊取的問題,攻擊者就算知道了演算法名和nonce也無法解密出密碼。

每個nonce只能供乙個使用者使用一次,這樣就可以防止攻擊者使用重放攻擊,因為該http報文已經無效。可選的實現方式是把每一次請求的nonce儲存到資料庫,客戶端再一次提交請求時將請求頭中得nonce與資料庫中得資料作比較,如果已存在該nonce,則證明該請求有可能是惡意的。

然而這種解決方案也有個問題,很有可能在兩次正常的資源請求中,產生的隨機數是一樣的,這樣就造成正常的請求也被當成了攻擊,隨著資料庫中儲存的隨機數不斷增多,這個問題就會變得很明顯。所以,還需要加上另外乙個引數timestamp(時間戳)。

timestamp是根據伺服器當前時間生成的乙個字串,與nonce放在一起,可以表示伺服器在某個時間點生成的隨機數。這樣就算生成的隨機數相同,但因為它們生成的時間點不一樣,所以也算有效的隨機數。

問題又來了,隨著使用者訪問的增加,資料庫中儲存的nonce/timestamp/username資料量會變得非常大。對於這個問題,可選的解決方案是對資料設定乙個「過期時間」,比如說在資料庫中儲存超過一天的資料將會被清除。如果是這樣的,攻擊者可以等待一天後,再將攔截到的http報文提交到伺服器,這時候因為nonce/timestamp/username資料已被伺服器清除,請求將會被認為是有效的。要解決這個問題,就需要給時間戳設定乙個超時時間,比如說將時間戳與伺服器當前時間比較,如果相差一天則認為該時間戳是無效的。

http 基本認證與摘要認證

基本認證 a 客戶端 查詢 b 伺服器 質詢 c 客戶端 響應 authorization basic ynjpyw4tdg90dhk6t3ch d 伺服器 成功,返回資訊 http 1.1 200 ok基本認證的缺陷在於 賬號和密碼是明文傳送,不安全.摘要認證 a 客戶端 查詢 b 伺服器 質詢 ...

HTTP協議學習 (三)摘要認證

這個認證可以看做是基本認證的增強版本,使用隨機數 密碼進行md5,防止通過直接的分析密碼md5防止破解.摘要訪問認證最初由 rfc 2069 http的乙個擴充套件 摘要訪問認證 中被定義加密步驟 後來發現,就算這樣還是不安全 md5 可以用彩虹表進行攻擊 所以在rfc 2617入了一系列安全增強的...

基於HTTP 協議認證介紹與實現

一直對http 的頭認證有興趣,就是路由器的那種彈出對話方塊輸入賬號密碼怎麼實現一直不明白,最近,翻了一下http 協議,發現這是乙個rfc 2617的實現,所以寫篇文章介紹一下吧.這是乙個用於web瀏覽器或其他客戶端在請求時提供使用者名稱和密碼的登入認證,要實現這個認證很簡單 我們先來看下協議裡面...