Android开发知识学习——编码、加密、Hash、序列化和字符集

学习资源来自:扔物线

加密

古代密码学

  • 起源:古代战争——古典密码学
  • 移位式加密:密码棒
    • 加密算法:缠绕木棒后书写
    • 密钥:木棒的尺寸规格
  • 替换式加密
    • 加密算法:替换文字
      按规则使⽤不同的⽂字来替换掉原先的⽂字来进行加密。
      码表:
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码字符:BCDEFGHIJKLMNOPQRSTUVWXYZA
原始书信:I love you
加密书信:J mpwf zpv
解读后:I love you

加密算法:替换⽂文字
密钥:替换的码表

现代密码学

不止可以用于文字内容,还可以用于各种二进制数据

对称加密

对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密

加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下:密文 + 解密算法 + 私钥 => 明文

在这里插入图片描述

  • 经典算法

    • DES(56 位密钥,密钥太短⽽逐渐被弃⽤)、AES(128 位、192 位、256 位密钥,现在最流行)
  • 对称加密作⽤

    • 加密通信,防⽌信息在不安全网络上被截获后,信息被人读取或篡改。
  • 对称加密(如 AES)的破解
    破解思路路

    • 拿到一组或多组原文-密文对
    • 设法找到一个密钥,这个密钥可以将这些原⽂-密文对中的原⽂加密为密文,以及将密文解密为原文的组合,即为成功破解

反破解
一种优秀的对称加密算法的标准是,让破解者找不到⽐穷举法(暴力破解法)更有效的破解手段,并且穷举法的破解时间足够长(例如数千年)。

对称加密的缺点
密钥泄露露:不能在不安全⽹络上传输密钥,一旦密钥泄露则加密通信失败。

非对称加密

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

加密过程如下:明文 + 加密算法 + 公钥 => 密文,
解密过程如下:密文 + 解密算法 + 私钥 => 明文

在这里插入图片描述
使⽤非对称加密通信,可以在不可信⽹网络上将双方的公钥传给对方,然后在发消息前分别对消息使用
对方的公钥来加密和使用⾃己的私钥来签名,做到不可信网络上的可靠密钥传播及加密通信。
在这里插入图片描述
由于私钥和公钥互相可解,因此非对称加密还可以应用于数字签名技术。
在这里插入图片描述
通常会对原数据 hash 以后对 hash 签名,然后附加在原数据的后⾯作为签名。这是为了让数据更小
在这里插入图片描述
经典算法:RSA(可用于加密和签名)、DSA(仅⽤用于签名,但速度更更快)

  • 非对称加密的优缺点

    • 优点: 可以在不安全网络上传输密钥
    • 缺点: 计算复杂,因此性能相比对称加密差很多
  • 非对称加密(如 RSA、ECDSA)的破解
    破解思路

    • 和对称加密不同之处在于,非对称加密的公钥很容易获得,因此制造原⽂-密⽂对是没有困难的
    • 所以,非对称加密的关键只在于,如何找到⼀个正确的私钥,可以解密所有经过公钥加密过的密文。找到这样的私钥即为成功破解
    • 由于非对称加密的⾃身特性,怎样通过公钥来推断出私钥通常是⼀种思路(例如 RSA),但往最佳⼿段依然是穷举法,只是和对称加密破解的区别在于,对称加密破解是不断尝试⾃己的新密钥是否可以将⾃己拿到的原文-密文对进⾏加密和解密,⽽非对称加密时不断尝试⾃己的新私钥是否和公钥互相可解。

反破解
和对称加密⼀样,⾮非对称加密算法优秀的标准同样在于,让破解者找不到⽐穷举法更有效的破解⼿段,并且穷举法的破解时间⾜够长。

密码学密钥和登录密码

  • 密钥 (key)
    • 场景: 用于加密和解密
    • 目的: 保证数据被盗时不会被人读懂内容
    • 焦点: 数据
  • 登录密码 (password)
    • 场景: 用户进入网站或游戏前的身份验证
    • 目的: 数据提供方或应用服务方对账户拥有者数据的保护,保证“你是你”,的时候才提供权限
    • 焦点: 身份

Base64

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

  • 什么是二进制数据?
    • 广义: 所有计算机数据都是二进制数据
    • 狭义:非文本数据即二进制数据

算法
将原数据每 6 位对应成 Base 64 索引表中的一个字符编排成一个字符串 (每个字符 8 位)
Base64 索引表:
在这里插入图片描述
编码示例:把Man进行Base64编码
在这里插入图片描述
编码示例:Base64的末尾补足
在这里插入图片描述
Base64 的用途

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

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

Base64 加密图片传输更安全和高效? ? ?
不。首先,Base64 并不是加密;另外,Base64 会导致数据增大 1/3,降低网络性能,增大用户流量开销,是画蛇添足的手段。 (最好不要拿来 diss 你们公司的后端哟,友善)Base64 对图片进行编码的用于在于,有时需要使用文本形式来传输图片。除此之外,完全没必要使用 Base64 对图片进行额外处理。

变种: Base58
bt币使用的编码方式,去掉了 Base64 中的数字“ 0 “,字母大写“ O ”,字母大写” I “,和字母小写” l “,以及“ + ”和“ / ”符号,用于bt币地址的表示,
Base58 对于 Base64 的改动,主要目的在于用户的便捷性。由于去掉了难以区分的字符,使得Base58 对于[人工抄写,更加方便。另外,去掉了”+”"/"号后也让大多数的软件可以方便双击选取。

URL 使用的百分号编码

在 URL 的字符串中,对一些不用于特殊用途的保留字符,使用百分号”%”为前缀进行单独编码,以避免出现解析错误。

例如,要在 http://hencoder.com/users 后面添加查询字符串,查询 name 为隐匿&伟大]的用如果直接写成 http://hencoder.com/user/?name=隐匿&伟大,"&”符号就会被解析为分隔符号、因此需要对它进行转码,转码后的 URL为 http://hencoder.com/user/?name=隐匿%26伟大

这种编码仅用于URL,目的是避免解析错误的出现

压缩与解压缩

  • 含义

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

    • 减小数据占用的存储空间

举例:
将下面的文本压缩

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

使用算法压缩后:

compress:a:1062;b:105
  • 压缩是编码吗?

    • 是。所谓编码,即把数据从一种形式转换为另一种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
  • 常见压缩算法

    • DEFLATE、JPEG、MP3 等。

图片与音频、视频编解码

  • 图片的编码:把图像数据写成 JPG、PNG 等文件的编码格式

  • 图片的解码:把JPG、PNG 等文件中的数据解析成标准的图像数据

  • 含义

    • 将图像、音频、视频数据通过编码来转换成存档形式 (编码),以及从存档形式转换回来 (解码)
  • 目的

    • 存储和压缩媒体数据 (大多数媒体编码算法会压缩数据,但不是全部)
  • 图片压缩粗暴算法举例
    一张纯白 (白色的 16 进制数值为 xffffff) 的 64x64 不透明像素图片,原数据格式大致为:

width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......f
fffff

使用算法压缩后:

width:64;height:64;ffffff:[0,0]-[63,63]

音频与视频的编码与上面的图片编码同理

序列化

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

  • 反序列化:把字节序列重新转换成内存中的对象
  • 序列化:把数据对象(一般是内存中的,例如JVM 中的对象)转换成字节序列的过程
  • 目的:让内存中的对象可以被存储和传输
    序列化是编码吗?
    • 严格来说不是,序列化是jvm管理的内容,编码是将A格式变B格式

Hash

  • 定义:把任意数据转换成指定大小范围 (通常很小)的数据
  • 作用:摘要、数字指纹
  • 经典算法: MD5、SHA1、SHA256等
  • 实际用途:
    • 唯一性验证
      Java 中的 hashCode() ⽅方法。

    • 数据完整性验证

    • 快速查找:
      hashCode()和 HashMap

    • 隐私保护
      当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值 (例如 MD5),以保障原数据的安全例如网站登录时,可以只保存用户密码的 Hash 值,在每次登录验证时只需要将输入的密码的 Hash值和数据库中保存的 Hash 值作比对就好,网站无需知道用户的密码。这样,当网站数据失窃时,用户不会因为自己的密码被盗导致其他网站的安全也受到威胁

注意: 这不属于加密

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

  • Hash 是加密吗?
    不是。Hash 是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此 Hash 不属于编码

字符集

含义:一个由整数向现实世界中的文字符号的 Map
分支:

  • ASCI: 128 个字符,1 字节
  • ISO-8859-1: 对 ASCII 进行扩充,1 字节
  • Unicode: 13 万个字符,多字节
    。 UTF-8: Unicode 的编码分支
    。 UTF-16: Unicode 的编码分支
  • GBK/GB2312/GB18030: 中国自研标准,多字节,字符集 +编码

课后题

  1. 【单选题】现代密码学可以加密什么数据?
    A. 文本数据
    B. 二进制数据
    C. 文本数据和二进制数据都可以

答案: C
答案解析:现代密码学可以加密的数据类型包括文本数据和二进制数据。文本数据通常是指人类可读的字符信息,例如文本文件、电子邮件等。二进制数据则是指计算机内部以0和1表示的数据,例如图片、音频、视频等。通过使用不同的加密算法和密钥,可以对这些数据进行加密和解密操作,以保护数据的机密性和完整性。因此,答案为C. 文本数据和二进制数据都可以。

  1. 【单选题】对称加密的加密与解密过程?
    A. 使用相同的密钥,相同的算法,对数据进行计算后得出的结果就是密文,之后再对密文进行计算之后得出的结果就是解密后的原数据
    B. 使用密钥和加密算法,对数据进行计算后得出的结果就是密文;使用相同的密钥,以及加密算法的逆过程,对密文进行计算之后得出的结果就是解密后的原数据
    C. 使用公钥对数据进行加密算法,计算得出的结果就是密文;使用私钥以及和加密过程同样的加密算法,对密文进行计算之后得出的结果就是解密后的原文。

答案: B
答案解析:对称加密的加密和解密过程是:使用相同的密钥和相同的算法,对数据进行加密计算,得到密文;然后使用相同的密钥和加密算法的逆过程,对密文进行解密计算,得到原始数据。因此,答案是B

  1. 【单选题】非对称加密的加密与解密过程?
    A. 使用相同的密钥,相同的算法,对数据进行计算后得出的结果就是密文,之后再对密文进行计算之后得出的结果就是解密后的原数据
    B. 使用密钥和加密算法,对数据进行计算后得出的结果就是密文;使用相同的密钥,以及加密算法的逆过程,对密文进行计算之后得出的结果就是解密后的原数据
    C. 使用公钥对数据进行加密算法,计算得出的结果就是密文;使用私钥以及和加密过程同样的加密算法,对密文进行计算之后得出的结果就是解密后的原文。

答案: C
答案解析:非对称加密的加密与解密过程是:使用公钥对数据进行加密算法,计算得出的结果就是密文;然后使用私钥以及和加密过程同样的加密算法,对密文进行解密计算,得到解密后的原文。因此,答案是C

  1. 【单选题】使用非对称加密进行数字签名的原理?
    A. 使用公钥对数据进行加密,然后使用私钥对数据进行解密。
    B. 使用私钥对数据进行加密,然后使用公钥对数据进行解密。

答案: B
答案解析:非对称加密是一种加密方法,其中有两个密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。数字签名是一种用于验证数据完整性和身份认证的技术,它使用了非对称加密的原理。数字签名的过程是:发送方使用私钥对数据进行加密,然后接收方使用公钥对数据进行解密,以验证数据的完整性和身份认证

  1. 【单选题】在实际运用中,为什么要用原数据的 hash 来进行数字签名?
    A. 因为直接签名会导致原数据变得不直接可读
    B. 因为如果直接对原数据进行签名,然后把签名附加在原数据的后面,会导致签名数据过大,占用传输和存储空间。
    C. 以上两点都有

答案: C
答案解析:在实际运用中,要使用原数据的哈希值来进行数字签名,而不是直接对原数据进行签名,原因有两点:

  1. 如果直接对原数据进行签名,然后把签名附加在原数据的后面,会导致签名数据过大,占用传输和存储空间。
  2. 使用哈希值进行签名可以保证原数据的完整性,因为任何微小的改变都会导致哈希值发生改变,从而使得签名无效。
  1. 【单选题】在不可信网络上直接传输对称加密的密钥,然后使用密钥来通信,会有什么风险?
    A. 会被别人拦截到密钥,然后窃听通信内容
    B. 会被别人拦截到密钥,然后篡改通信内容
    C. 以上两个都有

答案: C 答案解析:在不可信网络上直接传输对称加密的密钥,然后使用密钥来通信,会面临以下两个主要风险:

  1. 密钥被拦截:由于是在不可信网络上进行密钥传输,攻击者可能会在网络上拦截这个密钥。一旦攻击者获得了密钥,他们就能够解密之后的通信内容,从而窃听通信内容。
    2.通信内容被篡改:使用同一个密钥进行通信意味着攻击者不仅能够拦截通信内容,而且可以篡改通信内容。这是因为使用同一个密钥进行加密和解密,攻击者可以修改通信内容(例如,插入、删除或更改信息)而不改变加密和解密的结果。因此,正确答案是C
  1. 【单选题】在不可信网络上直接传输非对称加密的公钥,然后只使用对方的公钥来加密通信内容,而不是用自己的私钥来签名,有什么风险?
    A. 被别人拿到对方公钥,然后窃听通信内容
    B. 被别人拿到对方公钥,然后篡改通信内容
    C. 以上两个都有

答案: B
答案解析:在不可信网络上直接传输非对称加密的公钥,然后只使用对方的公钥来加密通信内容,而不是用自己的私钥来签名,仍然存在以下两个主要风险:

  1. 公钥被拦截:由于是在不可信网络上进行公钥传输,攻击者可能会在网络上拦截这个公钥。一旦攻击者获得了这个公钥,他们就能够解密之后的通信内容,从而窃听通信内容。
  2. 通信内容被篡改:使用对方的公钥进行加密,虽然不能直接解密内容,但攻击者仍然可以篡改通信内容。这是因为非对称加密的公钥只是用于加密,而不是用于验证信息的完整性。因此,即使通信内容被篡改,接收方也很难察觉。因此,正确答案是C

8.·【单选题】Base64 编码的本质是什么?
A. 把数据做成字符串
B. 把数据加密
C. 把数据加密并做成字符串

答案: A 答案解析:Base64 编码的本质并不是加密数据,而是将二进制数据转化为可打印的 ASCII
字符。它是一种编码方式,目的是在不考虑字符集和编码的情况下,将任意二进制数据转换为可打印的 ASCII
字符串。这样做的好处是可以方便地在不支持二进制数据的场景(例如电子邮件)中传输数据。因此,答案是A

9.【单选题】压缩与解压缩属于编码与解码吗?
A. 属于
B. 不属于

答案: A
答案解析:压缩与解压缩是一种将数据从一种格式转换为另一种格式的过程。在压缩过程中,数据被编码为一个更小的表示形式,这样可以节省存储空间或提高传输效率。解压缩则是相反的过程,将压缩的数据解码或转换回原始的形式。这两个过程可以看作是编码和解码的一种形式,因为它们涉及到将数据从一种形式转换为另一种形式。因此,答案是A

  1. 【单选题】序列化的本质是什么?
    A. 把二进制数据变成可读写的形式
    B. 把内存中的对象变成二进制形式

答案: B
答案解析:序列化的本质是把内存中的对象变成二进制形式。序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中,对象被转换为二进制序列,可以保存在文件中、传输到另一个计算机或通过网络发送到另一个进程。这个二进制序列可以在需要时通过反序列化重新创建对象。因此,答案为B

  1. 【单选题】Hash 的本质是?
    A. 把数据进行一种不可逆加密
    B. 从数据中提出摘要信息
    C. 把数据变成字符串

答案: B
答案解析:Hash 的本质是从数据中提取摘要信息。Hash函数将任意长度的二进制值映射为固定长度的二进制值,这个映射的结果就是所谓的“摘要”。摘要可以看作是原始数据的“指纹”,它提供了数据的简要表示,同时保留了足够的信息以便可以进行比对和验证。这种摘要信息的提取是单向的,也就是说,一旦数据被哈希,它就不能被还原回原始数据。因此,答案为B

  1. 【多选题】Hash 的作用有:
    A. 唯一性验证:判断一个数据是否是原数据,通过对比 hash 值就可以大概率做到
    B. 数据完整性验证:从网络上下载文件后,通过 MD5 值等 hash 值来判断文件是否损坏
    C. 快速查找:在 HashMap 的实现中,使用 hash 值快速寻找目标值的内存地址
    存地址
    D. 隐私保护:将用户的密码进行 hash 计算后再保存,防止网站数据泄露后暴露用户密码

答案: A B C D
答案解析:A. 唯一性验证:判断一个数据是否是原数据,通过对比 hash 值就可以大概率做到。这个选项是正确的,因为hash 函数的输出结果具有很高的唯一性,也就是说,输入稍微变化一点,输出的 hash值就会完全不同。因此,我们可以利用这个特性来判断一个数据是否是原数据,即通过对比 hash 值来判断。
B.数据完整性验证:从网络上下载文件后,通过 MD5 值等 hash 值来判断文件是否损坏。这个选项也是正确的,因为 hash 函数可以用于检测数据的完整性。在下载文件后,我们可以计算下载的文件和源文件的 hash值,并将这两个值进行对比。如果两个值相同,那么文件就是完整的;否则,文件就可能已经损坏。
C. 快速查找:在 HashMap 的实现中,使用hash 值快速寻找目标值的内存地址。这个选项也是正确的,因为 HashMap 是一种使用 hash 表的关联式容器,它通过计算键的hash 值来定位键值对在内存中的位置。这种做法可以大大提高查找速度,使得查找操作的时间复杂度为 O(1)。
D.隐私保护:将用户的密码进行 hash 计算后再保存,防止网站数据泄露后暴露用户密码。这个选项也是正确的,因为通过对用户的密码进行 hash
计算并保存其 hash 值而不是原始密码,即使网站数据泄露,攻击者也无法直接获取到用户的密码。这是因为 hash函数是单向的,即从原始密码到 hash 值的计算是很容易的,但是从 hash 值反推出原始密码是非常困难的。因此,通过保存用户密码的hash 值而不是原始密码,可以有效地保护用户的隐私。因此,所有选项 A、B、C、D 都是正确的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值