文章目录
一、Base64
介绍
对称加密。其实是一种编码格式,而非加密算法。
会将8位的非英语字符转化为7位的ASCII字符。Base64编码后的文本,会比原文本大出三分之一左右。BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充
java实现
早期实现:
BASE64Encoder encoder = new BASE64Encoder();
BASE64Decoder decoder = new BASE64Decoder();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = encoder.encode(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));
Apache Commons Codec实现:
Base64 base64 = new Base64();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = base64.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(base64.decode(encodedText), "UTF-8"));
java8实现:
Base64.Decoder decoder = Base64.getDecoder();
Base64.Encoder encoder = Base64.getEncoder();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
Java 8提供的Base64拥有更好的效能。
用途
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
二、单向加密
介绍
又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。
MD5(Message Digest algorithm 5,信息摘要算法)
介绍
用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
实现
Java实现 1 (新版本的jar包已失效):
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
import org.apache.commons.codec.binary.Hex;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
实现 2 :
private static String MD5encode(String password) {
try {
//得到一个信息摘要器
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(password.getBytes());
StringBuffer buffer = new StringBuffer();
//把每一个byte做一个与运算0xff
for(byte b:result) {
int number = b & 0xff;
String str = Integer.toHexString(number);
if(str.length() == 1) {
buffer.append("0");
}
buffer.append(str);
}
//标准的MD5加密后的结果
return buffer.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
用途
常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值
SHA(Secure Hash Algorithm,安全散列算法)
介绍
对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
实现
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
public class SHA256Utils {
/**
* 利用java原生的摘要实现SHA256加密
* @param str 加密后的报文
* @return
*/
public static String getSHA256StrJava(String str){
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
encodeStr = byte2Hex(messageDigest.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodeStr;
}
/**
* 将byte转为16进制
* @param bytes
* @return
*/
private static String byte2Hex(byte[] bytes){
StringBuffer stringBuffer = new StringBuffer();
String temp = null;
for (int i=0;i<bytes.length;i++){
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length()==1){
//1得到一位的进行补0操作
stringBuffer.append("0");
}
stringBuffer.append(temp);
}
return stringBuffer.toString();
}
}
用途
主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
HMAC(Hash Message Authentication Code,散列消息鉴别码)
介绍
基于密钥的Hash算法的认证协议。原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。
分类
算法种类 | 摘要长度 |
---|---|
HmacMD5 | 128 |
HmacSHA1 | 160 |
HmacSHA256 | 256 |
HmacSHA384 | 384 |
HmacSHA512 | 512 |
实现
JDK实现:
package HMAC;
/**
* @description:
* @author: lv
* @time: 2020/8/8 11:23
*/
import java.nio.charset.Charset;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class JdkHmacUtils {
// 获取 HmacMD5 Key
public static byte[] getHmacMd5Key() {
return getHmacKey("HmacMD5");
}
// 获取 HmacSHA256
public static byte[] getHmacSha256Key() {
return getHmacKey("HmacSHA256");
}
// 获取 HmacSHA512
public static byte[] getHmacSha512Key() {
return getHmacKey("HmacSHA512");
}
// 获取 HMAC Key
public