简析发送手机验证码原理

article/2025/11/9 5:51:07

文章目录

        • 发放手机验证码
        • 手机验证码校验
        • 小结

在一般互联网网站(如淘宝、京东等)注册账号或者找回密码时通常让用户进行手机号码进行 发送验证码验证,这种方式能有效的保证帐号安全,下面来解析一下它的原理。

在这里插入图片描述

整体流程如下图如示,包括手机验证码发送和校验流程。简而言之,手机短信?验证码,是通过发送验证码到手机,然后输入接收到的验证码到登录框,两者一致就能通过审核,成功登录,否则失败。

在这里插入图片描述

通常验证码会以手机号码作缓存 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进行发送。事实上手机发送及验证码流程并没有神秘的地方,文中发送和校验手机验证码流程可以直接借鉴到日常项目中。

欢迎如转载,请注明出处!欢迎关注微信公众号:方辰的博客。


http://chatgpt.dhexx.cn/article/xUZaRBLY.shtml

相关文章

App接口测试总结

使用工具 Fiddler、Jmeter 测试步骤&#xff1a; 1. 确认接口 从开发人员那里获取接口文档&#xff0c;接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。 如果当前项目没有接口文档&#xff0c;则可以使用fiddler对APP进行抓包确认…

Xilinx DDR3 —— MIG IP核的原理(APP接口)

DDR3 SDRAM&#xff08;Double-Data-Rate Three Synchronous Dynamic Random Access Memory&#xff09;是 DDR SDRAM的第三代产品&#xff0c;DDR SDRAM 的最大特点是双沿触发&#xff0c;即在时钟的上升沿和下降沿都能进行数据采集和发送&#xff0c;同样的工作时钟&#xff…

APP接口设计规范

APP接口设计规范 效率安全版本兼容性面向对象设计数据格式Json服务端的异常处理https协议 1.效率 APP对服务器端要求是比较严格的&#xff0c;在移动端有限的带宽条件下&#xff0c;要求接口响应速度要快&#xff0c;所有在开发过程中尽量选择效率高的框架&#xff0c;对数据…

TP6+JWT开发APP接口

1. 开发环境 PHP框架: ThinkPHP6操作系统: MacOsWeb服务器: Nginx 2. APP接口 2.1. 简介 客户端与服务端进行数据交互的通道, 大部分APP接口都是通过HTTP协议通信的 2.2. HTTP通信的三要素 URL 通信地址Method 通信方式(GET|POST|PUT|DELETE)Params 通信的内容 2.3 APP接…

快速开发一个混合APP(Hybrid APP)

混合开发APP&#xff08;Hybrid APP&#xff09;简单说就是将原生功能封装成JS接口&#xff0c;前端通过调用接口实现功能。前端使用html来开发APP&#xff0c;可以实现自动更新&#xff0c;一套代码同时生成Android和iOS两端安装包&#xff0c;开发速度快&#xff0c;用户体验…

Hybrid App开发 四大主流平台

Hybrid App在过去的两年中已经成为移动界的核心话题&#xff0c;但是作为一名Web开发者来说要如何站在移动互联网的浪潮之巅呢&#xff1f;是选择学习原生开发&#xff0c;研究Java、 Object-C、C#等语言&#xff0c;还是选择继续使用网页开发&#xff0c;容忍HTML5功能的局限性…

whatsapp协议api接口

测试demo&#xff1a;http://39.109.122.117:8081/login Whatsappapi 一、登录注册 登录 发送验证码 效验短信验证码 查询是否封号 获取版本号 查询是否封号&#xff08;商业版&#xff09; 发送验证码&#xff08;商业版&#xff09; 效验短信验证码&#xff08;商业…

第一次做APP接口开发过程总结

关于平湖人社APP后台开发总结APP后台接口开发我总结出以下几个部分: 需求分析与整理分析业务需求涉及的模块功能与数据库关联表接口开发文档大致编写并提交产品与APP开发人员 1.主要是webservise 地址:http://XXXX/services/SbcxWebservice?wsdl2.接口函数统一为 sbp_sbcx_XXX…

做APP接口开发过程总结

关于平湖人社APP后台开发总结 APP后台接口开发我总结出以下几个部分: 需求分析与整理 分析业务需求涉及的模块功能与数据库关联表 接口开发文档大致编写并提交产品与APP开发人员 1.主要是webservise 地址:http://XXXX/services/SbcxWebservice?wsdl 2.接口函数统一为 sbp_sbcx…

java性能优化案例——面试可能用得到

一、背景 1.1 业务背景 支付宝卡包存放着用户的会员卡和优惠券。无论是卡券cell&#xff0c;还是卡券详情&#xff0c;都是通过静态模板配置加上动态可变数据&#xff0c;最终呈现给终端用户的。 下面【图1】展现了卡券数据在C端用户的展现形式&#xff0c;【图2】表示了C端…

Java性能优化可算是讲明白了,优化权威指南就是强

在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。 Java是目前软件开发领域中使用最广泛的编程语言之一。Java应用程序在许多垂直领域&#xff08;银行、电信、医疗保…

面试官:关于Java性能优化,你有什么技巧

通过使用一些辅助性工具来找到程序中的瓶颈&#xff0c;然后就可以对瓶颈部分的代码进行优化。 一般有两种方案&#xff1a;即优化代码或更改设计方法。我们一般会选择后者&#xff0c;因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能…

JAVA性能优化思路探究,让程序超顺畅

1、背景介绍 一个系统的上线除了常规的功能性测试外&#xff0c;还需要经过严格的性能测试&#xff0c;满足预期的性能指标&#xff08;常见的有响应时间&#xff0c;tps等&#xff09;&#xff0c;才允许上生产环境。 广义的性能测试一般还包含负载测试&#xff08;用于测试…

Java接口性能优化实例

Java接口性能优化实例 文章目录 Java接口性能优化实例概述用到的工具和环境工具环境 找瓶颈启示和收获 概述 最近公司的下单接口有些慢&#xff0c;老板担心无法支撑双11&#xff0c;想让我优化一把&#xff0c;但是前提是不允许大改&#xff0c;因为下单接口太复杂了&#xf…

JAVA程序性能优化

制约程序性能的根源 常用的性能评估指标 并发&#xff1a;同一时间多少请求访问&#xff1a;如同一时间10个用户请求&#xff0c;并发就是10TPS&#xff1a;transaction per second&#xff1a;相当于写操作QPS&#xff1a;query per second&#xff1a;相当于读请求&#xf…

Java性能优化的35个细节(珍藏版)

代码优化&#xff0c;一个很重要的课题。可能有些人觉得没用&#xff0c;一些细小的地方有什么好修改的&#xff0c;改与不改对于代码的运行效率有什么影响呢&#xff1f;这个问题我是这么考虑的&#xff0c;就像大海里面的鲸鱼一样&#xff0c;它吃一条小虾米有用吗&#xff1…

Java 中 10 大简单的性能优化

Java 7 ForkJoinPool和 Java 8 的并行Stream有助于并行化东西&#xff0c;这在您将 Java 程序部署到多核处理器机器上时非常有用。与跨网络上的不同机器进行扩展相比&#xff0c;这种并行性的优势在于您几乎可以完全消除延迟效应&#xff0c;因为所有内核都可以访问相同的内存。…

Java性能优化的七个方向

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 概述复用优化计算优化并行执行变同步为异步惰性加载 结果集优化资源冲…

JAVA性能优化实例

目录 概述 Sql性能优化 多线程 利用内存缓存 功能优化 参考博客 概述 性能优化的几个点&#xff0c;大致可以分为&#xff1a; sql优化使用多线程利用内存&#xff0c;缓存等&#xff0c;将固定不常更改的数据放入在&#xff0c;存取更快的内存当中功能实现逻辑优化 Sql性…

10种简单的Java性能优化学习

10种简单的Java性能优化学习 你是否正打算优化hashCode()方法&#xff1f;是否想要绕开正则表达式&#xff1f;Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧。 最近“全网域&#xff08;Web Scale&#xff09;”一词被炒得火热&#xff0c;人们也正在…