验证码实现原理

摘要:
最简单的验证码,极限验证扫描,登录12306验证码。仔细了解结论后,我们发现验证码仍然基于会话原则或令牌原则。这里我们推荐一本书,《图解http》,它解释得很清楚。什么是令牌令牌?这是另一种被广泛使用的身份验证方法。具体原理见JWT验证原理会话原理验证码流程图。会话原理验证码的通用流程图如上图所示。令牌原理的验证码令牌原理的校验码与会话原理的验证代码不同,因为会话保存在服务器端,令牌保存在客户端。

最简单的验证码

 验证码实现原理第1张

极验验证

 验证码实现原理第2张

扫码登录

 验证码实现原理第3张

12306验证码

验证码实现原理第4张

先说结论吧

仔细了解了一番后,发现,其实 验证码 ,还是基于session原理 或者token原理

什么是session

这里推荐一本书《图解http》,里面讲解的很清楚。如果只是想简单的了解一下session,可以看看这个文章。

什么是token

token是另一种使用较多的鉴权方式,具体原理可以看一下JWT验证原理

session原理的验证码

流程图

 

session原理验证码

验证码实现原理第5张

讲解

大致流程可见上图。
其实原理蛮简单。

  1. 服务端接收到请求,生成随机数作为验证码,然后保存在session对象中。
  2. 将验证码生成图片文件流。
  3. 将文件流返回给浏览器,并且将sessionId通过cookie形式保存到浏览器。
  4. 用户提交验证码,浏览器发送请求的时候,会自动带上cookie。
  5. 后端从cookie中解析到sessionId,然后从后端存储的session中,取到对应的session对象。
  6. 比对用户提交的验证码和服务器存储的验证码,相等则验证通过。

注意: 这种验证码,验证依赖cookie,如果在用户提交验证码数据之前,手动删除了cookie中的sessionId, 那么服务器就不能正确的拿到生成的验证码,这样即使用户输入的是正确的验证码,服务器也会判断为验证不通过。

 

token原理的验证码

token原理的验证码与session原理的验证码,很显著的区别是,session会保存在服务器端,token是保存在客户端。大致流程可以参考下图。

流程图

token原理验证码

 验证码实现原理第6张

 

讲解

这种类型的验证码,在 生成 验证码后,其实是将 正确 的验证码,一起返回给 客户端 了。

那么这种操作,安全吗?

回答是,相对较安全, 因为在生成token的时候,是需要签名的,只要这个签名没有被 破解 ,则是 安全 的。但是由于token是存储在客户端的,服务端并不存储,所以可以看做是无状态的。如果token在传输过程中被窃取,那么窃取者可以模拟客户端正常发送请求。这种情况服务端其实是并不知晓的,这种情况是不安全的,可以通过https来增强安全性。

免责声明:文章转载自《验证码实现原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 理解执行计划linux中查看nginx、apache、php、mysql配置文件路径下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ASP.NET 全局变量和页面间传值方法

http://www.cnblogs.com/dgjack/archive/2011/05/28/2060913.html 1. 使用QueryString变量 QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。 如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不...

Yii2.0 用户登录详解(上)

一、准备 在开始编写代码之前,我们需要思考一下:用户登陆模块,实现的是什么功能?很明显,是登陆功能,那么,登陆需要用户名和密码,我们在数据库的一张表中就应该准备好用户名和密码的字段,再思考一下,如果要实现自动登陆的功能,那么还需要什么?Cookie,是专门用于自动登陆的,所以,我们的数据表可能需要准备一个字段,专门用于储存客户端登陆所生成的cookie,这...

Nginx+Tomcat 集群部署

1.Nginx + Tomcat 集群部署 简单配置 1 #user nobody; 2 worker_processes 4;#工作进程的个数 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log inf...

Laravel session的保存机制

与$_SESSION不同Laraver中的session是在当次程序执行完毕时保存到文件或其他存储引擎中的,也就是说如果使用了die等强制结束程序的函数将不会自动保存session导致session失效,但Laravel提供了save()方法来手动保存session //session不生效的例子 session()->put(['user_id'=...

vue之vue-cookies

npm链接:https://www.npmjs.com/package/vue-cookies 安装: npm install vue-cookies --save 使用:main.js引入 import Vue from 'Vue' import VueCookies from 'vue-cookies' Vue.use(VueCookies) Ap...

ORM操作mysql

创建表和添加数据import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.o...