现代密码学

为什么要学密码学?

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