什么是MD5
md5(message digest Algorithm)信息摘要。
旨在通过对任意字符转成固定长度的加密算法
算法原理
算法原理:对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448
,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512
,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
MD5加密工具
/**
* 计算字符串MD5值
*
* @param string
* @return
*/
public static String md5(String string) {
if (string == null || string.equals("")) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(string.getBytes());
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
/**
* 采用nio的方式,计算文件的 MD5 值
*
* @param file
* @return
*/
public static String md5Nio(File file) {
String result = "";
FileInputStream in = null;
try {
in = new FileInputStream(file);
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
byte[] bytes = md5.digest();
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 对字符串多次MD5加密
*
* @param string
* @param times
* @return
*/
public static String md5(String string, int times) {
if (string == null || string.equals("")) {
return "";
}
String md5 = md5(string);
for (int i = 0; i < times - 1; i++) {
md5 = md5(md5);
}
return md5(md5);
}
/**
* MD5加盐
* <p>
* 加盐的方式也是多种多样
* <p>
* string+key(盐值key)然后进行MD5加密
* <p>
* 用string明文的hashcode作为盐,然后进行MD5加密
* 随机生成一串字符串作为盐,然后进行MD5加密
*
* @param string
* @param slat
* @return
*/
public static String md5(String string, String slat) {
if (string == null || string.equals("")) {
return "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest((string + slat).getBytes());
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
测试
public static void main(String[] args) {
System.out.println(md5("徐智祥"));
}
在解密网站中,应该是存储了大量的明文密码和对应的加密字符串 ,因此可以快速解密 , 但实际上复杂点的密码无法解密。