白嫖!开源Java图片验证码框架加固业务安全

01 引言

在互联网应用快速发展的今天,图片验证码作为区分人类用户与自动化程序的核心安全机制,被广泛应用于登录、注册等高敏感场景。

基于Java的图片验证码功能通过动态生成包含随机字符的干扰图像,可有效防御恶意爬虫、暴力破解等自动化攻击。其实现通常结合图像处理技术与随机算法,通过扭曲变形、噪点干扰及复杂背景设计提升破解难度。然而,验证码设计需兼顾安全性与用户体验,避免过度复杂化导致用户识别困难。

本文将介绍一种最简单的开源的图形验证框架,欢迎白嫖。

02 Kaptcha

Kaptcha 是大厂Google 出品,被广大程序员喜爱。

2.1 依赖引入

xml 复制代码
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

2.2 配置验证码工具类

java 复制代码
public class KaptchaUtil {

    private KaptchaUtil () {}

    private static final DefaultKaptcha defaultKaptcha = new DefaultKaptcha();

    static {
        Properties properties = new Properties();
        // 设置验证码的长度
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // 验证码图片宽度
		properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "120");
		// 验证码图片高度
		properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "50");
        
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
    }

    public static DefaultKaptcha getInstance() {
        return defaultKaptcha;
    }
}

这里必须要配置Config,可以使用默认的配置,直接传入空的Properties对象即可。

2.3 图片验证码高级配置

默认的配置已经可以满足我们对验证码的要求。如果默认的验证码不满足我们的要求,我们还可以自定义配置,通过Properties来处理。

可以配置的属性:com.google.code.kaptcha.Constants

配置名 配置作用 默认值
kaptcha.border 是否有边框 yes
kaptcha.border.color 边框颜色 black
kaptcha.border.thickness 边框粗细 1
kaptcha.image.width 图片宽度 200
kaptcha.image.height 图片高度 50
kaptcha.producer.impl 图片实现类 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本实现类 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,验证码值从此集合中获取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.textproducer.font.names 字体 Arial, Courier
kaptcha.textproducer.font.size 字体大小 40px
kaptcha.textproducer.font.color 字体颜色 black
kaptcha.textproducer.char.space 文字间隔 2
kaptcha.noise.impl 干扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干扰颜色 black
kaptcha.obscurificator.impl 图片样式 com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景颜色渐变,开始颜色 light grey
kaptcha.background.clear.to 背景颜色渐变,结束颜色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key 存储在session中的key KAPTCHA_SESSION_KEY
kaptcha.session.date 存储在session中的日期 KAPTCHA_SESSION_DATE
kaptcha.noise.impl 噪点实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 噪点颜色 black
kaptcha.obscurificator.impl 图片样式 com.google.code.kaptcha.impl.WaterRipple
kaptcha.producer.impl 图片生成器 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本生成器 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景渐变开始颜色 light grey
kaptcha.background.clear.to 背景渐变结束颜色 white
kaptcha.image.width 图片宽度 200
kaptcha.image.height 图片高度 50
kaptcha.gibberish.impl 随机字符实现类 com.google.code.kaptcha.text.impl.DefaultGibberish
kaptcha.wordrenderer.impl 文字渲染器实现类 com.google.code.kaptcha.text.impl.DefaultWordRenderer

impl结尾的属性,用户可以自动实现,订制属于自己的实现。其他的数据可以直接修改数据不需要额外的代码。

2.4 测试

默认图形验证码

定制图形验证码

java 复制代码
// 验证码只能是数字
properties.setProperty("kaptcha.textproducer.char.string", "0123456789");
// 设置渐变色 从gray(灰色)到 yellow(黄色)
properties.setProperty("kaptcha.background.clear.from", "gray");
properties.setProperty("kaptcha.background.clear.to", "yellow");

03 小结

图片验证码最早期的验证策略。还依稀记得当年手搓图片验证码,现在已经完全忘记了。

随着技术的发展,这类图片验证码已经慢慢被滑动验证码、旋转验证码等替代,因为他们验证起来更方便且安全。

还记得当前铁道部12306的验证码曾经引起一时轰动,铁道部为了应对黄牛党刷票,更是频繁的更换验证码的形式。当年的验证码6个杯子里装着透明液体,让用户找出是水的图片,不知道是真是假,一直被广大网友调侃。

下一期给大家带来另一款开源验证码:行为验证码。可以滑动、旋转、文字点选、刮刮乐等有趣的行为操作。

下期见!

相关推荐
嘻嘻嘻嘻嘻嘻ys4 分钟前
《Vue 3.3响应式革新与TypeScript高效开发实战指南》
前端·后端
高桐@BILL11 分钟前
1.4 大模型应用产品与技术架构
人工智能·架构·agent
暮乘白帝过重山13 分钟前
路由逻辑由 Exchange 和 Binding(绑定) 决定” 的含义
开发语言·后端·中间件·路由流程
xxjiaz17 分钟前
水果成篮--LeetCode
java·算法·leetcode·职场和发展
CHQIUU17 分钟前
告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
spring boot·后端·状态模式
广西千灵通网络科技有限公司27 分钟前
基于Django的个性化股票交易管理系统
后端·python·django
zizisuo35 分钟前
6.1.多级缓存架构
缓存·架构
CodeFox35 分钟前
动态线程池 v1.2.1 版本发布,告警规则重构,bytebuddy 替换 cglib,新增 jmh 基准测试等!
java·后端
tonydf44 分钟前
0帧起手本地跑一下BitNet
后端·ai编程
ℳ₯㎕ddzོꦿ࿐1 小时前
Java集成Zxing和OpenCV实现二维码生成与识别工具类
java·opencv