介绍:
MD5:一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致,是一种不可逆的摘要算法,用于生成摘要,无法逆破解到原文。
Base64:是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息,是可逆的,经过Encode后,可以将Decode转化为原文。在开发中,有的公司上传图片采用的是将图片转换成Base64字符串,再上传。在做加密相关的功能时,通常会将数据进行Base64加密/解密。
下面是用Java实现简单的MD5 和base64 的加密 解密 验证,原理是:先撒盐,使 原密码+盐 生成一个新的字符串,然后对这个新的字符串进行MD5加密,或者base64加密,当然这只是简单的一种实现,实际开发中可以采用多次撒盐和多次MD5,或者base64加密的方式来进行编码。
1.工具类如下:
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
/**
* @Auther :
* @Date : 2019/5/21 14:26
* @Description : 加密解密通用类
*/
public class EncryptUtils {
/**
* 获取一个文件的md5值(可处理大文件)
* @return md5值
*/
public static String getFileMd5(File file) {
FileInputStream fileInputStream = null;
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[8192];
int length;
while ((length = fileInputStream.read(buffer)) != -1) {
digest.update(buffer, 0, length);
}
return new String(Hex.encodeHex(digest.digest()));
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (fileInputStream != null){
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 求一个字符串的md5值
* @param text 字符串
* @return md5 value
*/
public static String md5(String text, String key) throws Exception {
// 加密后的字符串
String encodeStr= DigestUtils.md5Hex(text + key);
System.out.println("MD5---加密---后的字符串 encodeStr="+encodeStr);
return encodeStr;
}
/**
* base64 加密
* @param text
* @param key
* @return
* @throws UnsupportedEncodingException
*/
public static String base64(String text, String key) throws UnsupportedEncodingException {
byte[] textByte = text.getBytes("UTF-8");
final BASE64Encoder encoder = new BASE64Encoder();
final String encodeStr = encoder.encode(textByte);
System.out.println("BASE64---加密---后的字符串 encodeStr="+encodeStr);
return encodeStr;
}
/**
* base64 解密
* @param encodeStr
* @return
* @throws IOException
*/
public static String decoderBASE64(String encodeStr) throws IOException {
final BASE64Decoder decoder = new BASE64Decoder();
byte[] textByte = decoder.decodeBuffer(encodeStr);
String decoderStr = new String(textByte, "UTF-8");
System.out.println("BASE64---解密---后的字符串 decoderStr="+decoderStr);
return decoderStr;
}
/**
* MD5验证方法
*
* @param text 明文
* @param key 密钥
* @param md5 密文
* @return true/false
* @throws Exception
*/
public static boolean verify(String text, String key, String md5) throws Exception {
System.out.println("MD5验证开始==>\n新字符串为:"+text+",key为:"+key);
// 根据传入的密钥进行验证
String md5Text = md5(text, key);
System.out.println("原加密后的结果为:"+md5);
if(md5Text.equalsIgnoreCase(md5))
{
System.out.println("======MD5验证通过=====");
return true;
}
System.out.println("=====MD5验证不通过=====");
return false;
}
public static void main(String[] args) {
String mypassword = null;
try {
// MD5加密
mypassword = EncryptUtils.md5("123456", "sort");
// MD5验证
EncryptUtils.verify("123456", "sort",mypassword);
// base64加密
String encodeStr = EncryptUtils.base64("123456", "sort");
// base64解密
EncryptUtils.decoderBASE64(encodeStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}