人机验证码生成与验证:提升系统安全性

一、前言

为了防止机器人或脚本程序自动化攻击和滥用系统资源,很多网站和应用程序需要使用验证码来判断用户是否为真人。 一般登录都要求用户手动输入以验证身份的安全措施。验证码是一种通过生成包含随机字符的图像或文本,通常包含了不同大小写字母、数字或特殊符号,具有一定的复杂性和随机性,使机器难以识别和破解。

本项目使用 C 语言实现一个简单的人机验证码生成和验证程序。程序生成一个由4位随机字符组成的验证码,并要求用户在控制台中手动输入该验证码。如果用户输入与生成的验证码匹配,则输出"验证成功";否则输出"验证失败"。

在生成验证码的过程中,使用了随机数生成函数 rand() 来获取随机数,并结合字符集合来生成随机字符。为了确保每次生成的验证码都是独一无二的,使用当前系统时间作为种子来初始化随机数生成器。

这个项目可以应用于各种需求,如注册页面的人机验证、防止暴力破解密码的登录页面、限制自动化爬虫等。通过要求用户手动输入验证码,可以有效防止机器人或脚本程序的自动化攻击,提高系统安全性和用户隐私保护。

下面给了3种例子,分别是字符验证码图片验证码计算题结果验证

image.png

image-20230816101944251

image-20230816101926767

二、代码实现(生成验证码并进行验证)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>// 生成随机验证码
void generateCode(char* code, int length) {const char charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";srand(time(NULL));for (int i = 0; i < length; i++) {int index = rand() % (sizeof(charset) - 1);code[i] = charset[index];}code[length] = '\0';
}int main() {char code[5];generateCode(code, 4);printf("请输入验证码:%s\n", code);char input[5];scanf("%s", input);if (strcmp(input, code) == 0) {printf("验证成功!\n");} else {printf("验证失败!\n");}return 0;
}

代码中,generateCode 函数用于生成指定长度的随机验证码。使用包含大小写字母和数字的字符集合,通过调用 srand() 函数设置随机数种子,确保每次生成的验证码都是不同的。

main 函数中,调用 generateCode 生成一个4位数的验证码,将其打印出来。用户输入验证码,输入结果存储在 input 字符数组中。

通过使用 strcmp 函数比较用户输入的验证码和生成的验证码,如果相等则输出"验证成功",否则输出"验证失败"。

三、生成验证码,绘制到图片里,提高验证难度

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)#define WIDTH 50    // 图片宽度
#define HEIGHT 50   // 图片高度// 生成随机4位数验证码
int generateRandomCode() {srand(time(NULL));return rand() % 10000;
}// 绘制验证码到BMP图片
void drawCodeToBMP(int code) {FILE* filePtr;unsigned char* imageData;int imageSize = WIDTH * HEIGHT * 3;  // 3 bytes per pixel (RGB)// 分配内存用于存储图像数据imageData = (unsigned char*)malloc(imageSize);// 设置所有像素为白色for (int i = 0; i < imageSize; i += 3) {imageData[i] = 255;     // RimageData[i + 1] = 255; // GimageData[i + 2] = 255; // B}// 在图像中心绘制验证码int x = (WIDTH / 2) - 10;   // x坐标偏移量,使验证码居中显示int y = (HEIGHT / 2) + 5;   // y坐标偏移量,使验证码居中显示sprintf((char*)(imageData + ((y * WIDTH + x) * 3)), "%04d", code);// 打开文件准备写入图像数据filePtr = fopen("6666.bmp", "wb");// BMP文件头unsigned char bmpFileHeader[] = {0x42, 0x4D,             // 文件类型0x36, 0x00, 0x0C, 0x00, // 文件大小0x00, 0x00,             // 保留字0x00, 0x00,             // 保留字0x36, 0x00, 0x00, 0x00, // 数据偏移量};// BMP信息头unsigned char bmpInfoHeader[] = {0x28, 0x00, 0x00, 0x00, // 信息头大小0x32, 0x00, 0x00, 0x00, // 图像宽度0x32, 0x00, 0x00, 0x00, // 图像高度0x01, 0x00,             // 颜色平面数0x18, 0x00,             // 每像素位数0x00, 0x00, 0x00, 0x00, // 压缩方式0x00, 0x00, 0x0C, 0x00, // 图像数据大小0x00, 0x00, 0xC4, 0x0E, // 水平分辨率0x00, 0x00, 0xC4, 0x0E, // 垂直分辨率0x00, 0x00, 0x00, 0x00, // 颜色表数目0x00, 0x00, 0x00, 0x00, // 重要颜色数目};// 写入文件头和信息头fwrite(bmpFileHeader, sizeof(unsigned char), sizeof(bmpFileHeader), filePtr);fwrite(bmpInfoHeader, sizeof(unsigned char), sizeof(bmpInfoHeader), filePtr);// 写入图像数据fwrite(imageData, sizeof(unsigned char), imageSize, filePtr);// 关闭文件fclose(filePtr);// 释放内存free(imageData);
}int main() {int code = generateRandomCode();printf("验证码: %04d\n", code);drawCodeToBMP(code);printf("已生成验证码图片: 6666.bmp\n");return 0;
}

generateRandomCode函数用于生成随机的4位数验证码。drawCodeToBMP函数根据验证码将其绘制在50x50像素大小的白色BMP图片中,将图像数据保存到名为6666.bmp的文件中。

main函数中,先生成一个随机的4位数验证码,通过调用drawCodeToBMP函数将验证码绘制到BMP图片中,在控制台打印出验证码和生成的图片文件名。

四、通过生成随机计算题来测试,提高验证难度

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable:4996)#include <stdio.h>
#include <stdlib.h>
#include <time.h>// 生成随机运算题目
void generateRandomQuestion() {srand(time(NULL));int num1 = rand() % 20;  // 生成0到19的随机数int num2 = rand() % 20;char operators[3] = { '+', '-', 'x' };char op = operators[rand() % 3];  // 从加减乘中随机选择一个运算符printf("请计算以下题目的答案:\n");printf("%d %c %d = ?\n", num1, op, num2);// 验证用户输入的结果int userAnswer;scanf("%d", &userAnswer);int correctAnswer;switch (op) {case '+':correctAnswer = num1 + num2;break;case '-':correctAnswer = num1 - num2;break;case 'x':correctAnswer = num1 * num2;break;default:break;}if (userAnswer == correctAnswer) {printf("验证成功!\n");}else {printf("验证失败,正确答案是:%d\n", correctAnswer);}
}int main() {printf("欢迎来到人机验证系统!\n");printf("请计算下面的题目,并输入答案。\n");generateRandomQuestion();return 0;
}

generateRandomQuestion函数中生成两个0到19的随机整数和一个随机的加减乘运算符,打印出题目要求用户计算结果。通过scanf函数获取用户输入的结果,与程序计算得到的正确结果进行比较,最终输出验证成功或失败的信息。

main函数中,调用generateRandomQuestion函数开始人机验证。当用户输入结果后,程序给出验证结果。

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

工业4.0、 工业互联网、智能制造与设备通信协议 Modbus OPC MQTT

工业4.0是指第四次工业革命的核心概念&#xff0c;它代表了制造业的一种转型趋势&#xff0c;即通过深度整合数字化、互联和智能化技术&#xff0c;实现生产方式的革新。以下是对工业4.0主要特点的概述&#xff1a; 数字化&#xff1a;将物理世界与虚拟世界紧密连接&#xff0c…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了&#xff1a; Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面&#xff0c;通过addrender这种方式添加多个绘制窗体&#xff0c;我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面&#xff0c;原理应该类似&#xff0c;一个地方负责打开解码播放&#xff0c;将画面…

谷歌 SGE 和生成式 AI 在搜索中:2024 年会发生什么

2024 年&#xff0c;Google 的搜索生成体验将如何影响营销&#xff1f;探索 AI 驱动的搜索趋势、SERP 中的 SGE、自然流量影响等。 最初&#xff0c;Labs 中的 Google 搜索生成体验 &#xff08;SGE&#xff09; 实验预计将于 2023 年 12 月“结束”。但随着谷歌实验室网站的最…

nodejs+vue+微信小程序+python+PHP的勤工俭学系统-计算机毕业设计推荐

微信小程序端 &#xff08;1&#xff09;首页。顶部展示公告&#xff0c;下方展示兼职信息详情&#xff0c;按时间倒序&#xff0c;求职者可以根据兼职内容信息和行业进行模糊筛选用人单位的招聘信息&#xff0c;点击某条信息可查看其信息内容和用人单位的信息&#xff08;包括…

用C语言找最大值最小值极值问题---------(C每日一编程)

一&#xff0c;输入十个数&#xff0c;输出其中的最大值 采用打擂台的方法 void main() {int i, max, a[10];for (i 0; i < 10; i)scanf("%d", &a[i]);max a[0];for (i 1; i < 10; i)if (a[i] > max)max a[i];printf("%d\n", max); } 二…

蓝牙物联网在汽车领域的应用

I、蓝牙的技术特点 ​ 1998 年 5 月&#xff0c;瑞典爱立信、芬兰诺基亚、日本东芝、美国IBM 和英特尔公司五家著名厂商&#xff0c;在联合拓展短离线通信技术的标准化活动时提出了蓝牙技术的概念。蓝牙工作在无需许可的 2.4GHz 工业频段 (SIM)之上(我国的频段范围为2400.0~248…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

关于“Python”的核心知识点整理大全41

目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py 我们将最高得分圆整…

PyTorch深度学习实战(28)——对抗攻击(Adversarial Attack)

PyTorch深度学习实战&#xff08;28&#xff09;——对抗攻击 0. 前言1. 对抗攻击2. 对抗攻击模型分析3. 使用 PyTorch 实现对抗攻击小结系列链接 0. 前言 近年来&#xff0c;深度学习在图像分类、目标检测、图像分割等诸多领域取得了突破性进展&#xff0c;深度学习模型已经能…

常见的一些库函数

什么是库函数&#xff1a; 库函数是一组预先定义好的函数&#xff0c;可以通过包含相应的头文件来使用。它们提供了各种常用的功能和算法&#xff0c;使得编程更加方便和高效。 库函数的作用如下&#xff1a; 提供常用功能&#xff1a;库函数提供了各种常用的功能&#xff0c;…

记一次应急响应练习(Linux)

记一次应急响应练习(Linux) Linux&#xff1a; 请提交攻击者的IP地址 答&#xff1a; 192.168.31.132 思路&#xff1a; 通过查看历史命令和开放的8080端口看到这台主机上运行的是Tomcat服务。并且在历史命令中看到了Tomcat的安装路径。那么就算是找到了日志的查看点了&#x…

设计模式-依赖注入模式

设计模式专栏 模式介绍模式特点应用场景依赖注入和控制反转的区别代码示例Java实现依赖注入模式Python实现依赖注入模式 依赖注入模式在spring中的应用 模式介绍 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种面向对象编程中的设计模式&…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x001

如上表所示&#xff0c;MOE1&#xff0c;OSSR0&#xff0c;CCxE0&#xff0c;CCxNE1时&#xff0c;OCx输出状态取决于GPIO端口上下拉状态&#xff0c;OCxN输出状态取决于OCx_REF与极性选择&#xff08;CCxNP&#xff09;。 -------------------------------------------------…

【头歌实训】Spark 完全分布式的安装和部署(新)

文章目录 第1关&#xff1a; Standalone 分布式集群搭建任务描述相关知识课程视频Spark分布式安装模式主机映射免密登录准备Spark安装包配置环境变量修改 spark-env.sh 配置文件修改 slaves 文件分发安装包启动spark验证安装 编程要求测试说明答案代码 第1关&#xff1a; Stand…

C++ Qt开发:QSqlDatabase数据库组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QSqlDatabase数据库模块的常用方法及灵活运用…

Cloudstack多个管理服务器节点

https://docs.cloudstack.apache.org/en/4.18.0.0/adminguide/reliability.html 参考翻译&#xff1a; 代理上支持多个管理服务器 在具有多个管理服务器的Cloudstack环境中&#xff0c;可以根据算法配置代理&#xff0c;将其连接到哪个管理服务器。这对于内部负载均衡器或高可…

【机器学习】人工智能概述

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支&#xff0c;涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…