java/web工具类之MD5、AES、Base64算法数据加密
对加密解先理解:
比如:甲乙双方要通信,中间的连接可能被人窃听甚至篡改。解决办法就是把传输的内容进行加密,用密文去传输,这样即使被监听也没办法知道信息的具体内容。
加密时,甲乙双方可以约定一个密码A,甲用A加密,乙用A解密,这就是对称加密。
对称加密存在一个问题是:密钥怎么传递给对方?
貌似没解,于是就出现了非对称加密,非对称加密时有两个密钥,就是公钥和私钥。用公钥加密的只能用私钥解密,反之用私钥加密的则只能用公钥解密。这样在流程上有点儿变化了。
原先在对称加密中,密钥没法传递,现在好了,密钥不用传递,因为公钥是公开的,谁都可以拿到。
但是还漏掉了一个问题:虽然篡改不了问题,那我总可以冒名发数据吧?
因为乙的公钥是公开的,那我就可以拿着乙的公钥给乙想发什么就发什么?
乙怎么知道数据甲发过来的呢?答案是用数字签名来验证。
总结:
加密技术通常分为两大类:“对称式"和"非对称式”。
非对称加密:包括RSA DSA RCC,非对称加密是相比对称加密而言的
对称加密:包括AES,DES,3DES。
其次,对应于安全问题的解决办法如下:
数据完整性问题:数据摘要验证
数据保密性问题:对称加密&非对称加密
身份验证问题:数字签名
1.Base64编码加密和解密
将数据转换为不便于识别的数据算是一种最简单的加密了,比如Base64编码。
Base64:属于对称加密算法
Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便。
用处:
Base64这种编码是可逆的,也就是可以加密也可以解密。一般在web开发中常常用来加密图片路径,这种不是很重要又不想被人盗走的,就用这种简单加密。
JDK1.8以下
使用Java8以下的小伙伴,要使用Base64的编码与解码,就可以使用JDK里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类别,
用法如下:
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public static void main(String[] args) throws IOException{
//java 8以下 import sun.misc.BASE64Decoder;
String text = "这是一段明文";
byte[] bytes = text.getBytes();
String encodedStr = encode(bytes);
byte[] decodedBytes = decode(encodedStr);
System.out.println("原文字:"+text);
System.out.println("加密字段:"+encodedStr);
System.out.println("解密字段:"+new String(decodedBytes));
}
public static String encode(byte[] bytes){
return new BASE64Encoder().encode(bytes);
}
public static byte[] decode(String encodeStr) throws IOException{
return new BASE64Decoder().decodeBuffer(encodeStr);
}
结果:
JDK1.8或以上
在目前的Java8中,已经内置Base64的实现类,可以通过java.util.Base64工具类来使用。
非常方便。
用法如下:
public static void main(String[] args) throws IOException{
//Java 8 import java.util.Base64;
final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
String text = "这是一段明文";
System.out.println("原文字:"+text);
final byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = encoder.encodeToString(textByte);
System.out.println("加密字段:"+encodedText);
//解码
String jiemi = new String(decoder.decode(encodedText), "UTF-8");
System.out.println("解密字段:"+jiemi);
效果:
实际测试编码与解码速度的话,Java 8提供的Base64,要比sun.mis c套件提供的还要快至少11倍,
所以:<