(开发支持类库)Base64加密与解密
程序员文章站
2024-01-20 17:21:52
...
Base64加密与解密
正常来讲加密基本上永远都要伴随着解密,所谓的加密或者解密往往都需要一些规则。 在JDK1.8开始提供有一组新加密处理类,Base64处理,在这个类里面有两个内部类:
- Base64.Encoder:进行加密处理;
- public byte[] encode(byte[] src) 使用Base64编码方案将指定字节数组中的所有字节编码为新分配的字节数组
- Base64.Decoder:进行解密处理;
- public byte[] decode(byte[] src): 使用Base64编码方案解码输入字节数组中的所有字节,将结果写入新分配的输出字节数组。
范例:实现加密与解密操作
package 开发支持类库;
import java.util.Base64;
public class Base64类 {
public static void main(String[] args) {
//加密
String msg = "加密内容"; //要发送的信息内容
//getEncoder()返回一个Base64编码方案,encode利用此方法进行加密
byte[] enMsg = Base64.getEncoder().encode(msg.getBytes()); //数据加密
String enString = new String(enMsg); //转换为String
System.out.println("加密后:"+enString);
//解密
byte[] deMsg = Base64.getDecoder().decode(enMsg); //解密,getDecoder()返回一个Base64编码方案,decode进行解密
String deString = new String(deMsg);
System.out.println("解密结果:"+deString);
}
}
加密后:vNPD3MTayN0=
解密结果:加密内容
虽然Base64可以实现加密与解密处理,但是由于是一个公版的算法,所以直接对数据进行加密往往不安全,那么最好的方法是使用盐值操作。
String salt = "javaDemo"; //定义盐值
String msg = "加密内容"+"{"+salt+"}"; //加上了盐值,数据不只有加密内容
即便现在盐值实际上发现加密的效果也不是很好,最好的做法是多次加密。
范例:复杂加密操作
package 开发支持类库;
import java.util.Base64;
public class Base64类 {
public static void main(String[] args) {
//加密
String str =StringUtil.encode("加密内容") ;
System.out.println(str);
//解密
str = StringUtil.decode(str);
System.out.println(str);
}
}
class StringUtil{
private static final String SALT = "盐值"; //公共的盐值
private static final int RPEAT = 3; //加密次数
/**
* 加密处理
* @param str 要加密的字符串,需要与盐值整合
* @return 加密后的数据
*/
public static String encode(String str) { //加密处理
String temp = str +"{"+SALT+"}"; //盐值对外不公布
byte data[] = temp.getBytes(); //将字符串变为字节数组
for(int x = 0;x <RPEAT ;x++) {
data = Base64.getEncoder().encode(data); //重复加密
}
return new String(data); //字节数组转为字符串,返回加密结果
}
/**
* 解密处理
* @param str 解密的字符串
* @return 解密后的内容
*/
public static String decode(String str) {
byte data[] = str.getBytes();//将字符串变为字节数组
for(int x = 0;x <RPEAT ;x++) {
data = Base64.getDecoder().decode(data); //重复解密,之前加密多少次就解密多少次
}
return new String(data).replaceAll("\\{\\S+\\}", "");//S表示任何非空格的字符,将括号和里面所有内容替换成null,字节数组转为字符串,返回解密结果
}
}
ZGs1UVJETk5WR0Y1VGpFM01HTTNWM1JZTUQwPQ==
加密内容
最好是使用2-3种加密程序,同时在找到一些完全不可解密的加密方法。
上一篇: (国际化程序实现)Locale类
下一篇: c3p0 连接池使用
推荐阅读