加密、编码、Hash、序列化和字符集

Author Avatar
dev.liang 2月 13, 2019
  • 在其它设备中阅读本文章

最近在学习 HenCoder Plus 的二期课程,想巩固一下基础的同时,也在这里记录一下,结合讲义做一下笔记。记录加密、编码、Hash、Base64、压缩与解压缩、序列化和字符集

密码学

古典密码学

起源于古代战争:在战争中,为了防止书信被截获后重要信息泄漏,人们开始对书信进行加密。

移位式加密

如密码棒,使用布条缠绕在木棒上的方式来对书信进行加密。

替换式加密

按照一定规则使用不同的文字来替换掉原先的文字来进行加密。

现代密码学

  • 可以加密任何二进制数据
  • 非对称加密的出现使得密码学有了更广泛的用途:数字签名
对称加密

原理:通信双方使用同一个密钥,使用加密算法配合上密钥来进行加密,解密时使用加密过程的完全逆过程配合密钥来进行解密。
使用密钥和加密算法对数据进⾏转换,得到的无意义数据即为密文;使⽤密钥和解密算法对密文进行逆向转换,得到原数据

image

对称加密的经典算法

DES(56位密钥,密钥太短而逐渐被弃用)、AES(128位、192位、256位密钥,现在最流行)

对称加密作用

加密通信,防止信息在不安全网络上被截获后,信息被人读取或篡改

对称加密缺点

不能在不安全网络上传输密钥,一旦密钥泄露则加密通信失败。

非对称加密

原理:使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据。

使⽤非对称加密通信,可以在不可信网络上将双方的公钥传给对⽅,然后在发消息前分别对消息使用
对方的公钥来加密和使⽤⾃己的私钥来签名,做到不可信网络上的可靠密钥传播及加密通信。

image

由于私钥和公钥相互可解,因此非对称加密还可以用于数字签名技术。

image

经典算法:RSA(可用于加密和签名)、DSA(仅用于签名,但速度更快)
优缺点:
  • 有点:可以在不安全网络上传输密钥
  • 缺点:计算复杂,因此性能相比对称加密差很多

密钥和登录密码

密钥 key

  • 场景:用于加密和解密
  • 目的:办证数据被盗时不会被人读懂内容
  • 焦点:数据

登录密码 password

  • 场景:用户进入网站或游戏前的身份认证
  • 目的:数据提供方或应用服务方对账户拥有者数据的保护,保证 only you 才提供权限
  • 焦点:身份

编码

Base64

概念:将二进制数据转换成由 64 个字符组成的字符串的编码算法

二进制数据?
  • 广义:所有计算机数据都是二进制数据
  • 狭义:非文本数据 即 为二进制数据
Base64 索引表

image

Base64 用途
  • 将二进制数据扩充了储存和传输途径(例如可以把数据保存到文本⽂件、可以通过聊天对话框或短信形式发送二进制数据、可以在 URL 中加入简单的二进制数据)
  • 普通的字符串在经过 Base64 编码后的结果会变得肉眼不可读,因此可以适⽤于一定条件下的防 偷窥(较少⽤)
Base64 缺点

因为自身的原理(6 位变 8 位),因此每次 Base64 编码之后,数据都会增⼤约 1/3,所以会影响存储和传输性能。

Base64 加密图片传输安全高效?

不安全不高效!首先,自身并不是加密,另外 Base64 会导致数据增大,降低网络性能,增大用户流量开销。Base64 对图片进行编码的用处在于,有时需要使用文本形式来传输图片。除此之外,没有必要使用它对图片进行额外处理。

压缩与解压缩

含义
  • 压缩:将数据使用更具有存储优势的编码算法进行编码。
  • 解压缩:将压缩数据解码还原成原来的形式,以方便使用。
目的

减小数据占用的存储空间

压缩是编码吗?

是编码,编码,是指把数据从一种形式转换为另外一种形式。压缩过程属于编码过程,解压缩过程属于解码过程。

常见压缩算法

DEFLATE、JPEG、MP3

序列化

把数据对象(一般是内存中的,例如 JVM 中的对象)转换成字节序列的过程。对象在程序内存里的存放形式是散乱的(存放在不同的内存区域、并且由引用进行连接),通过序列化可以把内存中的对象转换成一个字节序列,从而使用 byte[] 等形式进行本地存储或网络传输,在需要的时候重新组装(反序列化)来使用。

目的

让内存中的对象可以被存储和传输

序列化是编码吗?

不是

序列化和编码的区别?

编码是把数据由一种数据格式转换成另一种数据格式;而序列化是把数据由内存中的对象(而不是某种具体的格式)转换成字节序列。

Hash

把任意数据转换成指定大小范围(通常很小,例如 256 字节以内)的数据。

作用

相当于从数据中提出摘要信息,因此最主要用途是数字指纹。

实际用途:

唯一性验证。例如 java 中 hashCode()方法。

怎么重写 hashCode 方法?

把 equals() 方法中的每个用于判断相等的变量都放进 hashCode() 中,一起生成一个尽量不会碰撞的整数即可。

实际用途
  • 数据完整性验证。从⽹络上下载⽂件后,通过⽐对文件的 Hash 值(例如 MD5、SHA1),可以确认下载的⽂件是否有 损坏。如果下载的⽂件 Hash 值和⽂文件提供⽅给出的 Hash 值⼀致,则证明下载的⽂文件是完好⽆损 的。
  • 隐私保护(不属于加密)。当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值(例如 MD5),以保障原数据的安全。 例如网站登录时,可以只保存用户密码的 Hash 值,在每次登录验证时只需要将输⼊的密码的 Hash 值和数据库中保存的 Hash 值作⽐对就好,⽹站无需知道⽤户的密码。这样,当⽹站数据失窃时,用户不会因为⾃己的密码被盗导致其他⽹站的安全也受到威胁。
  • 快速查找。 HashMap
hash 是编码吗?

不是。hash 是单向过程,是不可逆的,无法进行逆向恢复操作,因此 hash 不属于编码。

hash 是加密吗?

不是。 hash 是单向过程,无法进行逆向恢复操作,因此 hash 不属于加密。(MD5 不是加密!)

字符集

一个由整数向现实世界中的文字符号的 map

分支
  • ASCII:128 个字符,1 字节 ISO-8859-1:对 ASCII 进⾏行行扩充,1 字节
  • Unicode:13 万个字符,多字节

    UTF-8:Unicode 的编码分⽀支
    UTF-16 :Unicode 的编码分⽀支

  • GBK / GB2312 / GB18030:中国⾃自研标准,多字节,字符集 + 编码