简析发送手机验证码原理
文章目录
- 发放手机验证码
- 手机验证码校验
- 小结
在一般互联网网站(如淘宝、京东等)注册账号或者找回密码时通常让用户进行手机号码进行 发送验证码验证,这种方式能有效的保证帐号安全,下面来解析一下它的原理。
整体流程如下图如示,包括手机验证码发送和校验流程。简而言之,手机短信?验证码,是通过发送验证码到手机,然后输入接收到的验证码到登录框,两者一致就能通过审核,成功登录,否则失败。
通常验证码会以手机号码作缓存 key,验证码作为缓存 value,验证码有效时间作为过期时间存放到缓存中,校验手机验证码时直接根据手机号码取出缓存中的验证码与用户输入的验证码进行比对即可。
发放手机验证码
为了防止恶意发放,发送手机验证码时需要设置每次发放短信的间隔。流程如下:
- Step 1:校验是否频繁发送手机验证码(比较当前时间与上一次缓存更新时间是否超过指定时间间隔)
- Step 2:若非频繁发送,则随时生成4位验证码
- Step 3:将手机号和验证码放入缓存中。其中其中cache结构: 手机号作为 cache key,验证码作为 cache value, 验证码过期时间作为 cache 过期时间
- Step 4:调用短信服务执行真实发放逻辑
伪代码如下:
public void sendPoneCode(String nationCode, String phone) {// 1. 拼接为区号,如+86是中国的国际区号String target = nationCode + phone;// 2. 校验是否发放频繁if(!checkCanSend()){System.out.printf("发送过于频繁,请稍等!");return;}// 3. 生成手机随机码String phoneCode = generatePhoneCode();// 4. 放入 cacheputCache(target, phoneCode, EXPIRE);// 4. 调用短信服务执行发送dosSendPoneCode(target, phoneCode);}private boolean checkCanSend() {Long curTime = System.currentTimeMillis();/** 获取 cache 的更新时间,其中cache结构: target 作为 cache key,phoneCode 作为 cache value, expire 作为 cache 过期时间*/Long cacheUpdateTime = getCacheUpdateTime();/** 比较 cache 的更新时间与当前时间差值是否大于短信发送间隔*/if(curTime - cacheUpdateTime < INTERVAL) {return true;}return false;}private static String generatePhoneCode() {StringBuilder phoneCode = new StringBuilder();Random random = new Random();for (int i = 0; i <4 ; i++) {phoneCode.append(random.nextInt(10));}return phoneCode.toString();}private void putCache(String target, String phoneCode, int expire) {/*** target 作为 cache key,phoneCode 作为 cache value, expire 作为 cache 过期时间* 省略具体cache put 调用*/}private void dosSendPoneCode(String target, String phoneCode) {// 调用短信服务执行真实发送逻辑,省略}
手机验证码校验
手机验证校验逻辑比较简单,从缓存中取出缓存中的验证码,与用户手机输入的验证码直接进行比对即可,伪代码如下:
public boolean validatePoneCode(String nationCode, String phone, String code) {// 1. 拼接为区号,如+86是中国的国际区号String target = nationCode + phone;// 2. 从 cache 中取出String cachePoneCode = getValueFromCache(target);// 3. 比较是否一样if(code.equals(cachePoneCode)) {return true;}return false;}
小结
文中因超出标题的范畴并未描述短信服务的发放原理,短信服务一般由第三方服务来提供(比如阿里的SMS等),对接后可直接使用其sdk进行发送。事实上手机发送及验证码流程并没有神秘的地方,文中发送和校验手机验证码流程可以直接借鉴到日常项目中。
欢迎如转载,请注明出处!欢迎关注微信公众号:方辰的博客。
简析发送手机验证码原理相关推荐
- 用Python模拟识别图片验证码并发送手机验证码
1.导语 大家好,好久不见.又到每日分享Python小技能的时候了.最近因为疫情影响,所以更新内容比较慢-今天周一,就来更新一波,心血来潮,是时候上线经营了.其实也没想到有啥好分享的,不如分享一些干货 ...
- 注册/找回密码等功能中发送手机验证码后倒计时效果的实现(基于vue)
注册/找回密码等功能中发送手机验证码后倒计时效果的实现,基于vue.element-ui <template><el-button size="small" ty ...
- SpringBoot+vue 使用阿里云的短信功能发送手机验证码
前言: 小编后端用的是Springboot 前端用的是vue ,小编主要是写后台,前端页面比较简陋,后期还要调优,写的不对处还望多多包涵. 环境: 需要先准备好阿里云的账号和一些必要的参数.详情见我的 ...
- python按照号段生成手机号接收验证码_django 发送手机验证码的示例代码
一.流程分析: 1.用户在项目前端,输入手机号,然后点击[获取验证码],将手机号发到post到后台. 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商 ...
- java实现发送手机验证码功能
1. 进入秒嘀科技(http://www.miaodiyun.com/),注册一个账号 2. 注册好之后,点击 用户中心 -> 账户管理,就会进入如下界面 (顺便提一下,新注册的用户,平台会免费 ...
- 手机验证码平台,怎么发送手机验证码,php开发手机验证码短信接口功能
通过前面的学习, 你已经掌握怎么在腾讯短信平台上设置项目, 添加短信签名, 设置短信模板, 把手机验证码注册页面写好. 今天子恒老师来跟你分享怎么实现发送手机验证码给用户, 注意我们使用的是php开发 ...
- springMVC+阿里云API = 实现发送手机验证码短信
springMVC+阿里云API = 实现发送手机验证码短信 前段时间vue框架做了一个旅游APP软件,其中在用户登录APP的时候,我不仅提供了用户可以自己手动先去注册账号在进行登陆App.然后我还提 ...
- 解决申请开发者office E5中无法发送手机验证码,reCaptcha加载失败
关于申请开发者office E5中无法发送手机验证码的解决方案 文章目录 关于申请开发者office E5中无法发送手机验证码的解决方案 注册过程 加载失败原因 解决过程 解决方案 注册过程 这是我的 ...
- 发送手机验证码,验证手机验证码,包括数据表的设计
表结构:https://download.csdn.net/download/weixin_42330073/10848493 <?php/*** 发送手机验证码*/public functio ...
- java手机验证码代码_发送手机验证码
[java]代码库/** * * @包名 :com.feel.common.util * @文件名 :SendMobileRand.java * TODO 类作用:发送手机验证码 * @系统名称 : ...
最新文章
- 所有java程序都有线程_若所有的用户线程都终止了,Java程序就会结束。( )_学小易找答案...
- legend3---laravel中获取控制器名称和方法名称
- [洛谷P1822]魔法指纹
- J2SE 基础入门,从事 Java 必学!
- 《Non-invasive Fetal ECG Signal Quality Assessment for Multichannel Heart Rate Estimation》论文解读-废弃
- Numpy中数组创建函数的辨析
- centos8配置本地光盘yum源_CentOS8 配置本地yum源的详细教程
- MyBatis 使用
- 机器学习之使用贝叶斯算法实现拼写检查器
- Java学习笔记--反射API
- ArcGIS 10 SP5 (Desktop, Engine, Server)中文版 补丁
- 微信认证小程序如何绑定微信支付商户平台
- 如何检查你的MAC是不是原封正品
- Android肝帝战纪之Fragmentation的使用(单Activity+多Fragment设计)
- .vm后缀的文件是什么?
- NS-3教程(2):NS-3简单介绍
- laravel 请求出现 post The page has expired due to inactivity.
- eos节点服务器_EOS柚子生态投票的骗局,你以为自己在区块恋革命,其实是在参与CX罢了...
- 关于开发人员学习的网站【收藏】
- 子进程及时知道父进程已经退出的最简单方案
热门文章
- c语言求阶乘和的流程图_C语言:数据结构-栈与递归
- Tensorboard启动时面对大量文件存在内存升高问题
- mysql数据库repair_MySQL数据库中的REPAIRTABLE语法介绍
- 《中国品牌故事》讲述中节能品牌故事:皓日初升
- ASP.NET Core 和 EF Core 系列教程——迁移
- cannot open shared object file
- ROI是什么?电商ROI计算公式及理论及详解
- word中更新目录中只更新页码和更新整个目录的区别
- 编译原理 实验四 LR(1)分析法程序
- Real Time Rendering 第一章 简介