安全系列之一:忘記密碼

在不少Web網站中,有一項功能是忘記密碼,不一樣網站對忘記密碼的策略有本身的一套方案。可是目前卻缺乏一個工業標準實現一個忘記密碼功能,致使的問題就是有可能在某些流程中出現漏洞,被hacker盜取帳號。php

OWASP做爲Web安全公認的組織,在這裏提出了本身的標準。下面是它的幾個步驟。最後會用支付寶做爲例子分析一遍。git

博客園的排版不是很好,一樣的文章在個人github上查看,排版比較好:github

http://blog.bensonlin.me/blogs/forgot-password-cheat-sheet數據庫

轉載需加上該地址安全

 若是寫得不錯,別忘了關注我哦session

Step 1) Gather Identity Data or Security Questions

第一步:收集用戶身份數據或者安全問題ide

第1步通常讓用戶填寫之前本身填寫過的數據(通常是在用戶註冊的時候填寫的),也就是查詢數據庫中是否是有這個帳號的信息,網站

這一步收集的信息裏,至少要包含能夠用來發送重置密碼消息的第三方信息,這些信息能夠是郵箱地址或者手機號等等,第3步時要用到。ui

Step 2) Verify Security Questions

第二步:校驗安全問題blog

第1步的信息提交後,應用校驗每個數據,若是有錯誤,或者用戶名(username, 應該是用戶的某個標識)沒有被識別,第二頁能夠展現錯誤的信息。若是是正確的,第二頁應該展現至少兩個用戶以前提交的兩個安全問題,讓用戶在輸入框中輸入,輸入框應當是一個HTML表單的一部分。

注意,不可以提供下拉列表讓用戶選擇本身想回答的問題,這裏我不是很懂,可能想表達的意思是:若是有多個問題,不能讓用戶只選擇一個回答,這樣防護能力會變弱,影響安全性。

當表單提交的時候,應避免發送用戶名做爲參數(不論是不是hidden域),用戶名應該儲存在服務端的session中,在獲取的時候應該從session中獲取,而不是提交表單的形式獲取。(若是不作到這樣,hacker能夠創建另外一個帳號,經過輸入本身的標識和本身的問題和答案繞過這一步)

由於用戶填寫的那些安全問題通常比細心選擇的密碼更加的不安全(如典型的問題有 你最喜歡什麼運動,你出生在哪一個城市等等),所以,應該限制猜想的次數,這個閾值能夠控制在3到5次之間,當仍是錯誤時,要鎖定用戶的帳戶必定的時間(好比5分鐘),以免hacker猜想問題,重置了用戶的密碼,

而後經過質疑令牌(challenge token)質疑用戶身份,進入下一步的多因素認證流程

由於有可能認爲用戶的我的信息已經泄露,所以發送的令牌token不能包含一些我的信息如手機號碼或者email等

Step 3) Send a Token Over a Side-Channel

第三步:發送質疑令牌到第三方渠道

第2步以後,應當當即鎖定用戶的帳戶,而後採用8位或以上的隨機數做爲token發送到第1步填寫的我的信息中(好比郵箱或手機上);

在這裏引入了另外一個外部渠道,增長了防護的深度,令黑客更加難經過驗證。這樣若是有黑客成功經過了第一二步,他也可能會在這一步被攔住。

同時,這個隨機數應當只有必定的生命週期,也就是必定的存活時間,如不超過20分鐘左右。若是用戶沒有及時的查看郵箱,那麼這個郵箱將不能再被使用。若是沒被用戶用來重置密碼,token也不能再被使用(如收到驗證碼後不理它);固然,在成功重置完密碼後token不能再使用,應當銷燬。

Step 4) Allow user to change password in the existing session

第四步:要求(require)在現有會話(即第二步填寫的安全問題時所在會話)中輸入第三步發送的token,若是不及時輸入,將不能成功;

能夠經過展示一個HTML表單,裏面包含3個輸入域,一個token輸入框,一個新密碼輸入框和一個確認密碼輸入框;

校驗時,應確保令牌是正確的,而密碼是足夠複雜的。一樣的,應當避免用戶名做爲表單參數被提交。

最後,檢查用戶是否是繞過了前面的步驟進入這一步的,也就是驗證是不是從合法的頁面來的,不然有可能引入強制瀏覽攻擊(forced browsing attack)

實例

支付寶的忘記密碼功能是很規範的,能夠參考它的忘記密碼流程

第1步:標識憑據

使用手機號或用戶名做爲標識 裏面須要添加了驗證碼,是爲了有人防止惡意嘗試電子郵箱或手機號,進入第2步。

第2步:填寫安全問題

能夠看到有 驗證短信+驗證身份證件 和 驗證短息+回答安全保護問題,固然經過人工服務就沒什麼說了,只要是本身帳號,基本上人工是能夠解決的,如今看看第二種方式,即驗證短信+回答安全保護問題

能夠看到須要先發送驗證嗎,驗證身份信息,其實都是爲了防止,這裏就是第三步的內容 短信中提示30分鐘內輸入,而安全保護問題也是問個人出生地,多是我以前填寫的,我本身也忘了,而後修改了原來的問題,修改爲3個問題,用來驗證它是否是隨機選擇問題,後來發現竟然你問多少個問題就要回答多少個問題,挺安全的 TAT。

其中的驗證碼是第3步的質疑令牌

題外話:從重置密碼中能夠看到可使用身份證重置,我點進去看了一下,就我而言,不是很認同這種重置方式,雖然有經過收手機驗證碼方式,可是身份證號泄露仍是不難的,也就是隻有手機這個方面可以有效防護,換句話說,就是給入侵者減小了一道防護,不過就方便而言確實方便不少,固然,安全和方便老是矛盾的。 

第3步:發送質疑令牌

由於第1步填了手機號,因此第3步支付寶將驗證碼發到了手機上

手機信息以下: 【支付寶】您正在修改登陸密碼,校驗碼257***,請於30分鐘內輸入,工做人員不會向您索取,請勿泄露。

驗證碼長度爲6位,有效期爲30分鐘,這個是網站本身定義的。

第4步:修改密碼

須要在當前會話中完成,由於有事中途走開了,而後我刷新步驟3的頁面,發現這樣子了

接着我重複前面的步驟,回到了填寫安全保護問題的步驟,填寫了正確的安全保護問題後,進入了重置密碼階段

輸入新的密碼肯定就能夠了,固然修改密碼後token確定就銷燬了 

題外話:當我輸入的密碼和以前的相同時,提示我」新登陸密碼必須和當前登陸密碼不一樣」,在一次保證了安全,有意思,你們能夠試一下

小結

結合OWASP推出的忘記密碼方案和支付寶的實例,咱們能夠發現其實不少網站對忘記密碼的處理都不是很恰當。也警示咱們寫程序應該遵循必定的步驟走,不該該擅自的修改步驟,不然極可能會出現問題

有什麼問題歡迎指出

相關文章
相關標籤/搜索