Java 的 Base64、消息摘要算法加密
常用术语
- 明文:待加密信息
- 密文:经过加密后的明文
- 加密:明文转为密文的过程
- 加密算法:明文转为密文的转换算法
- 加密密钥:通过加密算法进行加密操作的密钥
- 解密:密文转为明文的过程
- 解密算法:密文转为明文的转换算法
- 解密密钥:通过解密算法进行解密操作的密钥
- 柯克霍夫原则:数据的安全基于密钥而不是算法的保密
密码分类
名称 | 别名 | 详细说明 |
---|
对称密码 | 单钥密码或私钥密码 | 指加密密钥与解密密钥相同 |
非对称密码 | 双钥密码或公钥密码 | 指加密密钥与解密密钥不同,密钥分公钥、私钥 |
Base64 算法
- 明文:
Hello LeifChen
- Base64 密文:
SGVsbG8gTGVpZkNoZW4=
1 JDK 实现 Base64
import sun.misc.BASE64Encoder;
public class Base64Utils {
public static String jdkBase64(String str) {
return new BASE64Encoder().encode(str.getBytes());
}
}
2 Commons Codec 实现 Base64
implementation 'commons-codec:commons-codec:1.11'
import org.apache.commons.codec.binary.Base64;
public class Base64Utils {
public static String commonsCodecBase64(String str) {
return new String(Base64.encodeBase64(str.getBytes()));
}
}
3 Bouncy Castle 实现 Base64
implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
import org.bouncycastle.util.encoders.Base64;
public class Base64Utils {
public static String bouncyCastleBase64(String str) {
return new String(Base64.encode(str.getBytes()));
}
}
消息摘要算法
- 明文:
Hello LeifChen
- MD5 密文:
7a0b5a39272461d7ddfb6bc26be03225
- SHA-1 密文:
3a0f53933e985d95fc72ab913f1aa267231ee7eb
- SHA-224 密文:
499d695fd99fc87f40a3b4c53dcc29627c86d5983345ec482b1ffc5b
- HmacMD5 密文(key = “aa”):
e192f1b893eacc32247cdaeb9a5bbe9c
1 MD(Message Digest)
算法 | 摘要长度 | 实现方 |
---|
MD2 | 128 | JDK |
MD4 | 128 | Bouncy Castle |
MD5 | 128 | JDK |
- MD 应用
![MD](https://img-blog.csdnimg.cn/20181129164609205.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlaWZjaGVuOTA=,size_16,color_FFFFFF,t_70)
1.1 JDK 实现 MD5
import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MessageDigestUtils {
public static String jdkMD5(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return Hex.encodeHexString(md.digest(str.getBytes()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
1.2 Commons Codec 实现 MD5
import org.apache.commons.codec.digest.DigestUtils;
public class MessageDigestUtils {
public static String commonsCodecMD5(String str) {
return DigestUtils.md5Hex(str);
}
}
1.3 Bouncy Castle 实现 MD5
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.util.encoders.Hex;
public class MessageDigestUtils {
public static String bouncyCastleMD5(String str) {
Digest digest = new MD5Digest();
digest.update(str.getBytes(), 0, str.getBytes().length);
byte[] md5Bytes = new byte[digest.getDigestSize()];
digest.doFinal(md5Bytes, 0);
return Hex.toHexString(md5Bytes);
}
}
2 SHA(Secure Hash Algorithm)
算法 | 摘要长度 | 实现方 |
---|
SHA-1 | 160 | JDK |
SHA-224 | 224 | Bouncy Castle |
SHA-256 | 256 | JDK |
SHA-384 | 384 | JDK |
SHA-512 | 512 | JDK |
- SHA 应用
![SHA](https://img-blog.csdnimg.cn/20181129164727114.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlaWZjaGVuOTA=,size_16,color_FFFFFF,t_70)
2.1 JDK 实现 SHA-1
import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MessageDigestUtils {
public static String jdkSHA1(String str) {
try {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(str.getBytes());
return Hex.encodeHexString(md.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
2.2 Commons Codec 实现 SHA-1
import org.apache.commons.codec.digest.DigestUtils;
public class MessageDigestUtils {
public static String commonsCodecSHA1(String str) {
return DigestUtils.sha1Hex(str);
}
}
2.3 Bouncy Castle 实现 SHA-1
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.util.encoders.Hex;
public class MessageDigestUtils {
public static String bouncyCastleSHA1(String str) {
Digest digest = new SHA1Digest();
digest.update(str.getBytes(), 0, str.getBytes().length);
byte[] sha1Bytes = new byte[digest.getDigestSize()];
digest.doFinal(sha1Bytes, 0);
return Hex.toHexString(sha1Bytes);
}
}
2.4 Bouncy Castle 实现 SHA-224
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
public class MessageDigestUtils {
public static String bouncyCastleSHA224(String str) {
Security.addProvider(new BouncyCastleProvider());
try {
MessageDigest md = MessageDigest.getInstance("SHA224");
md.update(str.getBytes());
return Hex.encodeHexString(md.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3 MAC(Message Authentication Code)
算法 | 摘要长度 | 实现方 |
---|
HmacMD2 | 128 | Bouncy Castle |
HmacMD4 | 128 | Bouncy Castle |
HmacMD5 | 128 | JDK |
HmacSHA1 | 160 | JDK |
HmacSHA224 | 224 | Bouncy Castle |
HmacSHA256 | 256 | JDK |
HmacSHA384 | 384 | JDK |
HmacSHA512 | 512 | JDK |
- MAC 应用
![MAC](https://img-blog.csdnimg.cn/20181129164750220.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlaWZjaGVuOTA=,size_16,color_FFFFFF,t_70)
3.1 JDK 实现 HmacMD5
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class MessageDigestUtils {
static final String KEY = "aa";
public static String jdkHmacMD5(String str) {
try {
byte[] key = KEY.getBytes();
SecretKey restoreKey = new SecretKeySpec(key, "HmacMD5");
Mac mac = Mac.getInstance(restoreKey.getAlgorithm());
mac.init(restoreKey);
byte[] hmacMD5Bytes = mac.doFinal(str.getBytes());
return Hex.encodeHexString(hmacMD5Bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3.2 Common Codec 实现 HmacMD5
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import javax.crypto.Mac;
public class MessageDigestUtils {
static final String KEY = "aa";
public static String commonsCodecHmacMD5(String str) {
Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_MD5, KEY.getBytes());
return Hex.encodeHexString(mac.doFinal(str.getBytes()));
}
}
3.3 Bouncy Castle 实现 HmacMD5
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;
public class MessageDigestUtils {
static final String KEY = "aa";
public static String bouncyCastleHmacMD5(String str) {
HMac hMac = new HMac(new MD5Digest());
hMac.init(new KeyParameter(KEY.getBytes()));
hMac.update(str.getBytes(), 0, str.getBytes().length);
byte[] hmacMD5Bytes = new byte[hMac.getMacSize()];
hMac.doFinal(hmacMD5Bytes, 0);
return Hex.toHexString(hmacMD5Bytes);
}
}
参考
- GitHub
- Java实现Base64加密
- Java实现消息摘要算法加密