java md5 salt_Java MD5加密工具类

这是一个用于小项目登录密码验证的MD5加密工具类,包含加密和验证口令的方法。通过SecureRandom生成盐,结合MD5算法进行加密,确保密码的安全存储。在验证时,提取盐值并重新计算消息摘要,对比数据库中存储的加密口令,实现口令的合法性检查。
摘要由CSDN通过智能技术生成

分享一个MD5加密的工具类,可以当作小项目的登录密码验证模块。

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Arrays;

/**

* MD5加密工具类

*/

public class MD5Util {

private static final String HEX_NUMS_STR = "0123456789ABCDEF" ;

private static final Integer SALT_LENGTH = 12;

/**

* 将 16 进制字符串转换成字节数组

* @param hex

* @return

*/

private 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

*/

private 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();

}

/**

* 获得加密后的 16 进制形式口令

* @param password

* @return

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException

*/

public static String getEncryptedPwd(String password)

throws NoSuchAlgorithmException, UnsupportedEncodingException {

// 声明加密后的口令数组变量

byte[] pwd = null;

// 随机数生成器

SecureRandom random = new SecureRandom();

// 声明盐数组变量

byte[] salt = new byte[SALT_LENGTH];

// 将随机数放入盐变量中

random.nextBytes(salt);

// 声明消息摘要对象

MessageDigest md = null;

// 创建消息摘要

md = MessageDigest.getInstance("MD5");

// 将盐数据传入消息摘要对象

md.update(salt);

// 将口令的数据传给消息摘要对象

md.update(password.getBytes("UTF-8"));

// 获得消息摘要的字节数组

byte[] digest = md.digest();

// 因为要在口令的字节数组中存放盐,所以加上盐的字节长度

pwd = new byte[digest.length + SALT_LENGTH];

// 将盐的字节拷贝到生成的加密口令字节数组的前 12 个字节,以便在验证口令时取出盐

System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);

// 将消息摘要拷贝到加密口令字节数组从第 13 个字节开始的字节

System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);

// 将字节数组格式加密后的口令转化为 16 进制字符串格式的口令

return byteToHexString(pwd);

}

/**

* 验证口令是否合法

* @param password

* @param passwordInDb

* @return

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException

*/

public static boolean validPassword(String password, String passwordInDb){

try {

// 将 16 进制字符串格式口令转换成字节数组

byte[] pwdInDb = hexStringToByte(passwordInDb);

// 声明盐变量

byte[] salt = new byte[SALT_LENGTH];

// 将盐从数据库中保存的口令字节数组中提取出来

System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);

// 创建消息摘要对象

MessageDigest md = MessageDigest.getInstance("MD5");

// 将盐数据传入消息摘要对象

md.update(salt);

// 将口令的数据传给消息摘要对象

md.update(password.getBytes("UTF-8"));

// 生成输入口令的消息摘要

byte[] digest = md.digest();

// 声明一个保存数据库中口令消息摘要的变量

byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];

// 取得数据库中口令的消息摘要

System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0,digestInDb.length);

// 比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同

if (Arrays.equals(digest, digestInDb)) {

// 口令正确返回口令匹配消息

return true;

} else {

// 口令不正确返回口令不匹配消息

return false;

}

} catch (Exception e) {

new Exception("数据库中保存的密码,没有进行MD5加密,数据非常不安全,请尽快加密!").printStackTrace();

return false;

}

}

public static void main(String[] args) throws NoSuchAlgorithmException,

UnsupportedEncodingException {

System.out.println(getEncryptedPwd("123456"));

System.out.println(validPassword("123456","21166B5071425AED9C296696F55D7C86B22CAE9A9324F8F540320BBC"));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值