一、编码算法
不是加密和解密,为了数据在网络间更方便的传输而产生/本地存储字节数组
1.1 base64
由A-Z a-z 0-9 + /共64个字符组成,去掉I i o O + /即base58
对照表:
注意:base64以3个字节为一组,如果最后一组不够3个字节补=
1.2 url编码
application/x-www-from-urlencoded:为了防止中文乱码
1.3 字节数组与16进制互转(见代码)
二、摘要算法
2.1 定义
又叫Hash算法,散列函数、数字摘要、消息摘要。它是一种一种单向算法,用户可以通过hash算法对目标信息生产一段特别的唯一hash值,但不能通过这个hash值重新获得目标信息。
2.2 应用场景
- 密码、信息完整性校验、数字签名
2.3 常见算法(实现见code demo)
- MD5:结果占128位==>16个byte==>转成16进制字符后是32个
eg:1111 1111 --> ff - SHA:安全散列算法
- sha-256==>转成16进制字符后是64个
- 其他sha-0、sha-1、sha-512
MAC:消息认证码,是一种带有密钥的hash函数。
三、对称加密
3.1 定义
也叫单密钥加密。即加密和解密的过程用的是相同的密钥,但相比非对称加密,因为只有一把密钥,因此速度更快,更适合大文件加解密。
3.2 常见算法
- DES :data encryption standard 已经过时
- AES:advanced encryption standard 替代DES
- 其他:3DES,Blowfish,IDEA,RC4,RC5,RC6
3.3 分类
- 分组加密,又叫块加密
- 序列加密
3.4 块加密常用的加密模式
- ECB
定义:electronic code book,电码本模式,将整个明文分成若干相同的小段,然后对每一段进行加密。
特点:每段之间互不依赖,同样的明文总是生成同样的密文。
- CBC模式
定义:cipher block chaining 密文分组链模式,所谓链,即密文分组之间像链条一样互相连接在一起,先将明文切成若干小段,然后每一段与上一段的密文段(第一个块没有上一个密文段,使用的initialization vector,初始化向量 IV)进行运算后,再与密钥进行加密。
特点:串行处理,同样的明文每次生成的密文不一样
3.5 块加密常用的填充模式
对于固定的加密算法,每个块有固定大小(blockSize),比如8个byte,明文分块后,加密前需要保证对最后一个块的大小为8个byte,如果不够则使用特定数据填充。
-
NoPadding:不自动填充
des时要求原文必须时8个字节的整数倍,aes时必须是16字节的整数倍 -
PKCS5Padding(限制了块大小为8个byte的PKCS7Padding)/PKCS7Padding
-
PKCS:public-key-cryptography standards 公钥密码学标准
四、非对称加密
加密和解密用的是两个不同的密钥,(public key 和 private key)公钥可以给任何人,私钥总是自己保留。
对称加密使用相同的密钥,但对不同的原始内容加密采用不同的密钥,导致密钥数量巨大 难以维护
可以用公钥加密,私钥解密,也可以私钥加密,公钥解密
- 数字签名
发送方A:原始内容–>通过摘要算法获取原始内容的摘要str1–>把str1用发送方的私钥加密–>数字签名。
接收方B:用发送方的公钥验证签名并解密–> 得到原始内容–>对原始内容进行摘要算法str2–>比较str1 == str2(保证未被篡改)
注意:不是用公钥hash 如果用公钥,别人没你的私钥,怎么验证呢?
签名是先进行摘要再进行rsa,所以在摘要算法一定的情况下,签名后得到的字符串长度总是一定的
目的:验证发送方的身份,校验完整性。
- 数字信封
对称加密的密钥分发不安全–>发送方用接收方的公钥加密之–>接收方再用自己的私钥解密之
注意:为什么会有分发密钥呢?不是约定好的嘛?密钥会随着数据一起发送给接收方也会被拦截
- 数字证书
Q:有了数字签名就可以证明发送者的身份了,还会有什么问题?
A:A服务端,B客户端,A给B发消息。B这里存储的A的公钥被换成了C的公钥,A发送的信息也换成了C的私钥生成的签名。现在需要一种手段证明’B这里存储的A的公钥’确实是A的公钥。
-
ca
certificate authority,使用pk(public key infrastructure)技术的机构,也可以内部搭建,使用ejbca。 -
ca根证书
Q:B除了存储A的数字证书对于的ca公钥,假设还要N个人给B发信,B都有保存他们的数字证书CA公钥吗?
A:不需要,CA认证中心可以个B一份‘根证书’,里面存储的CA公钥可以验证所以CA分中心颁发的数字证书。