`

密码工具类

阅读更多
package com.unionpay.bdpp.common.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;

/**
 * 生成一个固定位数的随机字符串,并加密,和用户密码加密后的密文组合
 * 
 */
public class PasswordUtil {

	// 16进制需要的字符串数据
	private static final String HEX_NUMS_STR = "0123456789ABCDEF";

	// 随机字符串字节数长度
	private static final Integer BYTE_LENGTH = 16;

	/**
	 * 将16进制字符串转换成字节数组
	 * 
	 * @param hex
	 * @return
	 */
	public static byte[] hexStringToByte(String hex) {
		int len = (hex.length() / 2);
		byte[] result = new byte[len];
		char[] hexChars = hex.toCharArray();
		for (int i = 0; i < len; i++) {
			int pos = i * 2;
			result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR
					.indexOf(hexChars[pos + 1]));
		}
		return result;
	}

	/**
	 * 将指定byte数组转换成16进制字符串
	 * 
	 * @param b
	 * @return
	 */
	public static String byteToHexString(byte[] b) {
		StringBuffer hexString = new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			String hex = Integer.toHexString(b[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			hexString.append(hex.toUpperCase());
		}
		return hexString.toString();
	}

	/**
	 * 验证口令是否合法
	 * 
	 * @param inputStr
	 * @param strWithRandom
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException
	 */
	public static boolean validPassword(String inputStr, String strWithRandom) {
		boolean flag = false;
		try {
			// 将16进制字符串格式口令转换成字节数组
			byte[] pwdInDb = hexStringToByte(strWithRandom);
			// 声明一个随机数组变量
			byte[] randomByte = new byte[BYTE_LENGTH];
			// 将随机数组从数据库中保存的口令字节数组中提取出来,按其长度
			System.arraycopy(pwdInDb, 0, randomByte, 0, BYTE_LENGTH);
			// 创建消息摘要对象
			MessageDigest md = MessageDigest.getInstance("MD5");
			// 将随机数组据传入消息摘要对象
			md.update(randomByte);
			// 将口令的数据传给消息摘要对象
			md.update(inputStr.getBytes("UTF-8"));
			// 生成输入口令的消息摘要
			byte[] digest = md.digest();
			// 声明一个保存数据库中口令消息摘要的变量
			byte[] digestInDb = new byte[pwdInDb.length - BYTE_LENGTH];
			// 取得数据库中口令的消息摘要
			System.arraycopy(pwdInDb, BYTE_LENGTH, digestInDb, 0,
					digestInDb.length);
			// 比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
			if (Arrays.equals(digest, digestInDb)) {
				// 口令正确返回口令匹配消息
				flag = true;
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return flag;
	}

	/**
	 * 获得加密后的16进制形式口令
	 * 
	 * @param password
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException
	 */
	public static String MD5(String password) {
		// 声明加密后的口令数组变量
		byte[] pwd = null;
		// 随机数生成器
		SecureRandom random = new SecureRandom();
		// 声明随机数组变量
		byte[] randomByte = new byte[BYTE_LENGTH];
		try {
			// 将随机数放入随机数组变量中
			//用随机数填充指定字节数组的元素。
			random.nextBytes(randomByte);

			// 声明消息摘要对象
			MessageDigest md = null;
			// 创建消息摘要
			md = MessageDigest.getInstance("MD5");
			// 将盐数据传入消息摘要对象
			md.update(randomByte);
			// 将口令的数据传给消息摘要对象
			md.update(password.getBytes("UTF-8"));
			// 获得消息摘要的字节数组
			byte[] digest = md.digest();

			// 因为要在口令的字节数组中存放随机数组密文,所以加上随机数组的字节长度
			pwd = new byte[digest.length + BYTE_LENGTH];
			// 将盐的字节拷贝到生成的加密口令字节数组的前相应该长度BYTE_LENGTH个字节,以便在验证口令时取出随机数组
			System.arraycopy(randomByte, 0, pwd, 0, BYTE_LENGTH);
			// 将消息摘要拷贝到加密口令字节数组从第BYTE_LENGTH个字节开始的字节
			System.arraycopy(digest, 0, pwd, BYTE_LENGTH, digest.length);
			// 将字节数组格式加密后的口令转化为16进制字符串格式的口令
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		if (pwd != null) {
			return byteToHexString(pwd);
		}

		return null;
	}

}
分享到:
评论

相关推荐

    JavaDES、MD5密码工具类

    这个"JavaDES、MD5密码工具类"的jar包包含源代码,意味着开发者可以查看并理解其中的实现细节。通常,这样的工具类会封装好加密和解密的流程,提供简洁的API供调用。例如,可能有一个静态方法`encrypt(String plain...

    JAVA发送邮件重置密码工具类

    getDigitalSignature方法:返回用户信息中的邮件验证密钥,用于和邮件链接中的密钥做比对。...sendRestPwdEmail方法:发送重置密码邮件。用户注册激活邮件流程基本类似,有兴趣的朋友可以自己尝试写一个激活方法。

    腾讯优图-图片扫描,获取卡号和密码工具类

    "腾讯优图-图片扫描,获取卡号和密码工具类"就是这样一个专门的解决方案,它结合了腾讯优图强大的图像处理和模式识别能力,帮助开发者在图片中高效准确地提取关键信息。 腾讯优图是腾讯公司旗下专注于计算机视觉研究...

    使用Shiro的SimpleHash加密密码工具类.docx

    绝大多数网站中的用户密码使用MD5加密后保存到数据库中,如果采用弱密码,例如:123456、admin等,有太多的MD5穷举网站可以获取到密码的MD5值,这个时候我们有必要改进密码加密机制!

    史上最全的Java工具类

    史上最全的Java工具类,包括http访问,发送短信验证码,拼音转孩子,android图片压缩,...日期生成,相对日期生成,字符串工具类,android sharepreferences工具类,android Toast工具类, android sqlite工具类等等。

    生产随机密码工具

    随机生成6位数字密码 并记录在同目录下新建文本文档内

    jaava和jsp工具类

    [工具类] 成各种密码随机串,加密解密,编码解码,执行url.java [工具类] 读取、打印输出、保存xml .java [工具类] 获得汉字拼音首字母的java工具类 .java [工具类] 获取绝对路径 .java [工具类] 记录log日志...

    Rabbitmq工具类,java工具类RabbitmqUtil

    `RabbitmqUtil` 是一个专门为Java开发者设计的工具类,简化了与RabbitMQ交互的复杂过程,使得开发者能够更快速、更方便地发送和接收消息。 首先,我们来详细了解一下`RabbitmqUtil`工具类的主要功能: 1. **连接...

    随机密码生成器

    随风随机密码生成器是一个简单的随机密码生成工具。 随风随机密码生成器使用说明: 1.密码可以是“数字,字母,符号”任意组合 2.可生成5到100位密码!满足大多应用!可以选加Id! 3.可一次生成999万个密码!生成...

    一些工具类的整合

    在IT行业中,工具类的整合是一项非常重要的工作,它能够帮助开发者提高效率,减少重复代码,使得项目更加整洁和高效。本主题主要聚焦于“一些工具类的整合”,包括MD5加密、URL编码与解码以及网络辅助工具等多个方面...

    java sm2国密工具类

    Java SM2 国密工具类是用于实现中国国家商用密码算法SM2的编程工具,它在Java环境中提供了加密、解密、签名以及验签等安全功能。SM2算法是中国密码学的重要组成部分,主要用于保障数据传输的安全性和身份认证的可靠...

    java生成随机密码

    通过以上分析可以看出,Java提供的工具和API足以实现一个功能完善的随机密码生成器。开发者可以根据具体的应用场景调整字符集、密码长度等参数,以满足不同级别的安全需求。同时,考虑到性能和安全性之间的权衡也是...

    java mail工具类

    这个工具类的创建旨在简化邮件处理的复杂性,使开发者能够便捷地集成邮件功能。以下是对JavaMail工具类及其相关知识点的详细说明: 1. **JavaMail API**: JavaMail API 是Java平台上的标准邮件接口,提供了发送、...

    WiFi密码查看器

    WiFi密码查看器(android,安卓)是一款查看手机无线密码的工具,如果您曾经在本机连接过无线网络,但是密码忘记的话,它能将你手机连接过的所有无线网络的密码全部显示出来,以便你轻松找回之前使用过的WiFi密码,不过...

    常用Java工具类

    MD5工具类通常封装了这个过程,提供简单的接口用于字符串或文件的MD5加密,常用于数据校验和密码存储。 3. **文件上传工具类**:文件上传是Web应用中的常见功能,Java提供了Servlet API来处理文件上传请求。Apache...

    Spring boot工具类静态属性注入及多环境配置详解

    Spring Boot工具类静态属性注入及多环境配置详解 Spring Boot工具类静态属性注入是指使用Spring Boot框架时,如何将配置信息注入到工具类的静态变量中,以便在程序中使用这些配置信息。这种方式可以方便地在不同的...

    jdbc 工具类、帮助类

    7. **配置灵活性**:工具类应支持通过配置文件或构造函数传递数据库连接信息,如URL、用户名、密码等,以适应不同环境的需求。 8. **性能优化**:工具类可能会包含一些性能优化策略,如设置合适的超时时间、自动...

    MapUtils工具类,轻松转换map数据与实体类

    `MapUtils`工具类就是为了解决这样的问题而设计的,它简化了`Map`对象和实体类之间的转换过程。本篇文章将深入探讨`MapUtils`工具类的使用及其在Java开发中的重要性。 首先,让我们了解一下实体类。在Java中,实体...

    Redis C# 工具类

    在C#开发中,我们经常需要创建工具类来方便地操作Redis。`Redis C# 工具类`是这样的一个辅助类库,它封装了对Redis的各种基本操作,包括Key、String、Set、SortSet和List等数据结构的管理。 首先,`Cache.config`...

    30个java工具类

    9. **MD5加密工具类(.java.txt)**:MD5是一种常用的哈希算法,用于数据的完整性校验和密码存储。这里有两个版本,可能是普通版和加强版,加强版可能增加了对字符串编码的支持或者优化了性能。 这些工具类的使用,...

Global site tag (gtag.js) - Google Analytics