白嫖!开源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个杯子里装着透明液体,让用户找出是水的图片,不知道是真是假,一直被广大网友调侃。

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

下期见!

相关推荐
程序员岳焱43 分钟前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
FrankYoou1 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*1 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了2 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头2 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
9527华安2 小时前
FPGA实现40G网卡NIC,基于PCIE4C+40G/50G Ethernet subsystem架构,提供工程源码和技术支持
fpga开发·架构·网卡·ethernet·nic·40g·pcie4c
天河归来2 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
weixin_478689762 小时前
十大排序算法汇总
java·算法·排序算法
码荼2 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud