最近因为项目要做等保,需要对用户提交的字段进行加密存储,但是还需要做查询,所以需要能解密。
目前打算采用rsa非对称加密保存数据,实现数据加密和解密,但是很尴尬的发现生成的公钥和秘钥居然是对象,且不能直接打印输出,网上看了一下,发现大多数的做法是把对象转化为二进制数据,然后使用base64进行编码
注:编码(为什么用编码,因为实际上base64不能称为强加密,很容易识别而且容易破解,但是编码后利于传输,不是明文传输,也算是一种手段吧,速度快,好用,是常见的使用方法)
但是我发现网上很多base64的方法居然用不了,我用的是jdk1.8,使用的包是import java.util.Base64;
那就来试试,如何快速使用编码解码吧。
Base64.Encoder encoder = Base64.getEncoder();
String hello="hello 中国!";
byte[] encode = encoder.encode(hello.getBytes());
编码不能直接传递字符串,需要转化为二进制数传递,返回的还是二进制文件,所以有什么用呢?我们打印一下
可以看出问题了吧,二进制文件已经不是原来的字符编码了
需要解码才能还原字符串,文件也是一样。
解码比较简单,入参可以是二进制也可以是字符串,同样构造一个解码器。
Base64.Encoder encoder = Base64.getEncoder();
String hello="hello 中国!";
byte[] encode = encoder.encode(hello.getBytes());
Base64.Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(encode);
byte[] decode2 = decoder.decode(new String(encode));
String str1 = new String(decode);
String str2 = new String(decode2);
System.out.println(str1);
System.out.println(str2);
都可以输出正常的文字,表示解码成功
所以base64编码解码是jdk本身已经实现了的,可以在任意的Java环境下直接使用
可以把二进制的文件编码,如果不是二进制的文件,转化为二进制,比如字符串的getBytes()
同样是对于二进制编码文件解码,虽然可以支持字符串入参实际上还是转化为二进制再进行解码。下面是源码。懂?
既然原理和使用方法都知道了,那么我们写一个工具包,下次直接用吧,如果对你有帮助,你可以直接复制代码去用,去看,去研究(不过我想我前面讲解的应该懂了吧,狗头-,-)。
点赞加关注,好运挡不住。
我正准备写个工具包,想了下,看了下spring是不是有工具包了,然后我输入Base64Utils,还真有,idea太好用了…
(别打我,我真不知道,早知道有,我写个寂寞。。。)
import org.springframework.util.Base64Utils;
所以… ,虽然没有写成工具包,但是只要你明白编码解码的原理和过程,那你自己写也是可以的。(当然spring全家桶还是香啊,小声比比-。-),点个赞呗。