一、原理

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

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. SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP. S ...

  2. 糖果大战 hdu1204

    糖果大战 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. HDU-2222文字检索

    题目: In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiske ...

  4. java数据库编程之事务、视图、索引、备份、恢复

    第五章:事务.视图.索引.备份和恢复 5.1:事务 事务的概念:事务(transcation)是讲一系列数据操作捆绑成为一个整体进行统计管理. 如果某一事务执行成功了,则该事务进行操作的所有数据将会提 ...

  5. Oracle Database 10g Express Edition系统文件损坏的解决办法

    1.检查错误代码:ora-10010 亦或是ora-10003,上网找响应的解决办法: 异常状态:登陆不上 常用的方法解决 (1)进入Oracle命令行模式 (2)Shutdown immedaite ...

  6. PHP字符串替换str_replace()函数4种用法详解

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )该函数返回一个字符串 ...

  7. c# xml操作类 比较齐全

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  8. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...

  9. Android 双击退出程序实现(有侧滑界面)

    大家好,今天带来双击退出程序实现方法,我知道,网上也是有许多关于双击退出程序实现的方法,所以,听见当然是给大家带来不一样的双击退出的实现方法. 首先带来的便是关于onKeyDown和onKeyPres ...

  10. javaScript基础的基础

    JavaScript是一个脚本语言,需要有宿主文件,他的宿主文件是HTML文件. 与JAVA没有直接关系 一般写在 1.head里面 2.body里面 3.</html>后面 一般写在&l ...