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

密码学

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

  • 移位式加密 : 如密码棒,是用布条缠绕在木棒上的方式来对书信进行加密

    加密算法 : 缠绕木棒后书写

    密钥 : 木棒的尺寸

  • 替换式加密 : 按规则使用不同的文字替换原先的文字来进行加密

    码表 :

    原始字符 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

    加密字符 : BCDEFGHIJKLMNOPQRSTUVWXYZA

    原始书信 : I love you

    加密书信 : J mpwf zpv

    解读后 : I love you

    加密算法 : 替换文字

    密钥 : 替换的码表

现代密码学 :

不只可以用于文字加密,还可以加密任何二进制数据

非对称加密的出现使得密码学有了更广泛的用途 : 数字签名

  • 对称加密 : 通信双方使用同一个密钥,使用加密算法配合密钥来进行加密,解密时使用加密过程的完全逆过程配合密钥来进行解密。


    编码、加密、Hash、序列化、字符集_第1张图片
    对称加密模型.png

    简化模式即上面古典密码学中替换式加密的模型 : 对文字进行规则化替换来加密,对密文进行逆向的规则化替换来解密。

    • 经典算法

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

    • 对称加密作用

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

    • 对称加密(如AES)的破解

      破解思路

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

      反破解

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

    • 对称加密的缺点

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

  • 非对称加密 : 使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据


    编码、加密、Hash、序列化、字符集_第2张图片
    非对称加密模型.png

    非对称加密的使用的是复杂的数学技巧,在古典密码学中没有对应的模型。

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


    编码、加密、Hash、序列化、字符集_第3张图片
    非对称加密通信.png

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


    编码、加密、Hash、序列化、字符集_第4张图片
    签名与验证.png

    通常会对原数据hash以后对hash签名,然后附加在原数据的后面作为签名,这是为了让数据更小。


    编码、加密、Hash、序列化、字符集_第5张图片
    完整签名与验证.png
  • 经典算法

    RSA(可用于加密和签名)、DSA(仅用于签名,但速度更快)

  • 对称加密作用

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

  • 非对称加密(如RSA、ECDSA)的破解

    破解思路

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

    反破解

    和对称加密一样,非对称加密算法优秀的的标准同样在于,让破解者找不到比穷举法更有效的破解手段,并且穷举法的破解时间足够长

  • 对称加密的优缺点

    • 优点 : 可以在不安全网络上传输密钥
    • 缺点 : 计算复杂,因此性能相比对称加密差很多
密码学密钥与登录密码
  • 密钥 (key)
    • 场景 : 用于加密和解密
    • 目的 : 保证数据被盗时不会被人读懂内容
    • 焦点 : 数据
  • 登录密码(password)
    • 用户进入网站或游戏前的身份验证
    • 目的 : 数据服务方或应用服务方对账户拥有者数据的保护,保证【你是你】的时候才提供权限
    • 焦点 : 身份
Base64

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

  • 什么是二进制数据

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

    将原数据每6位对应成base64索引表中的一个字符编排成一个字符串(每个字符8位)

  • Base64索引表


    编码、加密、Hash、序列化、字符集_第6张图片
    base64索引表.png

    编码实例 : 把 [Man] 进行base64编码


    编码、加密、Hash、序列化、字符集_第7张图片
    Man-base64编码.png

    编码实例 : base64的末尾补足


    编码、加密、Hash、序列化、字符集_第8张图片
    base64的末尾补足.png
  • Base64的用途

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

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

  • Base64加密图片传输是否更安全和高效

    并不是。首先,Base64并不是加密;另外Base64会导致数据增大约1/3,降低网络性能,增大用户流量开销,是画蛇添足的手段

    Base64对图片进行编码的用途在于,有时需要使用文本形式来传输图片。除此之外,完全没必要使用Base64来对图片进行额外处理

  • 变种Base58

    比特币使用的编码方式,去掉了Base64中的数字“0”,字母大写“O”,字母大写“I”和字母小写“l”,以及“+”和“/”符合,用于比特币地址的表示

    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
    aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    

    使用某种算法压缩后的数据为:

    compress:a:1062;b:105
    

    具体的压缩场景有很多,因此压缩算法也会复杂得多,上面只是一个原型算法

  • 压缩是编码吗

    是。所谓编码即把数据从一种形式转换成另一种形式。压缩过程属于编码过程,解压缩过程属于解码过程

  • 常见压缩算法

    DEFLATE、JPEG、MP3等

图片与音频、视频编解码
  • 含义

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

  • 目的 : 存储和压缩媒体数据(大多数媒体编码算法会压缩数据,但不是全部)

  • 图片压缩粗暴算法举例

    一张纯白(白色的16进制数值为0xffffff)64 * 64 的不透明像素图片,原始数据格式大致为 :

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

  • 目的 : 让内存中的对象可以被储存和传输
  • 序列化是编码吗 : 不是
  • 和编码的区别 : 编码是把数据由一种数据格式转换成另一种数据格式,而序列化是把数据由内存中的对象(而不是某种具体的格式)转换成字节序列
Hash
  • 定义 : 把任意数据转换成指定大小范围(通常很小,例如256字节以内)的数据

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

  • Hash的实际用途

    • 唯一性验证,例如java中的hashCode()方法

      如何重写hashCode()方法 : 把equal()方法中每个用于判断相等的变量都放进hashCode()中,一期生成一个尽量不会碰装的整数即可

      为什么每次重写equal()方法都需要,因为要把新的判断条件放进hashCode()

    • 数据完整性验证

      从网络上下载文件后,通过比对文件的hash值(MD5、SHA1),可以确认下载的文件是否有损坏。如果下载的文件hash值和文件提供方给出的hash值一直,则证明下载的文件是完好无损的

    • 快速查找 : HashMap

    • 隐私保护

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

      注意 : 这不属于加密

  • 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 : 中国自研标准,多字节,字符集 + 编码

你可能感兴趣的:(编码、加密、Hash、序列化、字符集)