一、原理

验证码其实就是随机串。原理上可分为两种:

1.简单的验证码

直接通过字母和数字的ASCII码生成。本文采用的验证码就是这种。

2.复杂的验证码

通过一个随机串,一个指定串(如accesskey),和当前时间来进行验证码的生成,期间还经过SHA1加密。如网易云信的短信验证码生成器:

CheckSumBuilder.java

package com.ray.im.util;

import java.security.MessageDigest;

/**@desc  : 验证码生成工具
*
* @author: shirayner
* @date : 2017年9月26日 下午4:28:15
*/
public class CheckSumBuilder {
// 1.计算并获取CheckSum
public static String getCheckSum(String appSecret, String nonce, String curTime) {
return encode("sha1", appSecret + nonce + curTime);
} // 2.计算并获取md5值
public static String getMD5(String requestBody) {
return encode("md5", requestBody);
} // 3.根据加密方式进行加密
private static String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest
= MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}

二、代码

1.CheckSumBuilder—验证码生成器

package com.ray.sms.aliyun.util;

import java.util.Random;

/**@desc  : 验证码工具类
*
* @author: shirayner
* @date : 2017年11月7日 上午10:07:46
*/
public class CheckSumBuilder { /**
* @desc :1.随机产生字符串
*
* @param length 字符串长度
* @param type 类型 (0: 仅数字; 2:仅字符; 别的数字:数字和字符)
* @return
* String 随机串
*/
public static String getRandomStr(int length, int type){
String str = "";
int beginChar = 'a';
int endChar = 'z'; // 只有数字
if (type == 0){
beginChar = 'z' + 1;
endChar = 'z' + 10;
}
// 只有小写字母
else if (type == 2){
beginChar = 'a';
endChar = 'z';
}
// 有数字和字母
else{
beginChar = 'a';
endChar = 'z' + 10;
} // 生成随机类
Random random = new Random();
for (int i = 0; i < length; i++){
int tmp = (beginChar + random.nextInt(endChar - beginChar));
// 大于'z'的是数字
if (tmp > 'z'){
tmp = '0' + (tmp - 'z');
}
str += (char) tmp;
} return str;
} /**
* @desc :2.获取6位数字验证码
*
* @return
* String 6位数字验证码
*/
public static String getCheckSum() {
return getRandomStr(6, 0);
} }

2.CheckSumBuilderTest—测试类

package com.ray.sms.aliyun.util;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test; /**@desc :
*
* @author: shirayner
* @date : 2017年11月7日 上午9:50:33
*/
public class CheckSumBuilderTest {
private static final Logger logger = LogManager.getLogger(CheckSumBuilderTest.class); @Test
public void testGetCheckSum() {
int len=100000;
String checkSum=null; for(int i=0;i<len;i++) {
checkSum= CheckSumBuilder.getCheckSum();
logger.info("checkSum:"+checkSum);
} } }

三、参考资料

1.http://bbs.csdn.net/topics/391946551

2.网易云服务器端API文档  (请参见   API checksum校验   这一部分)

JavaUtil_04_验证码生成器的更多相关文章

  1. VB编写的验证码生成器

    验证码(CAPTCHA)是“Completely AutomatedPublicTuring test to tell Computers andHumansApart”(全自动区分计算机和人类的图灵 ...

  2. 验证码生成器(在TImage.Canvas上写字,很好看)

    生成验证码的方式有很多种,如下则是比较简单的实现,且运用了正余弦曲线来扭曲验证码字符. unit AuthenticodeGenerate; interface uses SysUtils, Wind ...

  3. java实现一个简单的验证码生成器

    最近看了网上很多大佬们写的验证码生成,寻思着自己也写一个,话不多说,代码如下: import java.awt.BasicStroke; import java.awt.Color; import j ...

  4. 【转】TensorFlow练习20: 使用深度学习破解字符验证码

    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册.灌水.发垃圾广告等等 . 验证码的作用是验证用户是真人还是机器人:设计理念是对人友好,对机 ...

  5. 不使用session,借助redis实现验证码

    1.首先看一下基本的流程 2.看一下代码 注:其中用到的一些工具类,可以到我的github上去下载  https://github.com/hjzgg/usually_util/tree/master ...

  6. extjs ajax java简单精美验证码实现 有图

    前端:利用ExtJs的autoEl功能加载图片. var imgCheckValid = new Ext.create('Ext.Component',{ width: 70, //图片宽度 heig ...

  7. java 验证码

    package lizikj.bigwheel.pcsystem.util;import javax.imageio.ImageIO; import java.awt.*; import java.a ...

  8. 自己封装的一个java图片验证码

    验证码生成器: package com.lz.Tools; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...

  9. Sping mvc 环境下使用kaptcha 生成验证码

    一.kaptcha 的简介 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kap ...

随机推荐

  1. 详解AngularJS中的依赖注入

    点击查看AngularJS系列目录 依赖注入 一般来说,一个对象只能通过三种方法来得到它的依赖项目: 我们可以在对象内部创建依赖项目 我们可以将依赖作为一个全局变量来进行查找或引用 我们可以将依赖传递 ...

  2. jQuery: Callbacks

    jQuery 中提供了一个Callback的工具类Callbacks,它提供了一个Callback Chain.使用它可以在一个chain上来执行相关操作.它也是jQuery中的ajax, Defer ...

  3. Gaussian and Truncated Gaussian

    Everybody knows about Gaussian distribution, and Gaussian is very popular in Bayesian world and even ...

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...

  5. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  6. 想到一个赚钱的APP

    通过APP上发布调查问卷的需求,鼓励人们注册,并给与一定的报酬.需求主要面向一些调查问卷,一类的需求发布

  7. C#程序员应该养成的程序性能优化写法

    转载一个别人的文章 隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒…… 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对 ...

  8. Python实战之实现简单的购物车系统

    #!usr/bin/env Python3 # -*-coding:utf-8-*- # 程序:购物车程序 # # 需求: # # 启动程序后,让用户输入工资,然后打印商品列表 # 允许用户根据商品编 ...

  9. python读取命令行参数的方法

    1.sys模块 需要模块:sys参数个数:len(sys.argv)脚本名:    sys.argv[0]参数1:     sys.argv[1]参数2:     sys.argv[2] test.p ...

  10. 用html+css+js做打地鼠小游戏

    html 代码 first.html <!DOCTYPE html> <html lang="en"> <head> <meta char ...