黑马程序员技术交流社区

标题: 【上海校区】文详解应用登录验证码的多种实现方案 [打印本页]

作者: 梦缠绕的时候    时间: 2019-11-29 09:02
标题: 【上海校区】文详解应用登录验证码的多种实现方案
在本号的一系列Spring Security文章中,先后介绍了各种登录验证及授权中的知识点,如:spring-security简介并与shiro对比、 formLogin模式登录认证、动态数据登录验证与权限分配、账户多次登录失败锁定、RememberMe记住我功能,等等文章。笔者觉得以上的这些实际上都很简单,我们没有涉及到分布式应用。本节将以分布式的应用背景,讲解验证码实现的多种方式。本小节先从理论的角度为大家讲解,具体实现笔者还会再写。
一、验证码的组成部分
验证码实际上和谜语有点像,分为谜面和谜底。谜面通常是图片,谜底通常为文字。谜面用于展现,谜底用于校验。
总之,不管什么形式的谜面,最后用户的输入内容要和谜底进行验证。
二、session存储验证码
图中蓝色为服务端、澄粉色为客户端。
这是一种最典型的验证码实现方式,实现方式也比较简单。
这种实现方式的优点就是比较简单,缺点就是:因为一套应用部署一个session,当我们把应用部署多套如:A、B、C,他们各自有一个session并且不共享。导致的结果就是验证码和图片由A生成,但是验证请求发送到了B,这样就不可能验证通过。
三、共享session存储验证码
在第二小节讲到的问题,实际上不是验证码的问题,而是如何保证session唯一性或共享性的问题。主要的解决方案有两种:
四、基于对称算法的验证码
可能出于主机资源的考虑,可能出于系统架构的考量,有些应用是无状态的。
那么对于这些无状态的应用,我们就无法使用session,或者换个说法从团队开发规范上就不让使用session。那么我们的验证码该怎么做?
这种做法的缺陷是显而易见的:实际上就是将验证码文字在客户端服务端之间走了一遍。虽然是加密后的验证码文字,但是有加密就必须有解密,否则无法验证。所以更为稳妥的做法是为每一个用户生成密钥,并将密钥保存到数据库里面,在对应的阶段内调用密钥进行加密或者解密。
从密码学的角度讲,没有一种对称的加密算法是绝对安全的。所以更重要的是保护好你的密钥。正如没有一把锁头是绝对安全的,更重要的是保护好你的钥匙。


作者: 梦缠绕的时候    时间: 2019-11-29 09:02
有任何问题欢迎在评论区留言
作者: 梦缠绕的时候    时间: 2019-11-29 09:02
或者添加学姐微信
DKA-2018




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2