现代密码学

为什么要学密码学?

image.png

什么是密码学?

image.png
密码学 = 算法 + 协议

image.png image.png
image.png

保密通信系统模型

image.png

密码算法

1、按功能分类

image.png

2、按使用方式分类

image.png
image.png

算法准则

image.png

常见加密算法的对比和说明

对比和说明

算法名称 类型 长度 安全性 速度 资源消耗 是否可逆 固定的明文
是否得到
固定的密文
Base64 随明文 可逆
URL编码 随明文 可逆
SHA-1 散列算法 160位(20字节) 不可逆
SHA-256 散列算法 256位(32字节) 不可逆
SHA-512 散列算法 512位(64字节) 不可逆
MD5 散列算法 128位(16字节) 不可逆
DES 对称加密 56位 较快 可逆 随机
AES 对称加密 128、192、256位 可逆 随机
RSA 非对称加密
可逆
ECC 非对称加密
可逆

Base64

https://developer.mozilla.org/zh-CN/docs/Glossary/Base64
base64不是加密和解密算法,只是方便在互联网上传播数据。
为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴

【特点】:
1、可逆,可以直接转换为明文
2、同样的明文加密后生成的密文是固定的

【常见用途】:密钥、证书、一些图片传输(格式一般为: data:image/png;base64,编码 )

【JS中使用】:window全局对象自带了2个方法进行编码和解码

  1. let b = window.btoa("Hello, world"); // 编码
  2. let a = window.atob(encodedData); // 解码

URL编码

不是加密和解密算法,只是为了方便在url上附带中文等非常规的字符

【特点】:
1、可逆,可以直接转换为明文
2、同样的明文加密后生成的密文是固定的

【常见用途】:url上传递中文等非常规的字符给后端识别

【JS中使用】:window全局对象自带了2个方法进行编码和解码

  1. let b = window.encodeURI("https://baidu.com:8080/?aaa=哈哈&bbb=2"); // 编码,'https://baidu.com:8080/?aaa=%E5%93%88%E5%93%88&bbb=2'
  2. let a = window.decodeURI(b); // 解码

散列算法(MD5、SHA)

又叫摘要算法,HASH算法,消息摘要

【特点】:
1、不可逆,无法解密
2、同样的明文加密后生成的密文是固定的

【常见用途】:
1、验证文件完整性
用md5加密文件,得到一个md5值,再把文件发给别人,告诉别人md5值;别人再用md5加密文件,看这个值是否一致,就知道文件中途有没有被修改过。

2、数据库储存用户密码(安全性中)
有的公司还是会把用户的密码用md5加密后储存在数据库,需要验证时,把用户发来的密码用md5加密,然后和数据库比对,就知道密码是否正确。
但是由于md5的特性,同样的明文生成的密文是一样的,因此可以通过建立一个庞大的库,来储存明文对应的密文,这样数据库被泄露,泄露的密文去库里搜索对应的明文(撞库),会有找到明文的风险,但是概率较低,除非是常见的密码如123456。
SHA系列的算法会比MD5安全,但是计算更慢

对称加密(DES、AES)

也叫单密钥加密,就是通过一个钥匙,来加密和解密,也就是钥匙是对称的(相同的)。DES是早期的对称加密算法,后来因为安全问题,被AES代替。

【特点】:
1、可逆,可以解密,
2、需要相同的密钥进行加密和解密
3、生成的密文不固定

【常见用途】:
1、无线通信:中间就算有人拿到密文,不知道key也无法解密
2、软件加密:适合一些无法获取到key的场景,不适合前后端传输,因为前端无法保证密钥不被查看到,一般用于内部系统,适合大数据量的加解密处理
3、硬件加密:如IC卡、门禁卡等,这些key一般不容易泄露

非对称加密(ECC,RSA)

非对称,是指钥匙不一样的,分为公钥和私钥。
公钥可以给别人(相当于用户名),私钥要自己留着(相当于密码)。
公钥和私钥是通过算法生成的,是一对的,加密时要用自己的私钥加密,别人解密需要用公钥解密。

【特点】:
1、可逆,可以解密,安全性高,加密速度较慢
2、需要密钥进行加密和解密,密钥加密,要用对应的公钥解密;公钥加密,要用对应的密钥解密。
3、生成的密文不固定

【常见用途】:
1、加解密,传输信息

JS - 密码学API - 图11

2、数字签名
验证数据没有被篡改
JS - 密码学API - 图12

3、数字证书
就是找个中间方,中间方能能保证用户(或服务器)的公钥一定是这个用户(或服务器)的

JS - 密码学API - 图13

=================

JS中的密码学

https://developer.mozilla.org/zh-CN/docs/Web/API/SubtleCrypto
Web Cryptography API 描述了一套密码学工具,规范了 JavaScript 如何以安全和符合惯例的方式实现加密。

这些工具包括生成、使用和应用加密密钥对,加密和解密消息,以及可靠地生成随机数。

但是目前不安全的网站可能无法直接使用这套API,Window.crypto直接是undefined。

第三方库

已经有很方便的第三方库,如CryptoJS,极大方便我们使用,参考如下:
https://www.yuque.com/yejielin/mypn47/nsyztg#Y6WUQ