# 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】 事件描述备注:保存/发布 中国 天津市 天津 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)