什么是Base64,应用场景有哪些
我们经常在工作中听到类似的东西。加密,解密,编码,解码之类的字眼。其实很多同学,特别是转行培训出来的在这个时候往往是装聋作哑的,为什么呢? 因为不知道啊,而且很多人也不知道。很多兄的的工作焦虑就是从这里来的。
下来也不利用业余时间充电,那么就会被行业慢慢淘汰。所以咱们不能好高骛远,把基础学好。以后不说大富大贵,过上中产生活还是没什么大问题。
什么是Base64:
对字符编码不太了解得同学可以先去看看我的博客:深入浅出:java开发中,字符集编码详解.
我们知道,计算机不认识我们人类的语言。比如”张三“这样一个字符串,计算机认识吗?不认识。 计算机只认识0和1。 那么怎么办呢?
- 我们认识”张三“,
- 计算机认识0和1。
有了这两个条件,人类就发明了一种方式:字符集编码 来规范和规定了人类和计算机之间的交流。
随着历史的推进,和各种人类语言的加入,字符集编码也拥有不少的版本。比如UTF-8、GBK等等。。。
但是人们渐渐的发现了两个问题,在网络数据传输的时候
- 网络传输只能传输可打印字符(在ASCII码中规定,0-31、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输)
- 安全性,数据人人可见人人可解读,那还有什么安全可言呢?
这个时候Base64就站出来了。
Base64立马就解决了这两个问题。
- 文件传输的时候,会产生很多不可打印字符,网络传输不支持不可打印字符。 Base64将所有数据编码为可打印字符,完成了网络传输。
- 将文件明文通过编码(加密)成为不可一眼就可看懂的字符串,形成了一个弱弱的但不可或缺的加密操作。
这里我们不过多讲述Base64底层是如何编码的,简单的帖一张Base64的转换表: Base64、Base64那么肯定是64个字符:
Base64到底是加密,还是编码:
这个问题可以说是见仁见智。
我个人觉得Base64主要作用是兼容了ASCII系统和非ASCII系统之间的网络交易。 并且解决了网络传输中的”不可打印字符“问题。
要说它加密没有,那确实是加密了,但属于是人人都可以破解的简易加密。所以我们在程序开发中,真正对数据加密的时候一般不使用Base64。(人人都知道如何解密的算法就不能称之为加密算法)
Base64应用场景:
其实很多时候我们都在用Base64。这里我就举一个我实际项目中使用到的一个例子:
-
项目中 我们把一些比较小的图片保存在数据库中,用一个字段来保存。
但是呢,前端页面有时候会需要展示这些图片到页面上。 我们直接返回数据库中保存的数据有时候会出现问题(网络不能传输不可打印字符)。这个时候我们后端把文件数据返回前端的时候需要将数据转换为Base64编码后的字符串。 好! 这个时候前端就能自动解析并把图片展示出来。 -
URL编码
2.1. 我们都知道,http请求,在解析参数时是根据?和=号去解析的。那么当key value中包含=号时,参数解析就会错误。
2.2. 还有当url出现汉字时,会自动编码。
所以如果http传输URL中有汉字,就必须编码后使用。但是麻烦的是 标准的国际组织并没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。 这导致"URL编码"成为了一个混乱的领域。
把要编码的字符转成16进制字符,前加%。所以看到很多%,就可以判断是url编码!
java 开发中使用Base64:
直接拷贝使用即可:
import java.io.UnsupportedEncodingException;
import java.util.Base64;
/**
*/
public class JavaBase64Util {
public static final String UTF_8 = "UTF-8";
public static Base64.Encoder encoder;
//即为安全的编码方式,替换“+” “/” “-”为“_”
public static Base64.Encoder urlEncoder;
public static Base64.Decoder decoder;
public static Base64.Decoder urlDecoder;
static {
encoder = Base64.getEncoder();
urlEncoder = Base64.getUrlEncoder();
decoder = Base64.getDecoder();
urlDecoder = Base64.getUrlDecoder();
}
//encode
public static byte[] encode(byte[] bytes) {
return encoder.encode(bytes);
}
public static String encode(String string) {
byte[] encode = encode(string.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 string) {
return encode(string.getBytes());
}
//urlEncoder
public static byte[] urlEncode(byte[] bytes) {
return urlEncoder.encode(bytes);
}
public static String urlEncode(String string) {
byte[] encode = urlEncode(string.getBytes());
try {
return new String(encode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String urlEncode2String(byte[] bytes) {
return urlEncoder.encodeToString(bytes);
}
public static byte[] urlEncode2Byte(String string) {
return urlEncode(string.getBytes());
}
//decode
public static byte[] decode(byte[] bytes) {
return decoder.decode(bytes);
}
public static byte[] decode2Byte(String string) {
return decoder.decode(string.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 string) {
byte[] decode = decode(string.getBytes());
try {
return new String(decode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
//urlDecode
public static byte[] urlDecode(byte[] bytes) {
return urlDecoder.decode(bytes);
}
public static byte[] urlDecode2Byte(String string) {
return urlDecode(string.getBytes());
}
public static String urlDecode2String(byte[] bytes) {
try {
return new String(urlDecode(bytes),UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String urlDecode(String string) {
byte[] decode = urlDecode(string.getBytes());
try {
return new String(decode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}