欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(开发支持类库)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种加密程序,同时在找到一些完全不可解密的加密方法。