验证码攻防对抗的本质
短信验证码和图片验证码的区别就不用说了,大家都知道。
在回答前面的问题前,我们需要知道对抗的本质:
黑灰产如果想破解图片验证码(后面说的“验证码”,都指的是“图片验证码”),首先第一步,要完成“识别”这个能力,也就是,它需要有能力知道这张图片上的答案目标在哪里。在这块,我们说的“识别对抗”的本质就是我们对抗黑灰产的工具。 实际上,真正的从技术底层上来说,验证码对抗的是黑灰产的人工智能,对抗的是卷积神经网络技术。在我们知道这个本质之后,我们的验证码从哪些点去做更新、做迭代,才能有效地去对抗它。
如果要防范黑灰产,那么网站需要在感知层面进行加强,而感知层面,只有图片验证码才能实现,因为感知层面包括五个维度:
行为数据:验证过程中产生的键盘/鼠标/触屏等行为数据
终端风险:异常设备环境,模拟器、自动化工具,无头浏览器等
数据统计:各种验证方式的通过率,失败率,调用量
安全策略:检测攻击行为的安全策略,并能根据风险情况对验证码做出调整
预警指标:各维度的指标计算,监视每种验证方式的攻防情况
而这五个维度如何体现在验证码上呢? 这个就是图片验证码的“变” :
图片验证码的“变”
1.动态变更前端加密算法
在安全通信模块,黑灰产在破解验证码的时候,其可能会首要去考虑逆向网站的JS 、知道通信协议以及参数获取,这是攻防对抗比较重要的一环。
解决方案的话,可以在防御云放置一个安全加密中心,而安全加密中心会定期地、自动化地生成新的加密算法,把代码重新混淆一遍,然后定期推送到CDN上面。CDN上面放置的是验证码以及验证的JS文件,而这,主要是由客户端来加载。在这种动态更新的机制之下,即使黑灰产获取到某个版本的验证码JS文件,并做了逆向破解之后,会在下一个更新窗口到来之后失效。如果黑灰产想实现完全的脱机运行,就需要持续地去更新,去破解这些JS。这对于黑灰产来说,成本极高。
2.图片变更
图片的变更如何结合AIGC的能力,变化万千
3.字体及效果的变更
除上述之外,就是验证元素的管理。验证码拥有持续变更的能力,可以动态的去更新这些基础元素。这里的“基础元素”,主要是字体的效果和字体的变化。
4.其他效果的变更
包括图标元素的变更、验证方式动态安装卸载、验证码方式和组合的实时变化等等
综上来说,尽管短信验证码提供了一定的安全性,但图片验证码可以进一步防止恶意程序或机器人的攻击。
图片验证码通常要求用户正确地识别和输入一个难以辨认的图像中的文字或数字。这样的图像对于机器学习算法和自动化脚本来说比较困难,因此可以有效地区分人类用户和自动化程序。
示例代码
import requests
# 配置顶象的密钥和验证码ID
DOOV_API_KEY = 'your_doov_api_key'
CAPTCHA_ID = 'your_captcha_id'
# 请求验证码
def get_captcha():
url = 'https://doovos.dooioo.com/captcha/preCaptcha'
payload = {
'captchaId': CAPTCHA_ID
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(DOOV_API_KEY)
}
response = requests.post(url, json=payload, headers=headers)
result = response.json()
return result['captchaImage']
# 验证用户输入的验证码
def verify_captcha(captcha_token, captcha_text):
url = 'https://doovos.dooioo.com/captcha/verifyCaptcha'
payload = {
'captchaId': CAPTCHA_ID,
'captchaToken': captcha_token,
'captchaText': captcha_text
}
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {}'.format(DOOV_API_KEY)
}
response = requests.post(url, json=payload, headers=headers)
result = response.json()
return result['success']
# 获取验证码图片并显示给用户
captcha_image = get_captcha()
print('验证码图片链接:', captcha_image)
# 假设用户在表单中输入了验证码文本和验证码令牌
user_captcha_text = input('请输入验证码文本: ')
user_captcha_token = input('请输入验证码令牌: ')
# 验证用户输入的验证码
verification_result = verify_captcha(user_captcha_token, user_captcha_text)
if verification_result:
print('验证码验证成功')
else:
print('验证码验证失败')
根据不同的编程语言当然会有不同的实现方式,上面是python的示例。不过上面使用的是顶象的验证码库,使用之前,需要先注册顶象的服务并获取相应的API密钥和验证码ID。将示例代码中的"your_doov_api_key"和"your_captcha_id"替换为你自己的值。
以上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。