一、消息摘要算法
MD(Message Digest)
SHA(Secure Hash Algorithm)
MAC(Message Authentication Code)
以上三个都是:验证数据完整性
数字签名核心算法
二、消息摘要算法-MD
MD5
MD家族(128位摘要信息)
-MD2、MD4
算法 | 摘要长度 | 实现方 |
MD2 | 128 | JDK |
MD4 | 128 | Bouncy Castle |
MD5 | 128 | JDK |
代码:
package com.jl.mdshamac;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;
/**
* md2和md5是由jdk提供的,以下为例子
* md2和md5 为hash算法,方法不可逆,没有提供解密方法(自己写解密算法)
* @author jinlong
*
*/
public class Md2orMd5 {
static String src = "i love code";
public static void main(String[] args) {
jdkMd2();
jdkMd5();
}
private static void jdkMd2() {
try {
MessageDigest md = MessageDigest.getInstance("md2");
byte[] md2bytes = md.digest(src.getBytes());
String encode = Hex.encodeHexString(md2bytes);
// System.out.println("JDK MD2 encode " + new String(md2bytes)); 这样不行,要转为16进制字符串
System.out.println("JDK MD2 encode " + encode);
// byte[] md2bytes_decode = md.digest(encode.getBytes());
// System.out.println("JDK MD2 decode " + new String(md2bytes_decode));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void jdkMd5() {
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5bytes = md.digest(src.getBytes());
String encode = Hex.encodeHexString(md5bytes);
System.out.println("JDK MD5 encode " + encode);
// byte[] md5bytes_decode = md.digest(encode.getBytes());
// System.out.println("JDK MD5 decode " + new String(md5bytes_decode));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应用
用户注册功能
(1)用户注册(2)应用服务器对密码进行消息摘要(3)数据库信息持久化(4)返回注册结果
用户登录
(1)用户登录(2)应用服务器对密码进行消息摘要(3)数据库通过用户名及摘要查询(4)返回登录结果
三、消息摘要算法-SHA
安全散列算法
固定长度摘要信息
SHA-1、SHA2(SHA-224、SHA-256、SHA-384、SHA-512)(由md4引变而来)
算法 | 摘要长度 | 实现方 |
SHA-1 | 160 | JDK |
SHA-224 | 224 | Bouncy Castle |
SHA-256 | 256 | JDK |
SHA-384 | 384 | JDK |
SHA-512 | 512 | JDK |
代码:
package com.jl.mdshamac;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;
/**
* 关于sha-1
* @author jinlong
*
*/
public class SHA1jdk {
static String src = "i love code";
public static void main(String[] args) {
jdkSHA1();
}
private static void jdkSHA1() {
MessageDigest md;
try {
md = MessageDigest.getInstance("sha");
md.update(src.getBytes());
System.out.println("jdk sha-1:" + Hex.encodeHexString(md.digest()));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应用
浏览器证书
消息摘要算法-SHA 应用(SHA算法消息传递)
发送方:1.公布消息摘要算法 2.对待发布消息进行摘要处理 3.发布摘要消息 4.发送消息
接收方:消息鉴别
消息鉴别是指在接受方将原始信息进行摘要,然后与接受到的摘要信息进行对比
应用例子
- 加入约定key
- 增加时间戳
- 排序
http://**?msg=12Hsad74mj×tamp=1309488734
msg:原始消息+key+时间戳
四、消息摘要算法-MAC
MAC(Message Authentication Code)
HMAC(keyed-Hash Message Authentication Code)
含有密钥的散列函数算法
融合MD、SHA
应用如SecureCRT
算法 | 摘要长度 | 实现方 |
HmacMD2 | 128 | Bouncy Castle |
HmacMD4 | 128 | JDK |
HmacMD5 | 128 | JDK |
HmacSHA1 | 160 | Bouncy Castle |
HmacSHA224 | 224 | Bouncy Castle |
HmacSHA256 | 256 | JDK |
HmacSHA384 | 384 | JDK |
HmacSHA512 | 512 | JDK |
代码:
package com.jl.mdshamac;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
/**
* mac进行消息摘要
* @author jinlong
*
*/
public class Macjdk {
private static String src = "i love code";
public static void main(String[] args) {
jdkHmacMD5();
}
private static void jdkHmacMD5() {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");//初始化KeyGenerator
SecretKey secretKey = keyGenerator.generateKey(); //产生密钥
byte[] key = secretKey.getEncoded(); //获得密钥
SecretKey restoreSecretKey = new SecretKeySpec(key,"HmacMD5"); //还原密钥
Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm()); //实例化mac
mac.init(restoreSecretKey); //初始化mac
byte[] hmacMD5Bytes = mac.doFinal(src.getBytes()); //执行摘要
System.out.println("jdk HmacMD5: " + Hex.encodeHexString(hmacMD5Bytes));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应用
发送方:1.公布消息摘要算法 2.构建密钥 3.发送密钥 4.对待发消息进行摘要处理 5.发送消息摘要 6.发送消息
接受方:消息鉴别
五、消息摘要算法-其他
RipeMD
Tiger
Whirlpool
GOST3411
Bouncy Castle实现