import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Scanner;
public class MD5{
private static final String HEX_NUMS_STR="0123456789ABCDEF";
private static final Integer SALT_LENGTH = 12;
/**
* 将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++) {
//0XFF表示十进制的255,其中0X是java中用来申明16进制字符使用的,此时表示取当前字节的反码
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 sourceString)
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(sourceString.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 sourceString, String md5String)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
//将16进制字符串格式口令转换成字节数组
byte[] pwdInDb = hexStringToByte(md5String);
//声明盐变量
byte[] salt = new byte[SALT_LENGTH];
//将盐从数据库中保存的口令字节数组中提取出来
System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);
//创建消息摘要对象
MessageDigest md = MessageDigest.getInstance("MD5");
//将盐数据传入消息摘要对象
md.update(salt);
//将口令的数据传给消息摘要对象
md.update(sourceString.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;
}
}
public static void main(String[] args){
System.out.println("-----------------MD5加密 start--------------------");
try {
System.out.print("-----------------请输入您要加密的内容按enter键后执行:");
Scanner scanner = new Scanner(System.in);
String sourceString = scanner.nextLine();
String md5String = getEncryptedPwd(sourceString);
System.out.println("----------加密前:"+sourceString);
System.out.println("----------加密后:"+md5String);
boolean falg = validPassword(sourceString,md5String);
System.out.println("----------输入字符串校验结果:"+falg);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-----------------MD5加密 end--------------------");
}
}
分享到:
相关推荐
MD5算法源代码,java类型的,实此程序现了md5算法,能正确运行!
java与c#MD5加密方法得到不一致解决办法,MD5加密后得到不一致结果
java md5 加密后转为16进制
MD5加密,java String 转变成MD5 String 详细代码,工具类Android开发必备
Java Md5字符串加密类代码分享,MD5是一个比较常见的字符串加密算法,在JAVA中应用也相当普遍,这个MD5算法类或许可以直接套用,代码中的关键部分带有注释 ,方便您的使用和学习。需要使用MD5对字符串加密的,那就...
借鉴了网上各位大牛分享的md转html,有前端小伙伴的帮忙,共同研发出了一个小工具,将markdown文档转换成html,左右结构,左侧目录,右侧文档 请先阅读readme
Java后台用于对数据md5转base64加密处理的一个方法封装。简单的一个加密解密的封装,初学者用,大神勿喷
MD5主要是通过特定的hash散列方法将文本信息转换成简短的信息摘要,用以验证信息的完整性。一般用于数字签名。 用Java实现的一个例子。
java实现MD5加密源码,将一个任意长度得字符串转换为32位得字符串。
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。 当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的...
md5加密算法,字符串编码转换,静态方法实现
主要为大家详细介绍了基于Java语言的MD5加密Base64转换方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
太棒了 创建getMd5方法以获得userPwd的Md5值 byte类型数组的值转换为 byte类型的Md5值 将byte类型的Md5值转换为字符串 返回Md5字符串
该部分的代码实现在 ReadFile.java 中。首先一次性读取某文件的字节流并存储为 byte[],再通过 Long.toString 函数对字节数组的每一个 byte 元素转换为 01 字符串并添加到输出变量的尾端,并返回输出。转换为二进制...
将简书文档转换为word或者pdf,需要的插件,亲身试验感觉很不错
封装的功能:字符串从GBK编码转换为Unicode编码、对字符串进行md5加密、sql语句 处理、把null转换为字符串"0"、null 处理、long型变量转换成String型变量、int型变量转换成String型变量、String型变量转换成int型...
go语言好像没有原生封装RSA加密,正常的话好像需要下加载一个crypto的库,然后来回转换比较麻烦,然后这个脚本是直接通过算法封装了加密和解密两个方法,有需要的可以下载看看
MD5加密帮助类和汉字转为拼音的jar以及帮助类,有相应的测试方法,MD5Utils.java,PinYinUtils.java以及相关jar包
疑惑很久的c#的byte转到java的byte,C#MD5加密改换成java的MD5加密
wangEditor 等富文本内容 (含图片: base64格式、http的网络图片等) 转换成word java后端下载