Java 基于 数学 方程 表达式 动态验证码 生成与验证系统 简单实现
数据分析案例
本文中使用 zhao-utils 和 mathematical-expression 实现了 解方程 生成验证码!
目录
文章目录
1. 项目概述
本文介绍了一种基于数学表达式运算的新型验证码生成系统。该系统通过动态生成随机数学方程并将其渲染为图像验证码,结合精确的数学计算验证机制,有效阻止了自动化脚本和机器人的恶意访问。相较于传统文字/图形验证码,该方案具有更强的抗攻击性和更高的验证准确性。
2. 技术实现
2.1 核心架构
系统采用模块化设计,主要包含以下组件:
数学表达式引擎:使用mathematical-expression库动态生成和求解数学方程
图像生成器:通过zhao-utils库创建带干扰效果的验证码图像
验证逻辑:比对用户输入解与精确解的误差范围
2.2. 关键代码解析
// 数学表达式生成
SingletonEquationSolvingTwo instance = (SingletonEquationSolvingTwo)
Mathematical_Expression.getInstance(Mathematical_Expression.singleEquationSolving2);
EquationSolverExpression compile = instance.compile("0+x-0=500", false);
// 随机参数设置
compile.setKnownNumber(0, random.nextInt(100));
compile.setKnownNumber(2, random.nextInt(100));
// 验证码图像生成
BufferedImage image = captchaGenerator.generateCaptchaImage(explain, 20);
ImageMatrix parse = ImageMatrix.parse(ASIO.parseImageGetColorArray(image));
parse.show("res");
安全性分析
特征 | 传统验证码 | 数学验证码 |
---|---|---|
生成方式 | 固定模板 | 动态随机生成 |
验证逻辑 | 图像识别 | 数学计算 |
抗OCR能力 | 中 | 高 |
用户友好度 | 高 | 中 |
实现复杂度 | 低 | 中 |
完整代码
import io.github.beardedManZhao.algorithmStar.operands.matrix.ImageMatrix;
import io.github.beardedManZhao.algorithmStar.utils.ASIO;
import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.SingletonEquationSolvingTwo;
import io.github.beardedManZhao.mathematicalExpression.core.container.CalculationNumberResults;
import io.github.beardedManZhao.mathematicalExpression.core.container.EquationSolverExpression;
import top.lingyuzhao.utils.CaptchaGenerator;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.Scanner;
public class MAIN {
public static void main(String[] args) {
// 准备一个数组 用于标识背景的颜色组成
final Color[] colors = {
Color.white, Color.gray, Color.CYAN, Color.yellow, Color.blue, Color.green
};
// 准备随机器
final Random random = new Random();
// 创建生成器 这个生成器会生成 600 * 140 的图片,背景颜色为 6 种随机排列
final CaptchaGenerator captchaGenerator = new CaptchaGenerator(600, 140, colors);
// 准备一个方程
SingletonEquationSolvingTwo instance = (SingletonEquationSolvingTwo) Mathematical_Expression.getInstance(Mathematical_Expression.singleEquationSolving2);
EquationSolverExpression compile = instance.compile("0+x-0=500", false);
try (final Scanner scanner = new Scanner(System.in)) {
// 设置方程中的两个实数
compile.setKnownNumber(0, random.nextInt(100));
compile.setKnownNumber(2, random.nextInt(100));
// 获取到方程表达式 并生成图片
final String explain = compile.explain();
// 生成图片 设置干扰程度为 20 ,表达式作为文本
BufferedImage image = captchaGenerator.generateCaptchaImage(explain, 20);
ImageMatrix parse = ImageMatrix.parse(ASIO.parseImageGetColorArray(image));
// 展示图像
parse.show("res");
// 等待用户输入解
System.out.print("请输入解: x = ");
// 获取到用户输入的解
double user = Double.parseDouble(scanner.nextLine());
// 计算出真实的解
CalculationNumberResults calculation = compile.calculation(false);
// 查看误差是否在 0 到 1 之间
if (Math.abs(user - calculation.getResult()) < 1) {
System.out.println("验证通过!");
} else {
System.out.println("验证失败!");
}
} finally {
captchaGenerator.close();
}
}
}
下面是运行效果
3. 优势特点
-
动态不可预测性:每次生成的方程参数和图像特征均不同
-
计算验证机制:避免了传统验证码被OCR破解的风险
-
误差容忍设计:允许±1的误差范围,兼顾用户体验和准确性
-
干扰增强技术:通过颜色矩阵变换和随机干扰线增加机器识别难度
4. 应用场景
该系统特别适用于以下场景:
-
学术系统:防止自动化脚本刷课/考试
-
金融平台:高安全需求的操作验证
-
科研设备:实验室仪器访问控制
-
在线教育:防止AI代做作业
5. 改进方向
-
多模态验证:结合图形识别和数学计算
-
自适应难度:根据用户行为动态调整方程复杂度