密码学 | 庐山真面!你认为 Base64 是加密算法吗?

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 密码学 | 庐山真面!你认为 Base64 是加密算法吗?

目录


image.png


1. 基本原理


Base64是一种将二进制流表示为 64 个字符的编码方式。标准的 Base64 使用的索引表为:


image.png

举个例子,字符串"Base64 编码"经过编码后的结果为:QmFzZTY0IOe8lueggQ==。当然,这里隐含了以UTF-8作为字符编码的前提,如果使用了其他的字符编码方式,用Base64编码后就不是这个结果了。很多在线编解码的网站其实也是默认使用了UTF-8,但是没有明确说明。


1.1 标准 Base64 编码步骤


下面解释一下Base64的编码步骤:


  • 步骤1:数据输入在这一步骤,需要将原数据(字符串、图片、音频等任何数据)转换为二进制流。例如前面举的字符串的例子,则需要经过字符编码转换为二进制流。
  • 步骤2:分组转换
  • 从二进制流头部开始,每 6 位为一组,若不足 6 位,则低位补0
  • 每 6 位组成一个新的字节,高位 2 位补 0 ,此时已经获得二进制的Base64编码
  • 步骤3:转换为字符串将二进制的Base64编码每个字节映射为一个字符,例如0000 0000映射为 A0011 1111映射为/,此时已经获得Base64编码字符串
  • 步骤4:末尾补位标准Base64编码字符串的长度为 4 的倍数,否则,在末尾补充=。例如前面的QmFzZTY0IOe8lueggQ==长度就是补充了两个=后,长度为 20。


整个编码步骤并不复杂,我们用一张示意图表示为:


image.png


1.2 非标准 Base64


  • Url Base 64标准Base 64中使用了'/',这在URL和文件系统中存在冲突,因此延伸出 Url Base64 算法,主要就是将'+''/'符号替换成了'-''_'符号。
  • MIME Base 64这是一种MIME友好格式,它输出每行为 76 个字符,每行末需追加回车换行符\r\n,不论每行是否够 76 个字符,都要添加一个回车换行符


1.3 意义


Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。最初,Base64是为了解决电子邮件中无法直接使用非ASCII字符的问题。一段数据先经过Base64编码为ASCII字符串后,可以在接收端,通过Base64解码还原为原数据后,而无需担心传输过程中失真。


很多时候,我们都将Base64编码作为数据加密后的传输 / 存储格式。例如,一段明文数据通过MD5 、SHA等手段加密后,经过Base64编码为字符串,就可以很方便地进行传输 & 存储。再比如,网络上的数字证书其实也是使用Base64编码的形式传输的,我们可以在浏览器上查看百度官网的数字证书:


  • 1、 查看百度官网的数字证书


image.png



  • 2、将证书保存到本地

image.png

  • 3、证书以 Base64 编码格式存储

image.png

需要注意的是,Base64并不是一种加密方式,明文使用Base64编码后的字符串通过索引表可以直接还原为明文。因此,Base64只能作为一种数据的存储格式。


2. 算法实现


2.1 Java 环境


Java 8之前,JDK中并没有提供Base64的算法实现,这其实挺让人纳闷的。虽然源码中sun.misc.BASE64Encoder,但是它其实并不是公有 API,而是 sun 团队内部使用的 API,最好不要在生产中使用。从Java 8,JDK 总算是补充了Base64的实现,例如:


import java.util.Base64;
标准 Base 64
System.out.println(Base64.getEncoder().encodeToString("".getBytes()));
Url Base 64
System.out.println(Base64.getUrlEncoder().encodeToString("".getBytes()));
MIME Base 64
System.out.println(Base64.getMimeEncoder().encodeToString("".getBytes()));
复制代码


Java 8之前,Bouncy CastleApache也提供了Base64的算法实现。


2.2 Android环境


Android SDK提供了Base64的算法实现,例如:


import android.util.Base64;
System.out.println(Base64.encodeToString("".getBytes(),Base64.DEFAULT));
复制代码


相对于Java 8的算法实现,Android提供的 API 更为灵活,可以通过flag自定义控制算法的输出。


3. 总结


  • Base 64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。
  • 需要注意的是,Base 64不是一种加密方式,只是一种编码方式。很多时候,我们都将Base64编码作为数据加密后的传输 / 存储格式
目录
相关文章
|
6月前
|
Java 数据安全/隐私保护
des加密+base64编码,base64解码+des解密
des加密+base64编码,base64解码+des解密
132 0
|
6月前
|
数据安全/隐私保护
18、cookie注入(base64加密)
18、cookie注入(base64加密)
55 0
|
16天前
|
存储 安全 算法
密码学基础:加密技术如何保护我们的在线生活
密码学基础:加密技术如何保护我们的在线生活
31 7
|
30天前
|
算法 安全 量子技术
量子计算与密码学:加密技术的新挑战
【10月更文挑战第29天】本文探讨了量子计算对密码学的影响,分析了现有加密技术面临的挑战,并展望了未来的发展趋势。量子计算的快速发展对传统公钥加密算法(如RSA和ECC)构成巨大威胁,同时也催生了后量子加密算法和量子密钥分发等新技术。文章强调了多元化、标准化和国际合作在构建量子安全加密体系中的重要性。
|
5月前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
49 2
|
3月前
|
安全 网络安全 量子技术
【骇入心灵的暗网迷雾与密码学的绝地反击】——揭秘网络空间中的致命漏洞与加密艺术的生死较量,一段关于光明与黑暗的数字史诗!
【8月更文挑战第7天】互联网是无限可能之地,亦暗藏危机。网络安全漏洞威胁隐私与安全,加密技术如坚盾保护我们。本文探索网络阴影及加密技术如何运作:对称加密快速但密钥易泄,非对称加密安全但速度较慢。通过示例展示两者差异,并展望加密技术未来发展,确保数字世界安全航行。
71 0
|
5月前
|
安全 算法 Java
密码学基础知识与加密算法解析
密码学基础知识与加密算法解析
|
4月前
|
算法 安全 网络安全
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。
|
5月前
|
算法 安全 Java
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
|
5月前
|
存储 Java 数据处理
Java的Base64加密解密详解
Java的Base64加密解密详解
下一篇
无影云桌面