Java中MD5加密
1.简介
MD5是Message-Digest Algorithm 5简称,即信息-摘要算法5,主要应用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一(又被称为摘要算法、哈希算法),主流编程语言普遍已有MD5算法的实现,他是将数据运算为另一固定长度值,是杂凑算法的基础原理。是使用little-endian(小端模式),输入任意不定长度信息,以 512-bit 进行分组,生成四个32-bit 数据,最后联合输出固定 128-bit 的信息摘要。MD5 算法的基本过程为:填充、分块、缓冲区初始化、循环压 缩、得出结果。
2.特点
2.1 完全相同的一段数据,不论时间地点(加密算法相同的条件)加密出的32位的字符串完全相同;
2.2 加密过程本身就是一个有损的加密过程。因此几乎不能还原出原始数据;
2.3 散列能力强。
3.MD5加密的方式和方法
MD5加密分为16位、32位大写、32位小写、64位大写、64位小写等几种方式。
MD5加密后所得到的通常是32位的编码,而在一些地方会用到16位、64位的编码,那么它们都有什么区别呢?比如16位和32位加密,16位加密就是从32位MD5散列中把中间16位提取出来的,所以破解16位MD5散列要比破解32位MD5散列还慢,那是因为他多了一个步骤就是使用32位加密后再把中间16位提取出来, 然后再进行对比,而破解32位的则不需要这个过程,加密后直接对比就可以解密成功。
16位小写加密后生成的字符串:7e57a5a742294f1e
32位小写加密后生成的字符串:22162f297e57a5a742294f1e2a312f12
3.1 java MD5加密32位小写方法
/**
* md5加密 32位 小写
* @param plainText
* @return
*/
public static String encryption(String plainText) {
String re_md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
re_md5 = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return re_md5;
}
3.2 通用16位、32位、64位大小写的MD5工具类
import java.security.MessageDigest;
import sun.misc.BASE64Encoder;
public class MD5Util {
/**
*
* @param pwd
* 需要加密的字符串
* @param type
* 字母大小写(false为默认小写,true为大写)
* @param bit
* 加密的类型(16,32,64)
* @return
*/
public static String getMD5(String pwd, boolean isUpper, Integer bit) {
String md5 = new String();
try {
// 创建加密对象
MessageDigest md = MessageDigest.getInstance("md5");
if (bit == 64) {
BASE64Encoder bw = new BASE64Encoder();
String bsB64 = bw.encode(md.digest(pwd.getBytes("utf-8")));
md5 = bsB64;
} else {
// 计算MD5函数
md.update(pwd.getBytes());
byte b[] = md.digest();
int i;
StringBuffer sb = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
sb.append("0");
sb.append(Integer.toHexString(i));
}
md5 = sb.toString();
if(bit == 16) {
//截取32位md5为16位
String md16 = md5.substring(8, 24).toString();
md5 = md16;
if (isUpper)
md5 = md5.toUpperCase();
return md5;
}
}
//转换成大写
if (isUpper)
md5 = md5.toUpperCase();
} catch (Exception e) {
e.printStackTrace();
System.out.println("md5加密抛出异常!");
}
return md5;
}
public static void main(String[] args) throws Exception {
String a = "123";
String md5a = getMD5(a, true, 16);
System.out.println(md5a);
System.out.println(md5a.length());
}
}
- 点赞
- 收藏
- 关注作者
评论(0)