# Java 基于 数学 方程 表达式 动态验证码 生成与验证系统 简单实现
*数据分析案例*
本文中使用 zhao-utils 和 mathematical-expression 实现了 解方程 生成验证码!
## 目录
[TOC]
## 1. 项目概述
本文介绍了一种基于数学表达式运算的新型验证码生成系统。该系统通过动态生成随机数学方程并将其渲染为图像验证码,结合精确的数学计算验证机制,有效阻止了自动化脚本和机器人的恶意访问。相较于传统文字/图形验证码,该方案具有更强的抗攻击性和更高的验证准确性。
## 2. 技术实现
### 2.1 核心架构
系统采用模块化设计,主要包含以下组件:
数学表达式引擎:使用mathematical-expression库动态生成和求解数学方程
图像生成器:通过zhao-utils库创建带干扰效果的验证码图像
验证逻辑:比对用户输入解与精确解的误差范围
### 2.2. 关键代码解析
> 关于更多方程求解器的信息,请查阅:https://www.lingyuzhao.top/b/Article/642005276990823
```
// 数学表达式生成
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. 改进方向
- 多模态验证:结合图形识别和数学计算
- 自适应难度:根据用户行为动态调整方程复杂度
------
***操作记录***
作者:[zhao](https://www.lingyuzhao.top//index.html?search=4 "zhao")
操作时间:2025-05-13 13:32:33 星期二 【时区:UTC 8】
事件描述备注:保存/发布
中国 天津市 天津
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)