现代密码学
为什么要学密码学?
什么是密码学?
密码学 = 算法 + 协议
保密通信系统模型
密码算法
1、按功能分类
2、按使用方式分类
算法准则
常见加密算法的对比和说明
对比和说明
算法名称 | 类型 | 长度 | 安全性 | 速度 | 资源消耗 | 是否可逆 | 固定的明文 是否得到 固定的密文 |
---|---|---|---|---|---|---|---|
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个方法进行编码和解码
let b = window.btoa("Hello, world"); // 编码
let a = window.atob(encodedData); // 解码
URL编码
不是加密和解密算法,只是为了方便在url上附带中文等非常规的字符
【特点】:
1、可逆,可以直接转换为明文
2、同样的明文加密后生成的密文是固定的
【常见用途】:url上传递中文等非常规的字符给后端识别
【JS中使用】:window全局对象自带了2个方法进行编码和解码
let b = window.encodeURI("https://baidu.com:8080/?aaa=哈哈&bbb=2"); // 编码,'https://baidu.com:8080/?aaa=%E5%93%88%E5%93%88&bbb=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、加解密,传输信息
2、数字签名
验证数据没有被篡改
3、数字证书
就是找个中间方,中间方能能保证用户(或服务器)的公钥一定是这个用户(或服务器)的
=================
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