java进阶12 Base64 UrlBase64 Hex 加密 解密技术
java的加密与解密技术:
现在的加密技术主要有
单向加密算法:以MD5 SHA算法为代表
对称加密算法:以DES 三重DES AES PBE算法为代表
非对称加密算法:以RSA为代表
简要的说下这三种加密算法的区别
先是单向加密算法,顾名思义,它不会有密钥,因为它是单向的,加密之后无法解密,就连程序猿都无法知道加密之后的东西是什么
主要用处是数据完整性的验证。
对称加密算法,其特征是公钥与私钥相同。一般用来数据储存,比如将数据加密之后存入数据库,那么数据库管理员就无法泄密数据库中的类容
有密钥的人却可以根据密钥解密数据库中的真正数据。
非对称加密算法,就是公钥与私钥不同,一般公钥公开,私钥在你想给人看到数据的人的手上,利用私钥来解密数据。它一般是用于数据传输的加密。
先由浅入深,先说说伪加密 Base64 UrlBase64 Hex
首先java api中没有实现这三个类,所以你需要下载jar包。
就是这2个。
先来说说Base64吧。
新建它的类。
package Cipher; import org.bouncycastle.util.encoders.Base64; public class Base64Coder { /* * 经Base64编码后的字符串的字符数是以4为单位的整数倍 * */ public final static String ENCODING="UTF-8"; //加密 public static String encode(String data) throws Exception{ byte[] b=Base64.encode(data.getBytes(ENCODING));//执行编码 return new String(b,ENCODING); } //解密 public static String decode(String data) throws Exception{ byte[] b=Base64.decode(data.getBytes(ENCODING));//解密编码 return new String(b,ENCODING); } }
然后在主函数中运行下。
package Cipher; public class CipherTest { public static void main(String[] args) throws Exception{ Base64Test(); } /* * Base64编码 * */ static void Base64Test() throws Exception{ String data="I love the Word 亲爱的世界"; System.out.println("编码前->"+data); String encipher=Base64Coder.encode(data); System.out.println("编码后->"+encipher); String decipher=Base64Coder.decode(encipher); System.out.println("解码后->"+decipher); System.out.println(); } }
输出结果:
编码前->I love the Word 亲爱的世界
编码后->SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==
解码后->I love the Word 亲爱的世界
这就将这句 加密成SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==
这个加密后的东西是不是很熟悉,如果你经常在网页抓包的话,就会遇到这种东西
有些网页Get提交的数据就是这个。
=就是Base64的关键标志
至于为什么说它是伪加密呢?
因为SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==给你字符映射表 你自己都能手动解出来。
因为这个表示公开的,所以才说它是伪加密。
接下来说说UrlBase64
package Cipher; import org.bouncycastle.util.encoders.UrlBase64; public class UrlBase64Coder { /* * Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法 * 将字符映射表中用作补位的"="换成"." * 并用"-"代替"+" * 用"_"代替"/" * 使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输 * */ public final static String ENCODING="UTF-8"; //编码 public static String encode(String data) throws Exception{ byte[] b=UrlBase64.encode(data.getBytes(ENCODING)); return new String(b,ENCODING); } //解码 public static String decode(String data) throws Exception{ byte[] b=UrlBase64.decode(data.getBytes(ENCODING)); return new String(b,ENCODING); } }
在主函数中运行下
public class CipherTest { public static void main(String[] args) throws Exception{ Base64Test(); UrlBase64Test(); } /* * Base64编码 * */ static void Base64Test() throws Exception{ String data="I love the Word 亲爱的世界"; System.out.println("编码前->"+data); String encipher=Base64Coder.encode(data); System.out.println("编码后->"+encipher); String decipher=Base64Coder.decode(encipher); System.out.println("解码后->"+decipher); System.out.println(); } static void UrlBase64Test() throws Exception{ String data="I love the Word 亲爱的世界"; System.out.println("编码前->"+data); String encipher=UrlBase64Coder.encode(data); System.out.println("编码后->"+encipher); String decipher=UrlBase64Coder.decode(encipher); System.out.println("解码后->"+decipher); System.out.println(); } }
输出结果:
看见这两个的区别没有, 只是=换成了. 再想想这个类的名字UrlBase64
在网页上提交URL的时候 = 会被当成后面跟了参数
所以这个UrlBase64 就是专门为URL参数加密而设计的。
Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法
将字符映射表中用作补位的"="换成"."
并用"-"代替"+"
用"_"代替"/"
使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输
最后说说Hex 这个类用于十六进制转换。
package Cipher; import org.bouncycastle.util.encoders.Hex; public class HexCoder { //Hex类用于十六进制转换,常配合摘要算法处理摘要值,以十六进制形式公示 public static final String ENCODING="UTF-8"; //编码 public static String encode(String data) throws Exception{ byte[] b=Hex.encode(data.getBytes(ENCODING)); return new String(b,ENCODING); } //解码 public static String decode(String data) throws Exception{ byte[] b=Hex.decode(data.getBytes(ENCODING)); return new String(b,ENCODING); } }
在主函数中操作下
package Cipher; public class CipherTest { public static void main(String[] args) throws Exception{ HexTest(); } static void HexTest()throws Exception{ String data="I love the Word 亲爱的世界"; System.out.println("编码前->"+data); String encipher=HexCoder.encode(data); System.out.println("编码后->"+encipher); String decipher=HexCoder.decode(encipher); System.out.println("解码后->"+decipher); System.out.println(); } }
输出结果:
它就将语句转出十六进制。
关于加密解密先讲到这里。