我最近一直在研究如何给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
一次性密码 - 百度百科