任务
接到任务,需要把涉及附件路径的转成base64编码。如果已经是base64编码的,就不续约进行转码。
Base64 编码是用64(2的6次方)个特定的ASCII(ASCII 编码是用256(2的8次方)个字符,对二进制数据进行编码的方式)字符来表示256(2的8次方)个ASCII字符,也就是说三个ASCII字符经过Base64编码后变为四个的ASCII字符显示(公约数为24),编码后数据长度比原来增加1/3,不足3n用“=”补足。
处理:
判断是否为base64编码,使用正则的方式。
public static Boolean isBase64(String str) {
String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
return Pattern.matches(base64Pattern, str);
}
Base64Utils
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import java.util.regex.Pattern;
public class Base64Utils {
private static final String UTF_8 = "UTF-8";
private static Base64.Encoder encoder;
private static Base64.Decoder decoder;
static {
encoder = Base64.getEncoder();
decoder = Base64.getDecoder();
}
//encode
public static byte[] encode(byte[] bytes) {
return encoder.encode(bytes);
}
public static String encode(String content) {
byte[] encode = encode(content.getBytes());
try {
return new String(encode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String encode2String(byte[] bytes) {
return encoder.encodeToString(bytes);
}
public static byte[] encode2Byte(String content) {
return encode(content.getBytes());
}
//decode
public static byte[] decode(byte[] bytes) {
return decoder.decode(bytes);
}
public static byte[] decode2Byte(String content) {
return decoder.decode(content.getBytes());
}
public static String decode2String(byte[] bytes) {
try {
return new String(decoder.decode(bytes),UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String decode(String content) {
byte[] decode = decode(content.getBytes());
try {
return new String(decode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 判断是否为base64编码
* @param str
* @return
*/
public static Boolean isBase64(String str) {
String base64Pattern = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$";
return Pattern.matches(base64Pattern, str);
}
public static void main(String args[]) {
String sql = "select * from staff";
System.out.println(sql);
System.out.println(encode(sql));
System.out.println(decode(encode(sql)));
System.out.println(isBase64(encode(sql)));
System.out.println(isBase64(decode(encode(sql))));
}
}
使用:
读取的数据的时候,进行转码,使用 encodeStr进行处理
下载文件的时候,进行解码,使用decodeStr 进行处理。
转码和解码前都进行判断,这样就把问题解决了。
总结:
Base64 主要不是用来加密的,它主要的用途是把一些二进制数转成普通字符用于网络传输,这是因为一些二进制字符在传输协议中属于控制字符,不能直接在网络上传输。Base64是一个编码算法,对数据内容进行编码来适合网络传输。虽然Base64编码过后原文也变成无法直接理解的字符格式,但是这种编码方式比较初级,很简单,很容易就可以被还原成原文,所以如果有比较重要的信息需要加密,需要使用其它安全的加密方式进行处理。