本问只简要讲解在JAVA中如何使用几种加密的代码示例,关于加密算法和数学知识不在本文讨论范围。
package com.util;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
/**
* 常见的一些加密方式JAVA实现
*
* @author Administrator
*
*/
public class EncryptionUtil {
/**
* MD5 加密
*/
public static String getMD5(String str) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());
String substring = new BigInteger(1, md.digest()).toString(16).substring(8, 24);
return substring;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
/*
* 利用sha1加密
*
*/
public static String getSha1(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
/**
* 使用java8版本base64编码
*
* @param str
* @return
*/
public static void getBase64(String str) {
Base64.Decoder decoder = Base64.getDecoder();
Base64.Encoder encoder = Base64.getEncoder();
try {
byte[] textByte = str.getBytes("UTF-8");
// 编码
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
// 解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* HmacSHA1加密
*
* @param data
* @param key
* @return
*/
public static String hamcsha1(byte[] data, byte[] key) {
try {
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
return byte2hex(mac.doFinal(data));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return null;
}
/**
* 将HmacSHA1加密之后的内容转换为字符串
*
* @param b
* @return
*/
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toUpperCase();
}
}
以上几种加密都是非对称加密,MD5一般使用场景是:密码加密、软件校对是否已修改过、获得指定长度的随机数 等.SHA1和MD5差不多,只是算法不太一样,HMAC一般防止伪造消息