什么是混淆字体验证码
混淆字体验证码,又叫做CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),字面意思是“完全自动化的区分计算机和人类的公开图灵测试”。它是一种设计精巧的安全防护机制,穿越在用户与服务之间,阻挡各种自动化的恶意攻击与批量注册等行为。
混淆字体验证码会生成一组混淆的字符集,并以图像的形式呈现给,比如我们在各种服务网站上常见的一种验证码形式:形如扭曲的、几何图形重叠的、包含线条与噪点干扰的一组字符。
这种技术的基本出发点是利用人类视觉识别在复杂环境下的优势——即,人眼可以通过复杂的混淆环境识别出主要字符,而机器的OCR技术在这方面可能表现得并不足够强大。因此,混淆字体验证码可以有效的避免恶意的自动化程序,只允许真实用户通过验证得到服务。
混淆字体验证码的设计可以非常灵活和富有创造性。为了提高验证码的安全等级,验证码背景的色彩空间、字符的形状、大小、颜色、布局甚至投影、倾斜角度等都可以成为设计的元素。同时,也会在别的方面判断用户的输入,比如输入时间的长短、输入错误的次数等等。
混淆字体验证码的运行机制
混淆字体验证码的运行机制主要包含四个环节:验证码生成、验证码渲染、验证码展示和验证码验证。
验证码生成。 这是验证码运行机制的第一步,系统会生成一串随机的字符串或数字。这串字符的长度和组合方式都可能因应用场景的安全需求而有所不同。有的系统为了增加验证码的复杂程度,可能还会在生成的验证码中混入大小写字母。
验证码渲染。 生成的随机字符串会被渲染到一个图片上。这一步通常采用特殊的字体,并且应用各种图形特效,比如扭曲、切割、旋转等,甚至有的还会在背景中加入不同的干扰元素,如线条、点状、图形等,以增加其被机器识别的难度。
验证码展示。 渲染好的验证码将会被展示给用户。用户需要根据展示出的图像,输入对应的字符。
验证码验证。 用户输入的字符将会被系统接收并进行验证。只有当用户输入的字符与系统在第一步生成的字符相同时,验证码才算验证通过。如果用户输入错误,或者超过了规定的输入时间限制,那么验证码就会验证失败。
在整个流程中,混淆字体验证码利用了复杂的视觉处理能力和模式识别能力,这些都是目前大多数OCR技术难以模仿的。因此,混淆字体验证码可以有效的阻止恶意软件和机器人的自动操作,提高网站的安全性。
技术实现:在Springboot 3.x中如何生成混淆字体验证码
com.github.axet 的 kaptcha 是一个方便且强大的验证码工具包,可以帮助我们在 Springboot 中生成各种复杂的验证码。以下是一段具体的代码示例,这段代码将指导你如何使用 kaptcha 生成混淆字体的验证码。
请在 pom.xml 中添加相关依赖:
com.github.axet
kaptcha
0.0.9
创建验证码生成配置:
@Configuration
public class KaptchaConfig {
@Bean
public Producer kaptchaProducer(){
Properties properties = new Properties();
properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); // 使用何种字体进行图片的验证码
properties.put("kaptcha.textproducer.char.string", "0123456789QAZXSWEDCVFRTGBNHYUJMKLIOPasdfghjklzxcvbnmqwertyuiop"); // 图片验证码中包含的字符
properties.put("kaptcha.textproducer.char.length", "4"); // 图片验证码的字符数量
properties.put("kaptcha.textproducer.font.size", "28"); // 图片验证码的字符大小
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
创建验证码接口:
@RestController
public class KaptchaController {
@Autowired
private Producer kaptchaProducer;
@GetMapping("/getKaptcha")
public void getKaptcha(HttpServletResponse response) throws IOException {
// 生成验证码并设置到 session 中
String text = kaptchaProducer.createText();
HttpSession session = request.getSession();
// 这里把真实验证码存储到 session 中,以备后续验证使用
session.setAttribute("kaptcha", text);
try(InputStream in = new ByteArrayInputStream(kaptchaProducer.createImage(text))){
IOUtils.copy(in,response.getOutputStream());
}
}
@PostMapping("/verifyKaptcha")
public ResponseEntity verifyKaptcha(HttpServletRequest request, String userInputCaptcha) {
HttpSession session = request.getSession();
String kaptcha = (String) session.getAttribute("kaptcha");
session.removeAttribute("kaptcha"); //移除session中的验证码,保证验证码只能被校验一次
if (kaptcha != null && kaptcha.equals(userInputCaptcha)) {
return new ResponseEntity<>("验证码正确", HttpStatus.OK);
} else {
return new ResponseEntity<>("验证码错误", HttpStatus.BAD_REQUEST);
}
}
}
在以上代码中,首先创建了一个 kaptchaProducer bean 用于生成验证码。然后创建了一个控制器方法 /getKaptcha,当用户访问这个 URL 时生成验证码并返回给用户。
在这个方法 verifyKaptcha 中,我们首先从用户的会话中获取之前创建的验证码,然后与用户提供的验证码进行比较。如果两者相符,那么我们返回一个“验证码正确”的响应;如果它们不匹配或者会话中没有验证码,那么我们返回一个“验证码错误”的错误消息。
实战应用:混淆字体验证码的应用示例
混淆字体验证码通常应用在防止恶意的机器人行为或者自动化的网络攻击中,例如在登陆、注册、提交敏感信息等场景下。以下为你提供一些实战应用示例。
1. 登录页面
在很多的登录页面,我们会看到一个需要用户解读并输入的图像验证码。这个图像验证码通常会尽量的设计为机器难以识别,但人类可以快速解读的样子。例如,我们可以设置一组随机字符,通过动态改变字符间的距离,字符大小、字符方向,或者在字符上添加随机噪点、线条等方式,增加机器人的识别难度。这样,即使有人试图用恶意的程序来进行对抗,他也会因为解析这个验证码的困难而无法继续。
2. 注册页面
在用户提交注册信息时,我们也会设计一个复杂的验证码验证机制,增加恶意注册的成本。比如,我们可以采用多种字体和颜色进行混淆,并引入复杂的背景图像作为噪音,这需要用户更细致的注意力来解读,对机器而言,几乎无法识别。
3. 敏感操作
在进行些敏感操作时,例如重要信息的修改、删除等,我们也会用到验证码。同时,验证码系统还需要有一个过期机制,超过一定时间没有输入验证码的,验证码自动失效,用户需重新获取。
所有这些都强调了一个核心思想,就是确保只有实际的用户才能进行一些特定的操作,而不是由机器自动完成。
本文为大家深入介绍了如何在 Springboot 3.x 中使用 com.github.axet 的 kaptcha 包生成混淆字体验证码,并验证用户输入的验证码。在实现过程中,我们首先在 pom.xml 中添加了 kaptcha 的依赖,然后创建了验证码生成的配置和接口。最后,我们在 KaptchaController类中实现了验证码的验证方法。实战应用部分,我们探讨了混淆字体验证码在登录、注册和敏感操作等场景的应用。总的来说,混淆字体验证码是一个非常有效的工具,以保护我们的应用免受自动化网络攻击。