最近想总结一下以前用到的密码学知识用java实现,准备汇总成一个系列
初步决定包含以下内容:
- 传输算法Base64
- 验证数据完整性:消息摘要算法
- 对称加密算法
- 非对称加密算法
- 带密钥的消息摘要算法:数字签名算法
- 数字证书
- 安全协议HTTPS
- 热身准备
大部分算法可以通过Sun的JDK实现,但有更简单的第三方包可以帮助我们。
我采用的是commons-codec,下载地址http://commons.apache.org/proper/commons-codec/
下载是最新的commons-codec-1.9.jar
使用commons-codec有很多方便的地方,比如JDK实现MD5算法返回的是byte[],commons-codec可以直接返回String类型,并且支持输入参数为byte[]、String、InputStream等各种形式。
实例里面用到commons-codec会特别说明。
最后介绍密钥的存储形式。
对一个8字节的密钥
用String存储可以表示为String key = "4041424344454647";
用byte[]存储可以表示为byte[] key = new byte[]{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
两者之间可以通过commons-codec的Hex类进行转换
String转换为byte[]
String key = "4041424344454647";
byte[] b = Hex.decodeHex(key.toCharArray());
byte[]转换为String
byte[] key = new byte[]{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
String s = Hex.encodeHexString(key);
- Base64算法实现
介绍第一个算法——Base64。
Base64算法是对一个字符串进行编码和解码,算不上真正的加密算法。
用commons-codec的代码实现
/**
* BASE64编码
* @param data
* @return
*/
public static String Base64encode(String data) {
try {
byte[] b = Base64.encodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* BASE64解码
* @param data
* @return
*/
public static String Base64decode(String data) {
try {
byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
测试代码
String data = "yeliang";
System.out.println("原文:"+data);
String encode = Base64encode(data);
System.out.println("Base64编码后:"+encode);
String decode = Base64decode(encode);
System.out.println("Base64解码后:"+decode);
运行结果
原文:yeliang
Base64编码后:eWVsaWFuZw==
Base64解码后:yeliang
- Base64算法的典型应用
电子邮件传输
数字证书存储