本文内容来自Java实现Base64加密系列课程
Java加密
散列函数:散列函数用来验证数据的完整性。散列函数相关算法:
- 消息摘要算法MD5
- SHA 安全散列算法
- MAC 消息认证码算法
数字签名:主要是针对以数字的形式存储的消息进行的处理。数字签名会产生一种带有操作者身份的信息的编码。
Java安全组成
- JCA(Java Cryptography Architecture)提供基本的加密框架,例如消息摘要,数字签名等
- JCE(Java Cryptography Extension)在JCA的基础上做了些扩展,DES、AES、RSA算法通过JCE提供
- JSSE(Java Secure Socket Extension)提供基于SSL的加密功能,主要用于网络传输
- JAAS(Java Authentication and Authentication Service)
JDK相关java包、类:
- java.security
- 消息摘要
- javax.crypto
- 安全消息摘要,消息认证(鉴别)码
- java.net.ssl
- 安全套接字
第三方java扩展:
- Bouncy Castle
- 两种支持方案:1.配置 2.调用
- Commons Codec Apache提供的包
- Apache
- Base64、二进制、十六进制、字符集编码
- Url编码/解码
Base64算法
Base64算法实现有如下几种方式:
- Jdk
- Commons Codec
- Bouncy Castle
应用场景:e-mail、密钥、证书文件
Jdk方式:
/**
* jdk方式
*/
public static void jdkBase64() {
try {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes());
System.out.println("encode:"+encode);
BASE64Decoder decoder = new BASE64Decoder();
System.out.println("decode:"+ new String(decoder.decodeBuffer(encode)));
} catch (IOException e) {
e.printStackTrace();
}
}
cc方式,使用到了commons-codec-1.10.jar
/**
* cc方式
*/
public static void commonsCodesBase64() {
byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
System.out.println("encode : " + new String(encodeBytes));
byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
System.out.println("decode : " + new String(decodeBytes));
}
bc方式,使用到了bcprov-jdk15on-149.jar
和bcprov-ext-jdk15on-149.jar
/**
* bc方式
*/
public static void bouncyCastleBase64() {
byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
System.out.println("encode : " + new String(encodeBytes));
byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
System.out.println("decode : " + new String(decodeBytes));
}
消息摘要算法
用来验证数据完整性,消息摘要算法是数字签名核心算法
MD
128位摘要信息
JDK提供了MD2和MD5实现, bc提供了MD4的实现。cc提供了MD2和MD5,它只是提供了对JDK中MD2和MD5的封装。
算法 | 摘要长度 | 实现方法 |
---|---|---|
MD2 | 128 | JDK |
MD4 | 128 | Bouncy Castle |
MD5 | 128 | JDK |
jdk md5方式:
public static void jdkMD5() {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md.digest(src.getBytes());
System.out.println("JDK MD5 : " + Hex.encodeHexString(md5Bytes));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//JDK MD2 : 54ade03d9765c9f0290189a2ae704ee7
}
cc md5方式
/**
* cc md5
*/
public static void ccMD5() {
System.out.println("cc MD5 : " + DigestUtils.md5Hex(src.getBytes()));
}
bc md5方式
/**
* bc MD5
*/
public static void bcMD5(){
Digest digest = new MD5Digest();
digest.update(src.getBytes(), 0, src.getBytes().length);
byte[] md5Bytes = new byte[digest.getDigestSize()];
digest.doFinal(md5Bytes, 0);
System.out.println("BC MD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes));
//BC MD5 : 89048f19b72e7367b7faacfe659a8de0
}
MD应用
例如用户注册与验证
SHA
SHA安全散列算法的简称,长度跟MD5一样,都是固定长度摘要信息。包括SHA-1, SHA-2(SHA-224, SHA-256, SHA-384, SHA-512)
算法 | 摘要长度 | 实现方法 |
---|---|---|
SHA-1 | 160 | JDK |
SHA-224 | 224 | Bouncy Castle |
SHA-256 | 256 | JDK |
SHA-384 | 384 | JDK |
SHA-512 | 512 | JDK |
JDK 实现SHA-1
public static void jdkSHA1() {
try {
MessageDigest md =MessageDigest.getInstance("SHA");
md.update(src.getBytes());
System.out.println("jdk sha-1 : " + Hex.encodeHexString(md.digest()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//jdk sha-1 : 8bb95fe138f7e9d993dd90bae339a45e56b72eb7
}
bc方式实现SHA-1
public static void bcSHA1() {
Digest digest = new SHA1Digest();
digest.update(src.getBytes(), 0, src.getBytes().length);
byte[] sha1Bytes = new byte[digest.getDigestSize()];
digest.doFinal(sha1Bytes, 0);
System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));
//bc sha-1 : 8bb95fe138f7e9d993dd90bae339a45e56b72eb7
}
cc方式显示SHA-1
public static void ccSHA1(){
System.out.println("cc SHA1 : " + DigestUtils.sha1Hex(src));
//cc SHA1 : 8bb95fe138f7e9d993dd90bae339a45e56b72eb7
}
SHA应用
消息鉴别是指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行比对。
MAC
MAC消息认证码算法,也称为HMAC含有密钥的散列函数算法,融合MD、SHA。
jdk方式实现HmacMD5
public static void jdkHmacMD5() {
try {
//初始化KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
//产生密钥
SecretKey secretKey = keyGenerator.generateKey();
//获得密钥
//byte[] key = secretKey.getEncoded();
byte[] key = Hex.decodeHex(new char[] {'a', 'a', 'a', 'a'});
//还原密钥
SecretKey restoreSecretKey = new SecretKeySpec(key, "HmacMD5");
//实例化MAC
Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
//初始化Mac
mac.init(restoreSecretKey);
//执行摘要
byte[] hmacMD5Bytes = mac.doFinal(src.getBytes());
System.out.println("jdk HmacMD5 : " + Hex.encodeHexString(hmacMD5Bytes));
} catch (Exception e) {
e.printStackTrace();
}
//jdk HmacMD5 : 07a66150487ce81e30a3e4b5fe9af00a
}
bc方式实现HmacMD5
public static void bcHmacMD5() {
HMac hMac = new HMac(new MD5Digest());
hMac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("aaaa")));
hMac.update(src.getBytes(), 0 , src.getBytes().length);
byte[] hmacMD5Bytes = new byte[hMac.getMacSize()];
hMac.doFinal(hmacMD5Bytes, 0);
System.out.println("bc HmacMD5 : " + org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes));
//bc HmacMD5 : 07a66150487ce81e30a3e4b5fe9af00a
}
Mac应用