我最近一直在研究如何給Keycloak的登錄頁面加上驗證碼功能,Keycloak的7.0.x目前是沒有登錄驗證碼的。不過可惜的是,到目前為止我也沒成功實現驗證碼功能。但我在這個過程中發現了另外兩個Keycloak自帶的能替代驗證碼的功能。
暴力檢測(Brute Force Detection)
首先我們需要明確,驗證碼(CAPTCHA)到底有什么作用。我從百度百科搜索到的定義如下:
驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認為是人類。
那么我們現在知道了,驗證碼的一個重要功能是防止暴力破解密碼。如果只說防止暴力破解這個功能,Keycloak其實內置了相似的功能。這就是暴力檢測。
配置
配置暴力檢測只需要在realm->安全防護->強力檢測中開啟此功能。
開啟暴力檢測功能后。如遇到暴力檢測,可以臨時鎖定賬號,或永久鎖定賬號(需開啟Permanent Lockout)。
臨時鎖定賬號后,過一段時候后,該賬號會自動解鎖。永久鎖定的賬號,需要登錄keycloak管理控制台手動解鎖。
其他的一些配置我們可以看給出的字段。例如,最大登錄失敗次數指的是,密碼輸錯3次后鎖定賬戶。
OTP驗證
什么是OTP
如果你玩過一款叫做《夢幻西游》的游戲,那你大概知道將軍令這個東西。這個東西是一個安全防護實體工具。目的是為了保護玩家賬號安全。具體使用上就是會給你一個電子表一樣的東西,上面有個按鈕,每次一按就出現一組數字。
在輸入賬號密碼的時候需要額外輸入將軍令上顯示的數字,然后才能登陸。
這種每次登陸都需要輸入,每次的密碼都不一樣的登錄方式就是OTP(One Time Password,也就是一次性口令)
一次性密碼(One Time Password,簡稱OTP),又稱“一次性口令”,是指只能使用一次的密碼。一次性密碼是根據專門算法、每隔60秒生成一個不可預測的隨機數字組合,iKEY一次性密碼已在金融、電信、網游等領域被廣泛應用,有效地保護了用戶的安全。
OTP的大致原理是以時間差做為服務器與密碼產生器的同步條件。在需要登錄的時候,就利用密碼產生器產生動態密碼。生成的密碼在輸入之后即作廢。
以前的手機普及力度不夠,所以需要單獨購買硬件載體來顯示密碼。現在手機幾乎人手一部,因此現在使用手機App作為OTP密碼的載體。我們下面看看Keycloak中是如何使用OTP來驗證登錄的。
如何使用FreeOTP
開啟OTP需要在Keycloak的驗證中在瀏覽器登陸流中把OTP Form設置為REQUIRED
。
然后我們從手機上下載一個FreeOTP App,打開App之后掃描上面的二維碼或者輸入App上顯示的六位數字就可以登陸了。
你也可以在驗證菜單的OTP策略中設置OTP的一些參數
參考文章
iOS Developer的全棧之路 - Keycloak(9) - 簡書
OTP原理及實現 - OSCHINA
一次性密碼 - 百度百科