场景编程集锦 - 趣谈验证码

news2024/11/15 15:27:04

1. 场景描述

在这里插入图片描述

  或许是近年来电话推销机器人太泛滥了,常常搞得正常的电话销售“灰头土脸”。有人为了验证对方究竟是人还是机器,竟想出来各种各样的奇葩手段。最近一小伙接到了一个汽车推销电话,但他听声音无法判断对方是不是人工客服人员。尽管对方在电话里反复声称自己是“真人”,可男子还是不肯相信,竟然提出让客服人员即兴背诵唐诗《陋室铭》,以此证明自己不是人工智能机器人,令人啼笑皆非。其实在这个场景中涉及一个重要而核心的问题,那就是如何进行身份认证。

  我们现在生活在一个网络时代,身份认证也算是司空见惯的事情。例如:如果你需要修改手机银行登录密码,那么你就要通过获取短信验证码来证明自己的身份;如果你忘记了邮箱登录密码,你需要向邮箱运营方申请验证码,以便重置邮件系统的登录密码;使用验证码来验证身份的场景比比皆是。在这些认证场景中,验证码就是我们获取特殊权限的通行证,以此证明:你是谁?从哪里来?要到哪里去?你可千万别小看这三个问题,这是哲学研究的三大终极问题。
  接下来,我们就来谈一谈验证码的事儿,如何生成验证码以及怎样进行验证码的校验。


2. 编程思路

  总体来讲,我们常见的验证码可分为纯数字验证码以及由字母数字和特殊字符组成的字符验证码。顾名思义纯数字验证码由数字0~9组成的多位的数字串。本场景中我们讲解纯数字验证码的生成和验证。

2.1 随机生成验证码

  我们可以在字符串“1234567890”中随机抽取4个字符,组成一个新的字符串,这个就是一个数字验证码。

2.2 验证码的实效性

  出于安全性原因,每个验证码都有一个实效性要求,也就是说验证码在一定的时间范围内才是有效的。因此我们可以在创建验证码的同时,生成一个时间戳,便于在验证码校验时与当前时间进行比较。这里我们把验证码的生命周期设定为5分钟。

2.3 如何验证验证码

  双重校验。既要校验验证码的正确性,又要校验验证码的有效期。


3. 程序代码

  程序由两个模块组成。一个是验证码函数基础模块verification_code.py,它是存放在Python包common中;另一个是主程序,演示验证码函数的各种使用方法verification_test.py。
下面是模块verification_code.py的源程序代码:

"""
  verification_code.py : 验证码基础函数模块
"""
import time
import random

def make_code(length=4):
    """
    功能:随机生成验证码
    参数:length 验证码长度
    """
    digitals = '0123456789'
    code = ''
    for i in range(length):
        idx = random.randint(0, len(digitals)-1)   # ①
        code += digitals[idx]   # ②
    return code

def check_code(code_dict, code, timeout=5):
    """
    功能:校验验证码
    参数:code_dict 验证码字典
         code 验证码
         timeout 验证码有效期,单位为分钟
    """
    status = 0
    period = timeout * 60   # ③
    time_stamp = time.time()   # ④

    if code not in code_dict:
        status = 1  # 验证码无效
    else:
        if (time_stamp-code_dict[code]) > period:   # ⑤
            status = 2  # 验证码超时
        else:
            status = 0  # 验证码正确
    return status


def add_code(code_dict, code):
    """
    功能:将验证码保存到字典
    参数:code_dict 存放验证码字典
         code 验证码
    """
    
    code_dict[code] = time.time()   # ⑥

重要函数说明如下:
函数make_code(length=4):缺省默认情况下,生成一个4位数字的验证码。
函数check_code(code_dict, code, timeout=5):校验验证码。默认情况下验证码的有效期是5分钟。
函数add_code(code_dict, code):将验证码code加入到验证码字典中。
重要语句说明如下:
语句①随机生成字符串:'0123456789’中的一个索引值。
语句②根据索引值idx提取字符串:'0123456789’中的一个字符。
语句③将验证码有效期的分钟转换成秒数。
语句④生成当前时间的时间戳。
语句⑤校验验证码是否过期。
语句⑥创建一个字典项,它是以验证码是键,时间戳是值。
以下是模块verification_test.py程序代码:

"""
  verification_test.py : 趣谈验证码
"""
from common.verification_code import *

def print_status(status):
    if status == 0:
        print("验证码正确!")
    elif status == 1:
        print("验证码错误!")
    elif status == 2:
        print('验证码过期!')

def main():
    code_dict = {}  # 验证码字典

    for i in range(3):  # 生成 3 个验证码
        code = make_code()  # 4位数字验证码
        time.sleep(1)
        add_code(code_dict, code)

    # 打印生成的验证码和时间戳
    print('验证码', '\t', '时间戳')
    for k, v in code_dict.items():
        print(k, '\t', v)

    # 取字典中第1个键
    code = list(code_dict.keys())[0]

    status = check_code(code_dict, code)
    print_status(status)

    time.sleep(360)   # 延时6分钟
    status = check_code(code_dict, code, timeout=5)
    print_status(status)

    status = check_code(code_dict, 'A345')
    print_status(status)

if __name__ == '__main__':
    main()
    

4. 执行效果

4.1 目录结构

本程序由两个模块构成,它们存放的目录如下:

D:\cases\趣谈验证码>dir
2022/12/20  16:28    <DIR>          common
2022/12/20  16:21             1,033 verification_test.py
 
D:\cases\趣谈验证码>cd common
D:\cases\趣谈验证码\common>dir
2022/12/20  16:28             1,179 verification_code.py
2022/04/01  07:34               106 __init__.py

(cases) D:\cases\趣谈验证码\common>

目录common实际上是Python的包,因为在该目录下有一个特殊文件__init__.py。

4.2 代码执行

D:\cases\趣谈验证码>python verification_test.py
验证码   时间戳
8444     1671526895.0580647
7538     1671526896.0734143
2305     1671526897.085462
验证码正确!
验证码过期!
验证码错误!

D:\cases\趣谈验证码>

  程序执行的显示结果表明,分别测试了验证码校验中存在的三种情况:即验证码正确、错误和过期,程序处理结果完全正确。

5. 场景扩展

  以上程序展示了数字验证码的生成和校验。作为本案例的延伸和扩展,我们还可以增加字符验证码的生成和校验功能,请读者自行完成。

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

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

相关文章

大数据导论笔记

视频课林子雨老师 大数据导论 网页笔记预习大数据导论 大数据导论复习笔记 一、大数据概述 1.数据的概念、类型和组织形式 数据概念 数据类型 &#xff08;1&#xff09;数据基本类型 数据类型包括文本&#xff0c;图片&#xff0c;音频&#xff0c;视频等 数据组织形式 2…

【UE4 第一人称射击游戏】30-简单的任务提示功能

上一篇&#xff1a;UE4 第一人称射击游戏】29-流畅的枪械移动本篇效果&#xff1a;到达指定位置后&#xff0c;右上角会出现新的任务提示信息步骤&#xff1a;打开“ThirdPersonCharacter”&#xff0c;添加一个string类型变量默认值设为“Progress Through The Level”打开“F…

.Net Core实现健康检查

ASP.NET Core 提供运行状况检查中间件和库&#xff0c;以用于报告应用基础结构组件的运行状况。运行状况检查由应用程序作为 HTTP 终结点公开。可以为各种实时监视方案配置运行状况检查终结点&#xff1a; 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态…

MySQL 8.0 多实例安装

规划&#xff1a;主要就是data目录和port 端口以及socket 文件路径的差异管理&#xff1a; 配置文件准备 mkdir -p /data/330{6..8}/data chown -R mysql.mysql /data/* cat > /data/3306/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql datadir/data/3306…

新华三命令行基础

命令使用基础命令行视图用户视图• <h3c>• 只能查看配置&#xff0c;不能修改配置只能进行查看系统视图• [h3c]• 可以查看和修改全局配置接口视图• [H3C-GigabitEthernet0/0]• 可以对接口修改配置视图的切换system-view• 从用户视图进入系统视图interface g0/0• 从…

websocket_flask

1.使用socket协议构建server client文件&#xff0c;服务端构建maskrcnn分割模型&#xff0c;客户端发送图片返回分割结果&#xff1b;使用纯socket通信&#xff0c;通信传输效率较低&#xff0c;接收数据需要1024byte连续接收代码如下#server.py import socket import torchvi…

社区发现系列03-Louvain算法分辨率

1、分辨率局限 louvain算法存在的问题&#xff1a;分辨率局限。就是说当通过优化模块度来发现社区结构时&#xff0c;网络在存在一个固有的分辨率局限&#xff0c;导致一些规模较小但是结构显著的社区淹没在大的社区中&#xff0c;无法被识别到。 造成这个问题的根本原因是模块…

曝光:超算实习生的训练模式很独特

升职无望&#xff0c;随时被裁&#xff1b;内卷压力&#xff0c;无情996现如今的打工人实惨&#xff0c;但无论客观行情如何、经济到底有多难&#xff0c;背靠国家政策支持的高级技术人才&#xff0c;任何时候都吃香。超算、先进计算就是这样的行业&#xff0c;已经被定为未来3…

持续交付-Blue Ocean 应用

Blue Ocean 提供了一套可视化操作界面来帮助创建、编辑 Pipeline 任务。Blue Ocean 特性&#xff1a;流水线编辑器&#xff1a;用于创建贯穿始终的持续交付流水线&#xff0c;是一种直观并可视化的流水线编辑器。流水线的可视化&#xff1a;对流水线的可视化表示&#xff0c;提…

vm虚拟机及Linux系统安装教程详解

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Java集合源码学习(2)ArrayList

1 概述 ArrayList是基于数组实现的&#xff0c;是一个动态数组&#xff0c;其容量能自动增长&#xff0c;类似于C语言中的动态申请内存&#xff0c;动态增长内存。 ArrayList不是线程安全的&#xff0c;只能用在单线程环境下&#xff0c;多线程环境下可以考虑用Collections.s…

Commonsense and Named Entity Aware Knowledge Grounded Dialogue Generation

摘要 motivation&#xff1a; 以外部知识为基础&#xff0c;在对话历史背景下解释语言模式&#xff0c;如省写、回指和共同引用&#xff0c;对对话的理解和生成至关重要。 this paper&#xff1a; 在本文中&#xff0c;我们提出了一种新的开放域对话生成模型&#xff0c;该模型…

【C++】vector的使用及其迭代器失效问题

文章目录一、vector介绍二、vector使用1. 常用构造函数2. 迭代器3. 空间操作4. 增删查改5. 动态二维数组三、vector迭代器失效问题1. 扩容导致迭代器失效2. erase导致迭代器失效3. g对迭代器失效的处理一、vector介绍 vector是表示可变大小数组的序列容器。与数组一样&#xf…

vue打包exe

文章目录一、前言二、实现方法1.跑通示例代码 electron-quick-start<1>clone示例代码<2>进入项目根目录&#xff0c;下载依赖<3>测试运行2.打包自己的 vue 项目3.将vue项目整合到示例代码中打包exe<1>将打包好的 dist 文件夹复制到示例代码 electron-q…

【Linux】gdb调试器的使用

All is well that ends well.结果好就是好。 个人主页&#xff1a;阿润菜菜 简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 Windows 操作系统中&#xff0c;我们更习惯使用一些已经集成好的开发环境&#xff08;IDE&#xff09;&#xff0c;如 VS、VC、Dev-…

LeetCode461. 汉明距离,x与y异或,之后用f(x)=x (x−1))次数与Integer.bitCount求二进制1的个数

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 1.x ^ y异或&#xff0c;用f(x)x & (x−1)&#xff09;次数求二进制中1的个数&#xff0c;那么 f(x) 恰为x删去其二进制表示中…

C语言_文件操作(上)

目录 1. 什么是文件 2. 文件名 3. 文件类型 4. 文件缓冲区 5. 文件指针 6. 文件的打开和关闭_fopen_fclose 7. 文件的顺序读写 7.1 fputc 7.2 fgetc 7.3 fputs 7.4 fgets 7.5 fscanf 7.6 fprintf 7.7 fread 7.8 fwrite 7.9 对比scanf/printf、fscanf/fprintf、…

java实现dwg转pdf

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、无奈选择第二种二、jar引入1.jar地址2.使用jar,完成dwg转为pdf总结前言 由于公司需要最近研究一个cad文件需要在浏览器中展示,经过研究发现大致有两种方式:…

JVM-围观如何打破双亲委派机制

下面手把手用代码来实现打破JVM的双亲委派机制一、Tomcat打破双亲委派机制以Tomcat类加载为例&#xff0c;Tomcat作为web容器&#xff0c; 那么它要解决什么问题呢&#xff1f;Tomcat 如果使用默认的双亲委派类加载机制行不行&#xff1f;1.1 Tomcat作为web容器&#xff0c; 那…

科技云报道:CES 2023:自动驾驶、元宇宙备受瞩目

科技云报道原创。 在被疫情扰乱了两年之后&#xff0c;2023年CES终于回归正常了。 1月5日-8日&#xff0c;CES 2023在拉斯维加斯举行。作为当前全球规模最大、影响力最广泛的消费类电子技术年展&#xff0c;本届展会涵盖的重要主题包括可持续性、数字健康、Web3与元宇宙以及人…