信息编码

Ascii 码

概述

ASCII((American Standard Code for Information Interchange):美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646,ASCII 第一次以规范标准的类型发表是在 1967 年,最后一次更新则是在 1986 年,到目前为止共定义了 128 个字符。

背景

在计算机 中,所有的数据在存储和运算时都要使用二进制表示(因为计算机用高电平和低电平分别表示 1 和 0),例如,像 a、b、c、d 这样的 52 的字母(包括大些)以及 0、1 等数字还有一些常用的符号(例如 *、#、@ 等)在计算机存储时也要使用二进制数来表示,而具体使用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(即编码),而大家如果想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了 ASCII 编码,同意规定了上述常用符号用哪些二进制数来表示。

ascii.png

代码演示

for (const s of 'abcd') {
  const code = s.charCodeAt()
  const str = String.fromCharCode(code)
  console.log(code, str)
}

// 97 a
// 98 b
// 99 c
// 100 d
js

Base64

常见应用场景:将字符嵌入到网页图片中表达正常图片内容。

概念

Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2 ^ 6 = 64,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节(8 位)有 24 个比特,对应 4 个 Base64 单元,即 3 个字节可由 4 个可打印字符来表示,它可用来作为电子邮件的传输编码。

在 Base64 中的可打印字符包括字母 A-Za-z、数字 0-9,这样共有 62 的字符,此外两个可打印符号在不同的系统中而不同。

应用场景

Base64 常用于处理文本数据的场合,表示、传输、存储一些二进制数据,包含 MIME 的电子邮件及 XML 的一些复杂数据。

为什么要使用 Base64,直接使用 ASCII 不也可以?

有些场景,一些特殊字符,例如 @ 符号,%、$ 在传统的一些电子邮件里面传输,是没有办法正常显示的,所以我们要制定一种简单的规则。

实现原理

以输入字符 6666 为例:

base64.png

Base64 编码的核心原理是将二进制数据进行分组,每 24 Bit(3 字节)为一大组,再把一个大组的数据分成 4 个 6 Bit 的小分组。由于 6 Bit 数据只能表示 64 个不同的字符(2 ^ 6 = 64),所以这也是 Base64 的名字由来。

总结

Base64 是一种特定内容编码方式,用指定的 64 个字符来对应任何的一种数据进行编码。

原理就是将二进制的数据转成文本数据,对于非二进制方式都先转成二进制,连续使用 6 比特计算二进制的值,对应索引的码表。

常见应用场景:Web 网页端直接嵌入 base64 格式的图片。

某些厂家会制定特定的字符表,来达到混淆的目的。例如某东、某宝会制定自己一种特定的码表,虽然我们可以拿到一种 “明文” 的形式,特定的一种 base64 字符串,但是如果我们没有码表,如果按照正常的一种码表去解码,得到的结果肯定是非正常的结果。只有拿到正常特定码表下的 base64 字符串才能得到想要的结果。

md5

概念

MD5 即信息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,它可以产出一个 128 位元(16 位元组)的散列值(hash value),用于确保信息传输完整性。

主要功能就是输入任意长度的信息,经过处理,就可以输出为128 位的信息(数字指纹),不同的输入可以得到不同的输出结果。

作用

  • 防止篡改
    • 下载文件时需要校验文件的 md5 是否和公共的一致
  • 防止看到明文
    • csdn 密码使用明文存储事件,引以为戒
    • 避免撞库,很多人喜欢在不同的系统中使用相同的密码

安全性

我们经常会听到一种说法,MD5 被 “破解” 了。但其实这种说法是不正确的,我们并不能通过一个 MD5 散列值,马上计算出原文。从密文推算出明文理论上是不可能的。

MD5(M)=Hash

其中 M 指的是密码的明文,Hash 表示密码散列后的密文。实际上,所以的被 “破解” 其实是指下面这种情况:

MD5(M1)=MD5(M2)

即给定消息 M1,能够计算获取 M2,使得 M2 产生的散列值与 M1 产生的散列值相同。如果,MD5 的抗碰撞性就已经不满足了,使用 MD5 不再是安全的散列算法。

MD5 从本质上来说,就是不可逆的。我们可以通过某种特定的算法产生哈希碰撞,即 A 经过算法可以得到 B , C 也可以通过算法得到 B。

在线解 MD5

它其实本质上是一个超级大的数据库,收录了很多常见的,例如 admin md5 值是什么,可以通过密文直接去数据库查原文,并不是通过某种算法去计算出结果。

AES

概念

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称为 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES,已经得多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)与 2001 年 11 月 26 日发布与 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。2006 年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家 Joan DAemen 和 Vbincent Rijmen 所设计,结合两位作者的名字,以 Rijndael 为名投稿高级加密标准的甄选流程。(Rijndael 的发音近似于 “Dhine doll”)。

使用

AES 属于对称加密,使用过程如下:

secret = encrypt(key, message)
js

输入要加密的信息和密文,输出加密后的明文,解密方也可以这样使用。

message = decrypt(key, secret)
js

输入加密后的明文和 key,可以解读出原始信息。

常见加密算法

在软件开发中,常用的对称加密算法有:

算法 密钥长度 工作模式 填充模式
DES 56/64 ECB/CBC/PCBC/CTR/… NoPadding/PKCS5Padding/…
AES 128/192/256 ECB/CBC/PCBC/CTR/… NoPadding/PKCS5Padding/PKCS7PAdding/…

密钥长度直接决定加密强度,工作模式和填充模式可以看成是对趁机密算法的参数和格式选择。

很多小伙伴在设置密码时,长度是非常短的或者有简短意义的,这样很容易被社工库或彩虹表的方式计算出来。理论上密码的长度越长,计算的模式和计算的复杂度就越高,所以推荐大家讲自己设置密码的长度不要默认只有八位。

总结

Ascii 码是一种特定的编码方式,流行于欧洲国家,表达 128 常见的字符与操作符号,含义有限。

Base64 是一种编码方式,可以用特定的 64 的字符来表达所有的二进制数据(关注算法的实现)。

Md5 是一种广泛使用的算法,输入任意长度的信息,输出 128 位的信息(非加密手段),可以对一致性和完整性进行校验。

AES 是一种对称加密算法。