一、加密方式
1. 摘要算法
-
简介
消息摘要是把任意长度的输入揉和而产生长度固定的信息
-
特征
- 加密过程不需要密钥
- 经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文
- 消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用
-
特点
- 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的
- 消息摘要看起来是“随机的”。这些数据看上去是胡乱的杂凑在一起的
- 只要输入的消息不同,对其进行摘要后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出
- 只能进行正向的消息摘要,而无法从摘要中恢复出任何消息,甚至根本就找不到任何与原信息相关的信息
- 虽然“碰撞”是肯定存在的,但好的摘要算法很难能从中找到“碰撞”。即无法找到两条不同消息,但是它们的摘要相同
-
常见的摘要算法 (用的是哈希/散列算法)
CRC、MD5、SHA等
-
应用场景
数字签名,密码加密,文件完整性的校验 , 版权等应用场景
-
思考
由于相同的明文数据经过相同的消息摘要算法得到相同的密文这一特征,单一的摘要算法变得不安全了,很多简单常用的明文密码都得到了破解,那么如何解决这个问题呢?
其实我们可以对一个明文密码进行多次加密,或者多种算法混合进行加密,又或者在明文上添加序列,进行计算等等手段
-
注意
在电脑环境安全的情况下,不法分子通常是在传输阶段进行数据的截取,所以,在数据传输之前就要进行加密处理,也就是说在前端就要进行数据的加密,后端进行解密等处理
2. 对称加密
-
简介
-
特点
- 速度快,通常在消息发送方需要加密大量数据时使用
- 密钥是控制加密及解密过程的指令
- 算法是一组规则,规定如何进行加密和解密
-
应用场景
离线的大量数据加密(用于存储的)
-
常见的加密算法
DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等
-
对称加密的工作流程图
加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。如何把密钥安全地传递到解密者手上就成了必须要解决的问题
3. 非对称加密
-
简介
非对称加密算法是一种密钥的保密方法,加密和解密使用两个不同的密钥,公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密
-
特点
- 算法强度复杂
- 加密解密速度没有对称密钥算法的速度快
-
应用场景
数字签名(私钥加密,公钥验证)
-
常见的加密算法
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
-
非对称加密算法的工作流程图
4. 数字签名
-
简介
数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法
-
特点
数字签名通常使用私钥生成签名,使用公钥验证签名
-
签名及验证过程
-
发送方用一个哈希函数(例如MD5)从报文文本中生成报文摘要,然后用自己的私钥对这个摘要进行加密
-
将加密后的摘要作为报文的数字签名和报文一起发送给接收方
-
接收方用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要
-
接收方再用发送方的公用密钥来对报文附加的数字签名进行解密
-
如果这两个摘要相同、接收方就能确认该数字签名是发送方的
-
-
作用
- 确定消息确实是由发送方签名并发出来的
- 确定消息的完整性
-
思考
为什么有了摘要算法和加密算法还需要数字签名呢?
数字签名其实是两者的结合,是一种应用。非对称加密算法虽然私钥没有泄密,但是不法分子可以使用公钥对密文进行截取替换,而不需要对原来的密文进行解密,服务端是没有能力分清密文是谁发送的,被替换的都不知道,从而造成解密到的是被替换的密文
二、秘钥的生成
1. RSA加密算法
-
RSA算法的密钥格式
-
密钥长度介于 512 - 65536 之间(JDK 中默认长度是1024),且必须是64 的倍数。密钥的常用文件格式有pem(文本存储)或者der(二进制存储)
-
当使用Java API生成RSA密钥对时,公钥以X.509格式编码,私钥以PKCS#8格式编码
RSA使用pkcs协议定义密钥的存储结构等内容
协议 说明 PKCS#1 定义了RSA公钥函数的基本格式标准,特别是数字签名。 PKCS#2 涉及了RSA的消息摘要加密,已被并入PKCS#1中。 PKCS#3 Diffie-Hellman密钥协议标准。 PKCS#4 最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。 PKCS#5 基于口令的加密标准,描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述)。 PKCS#6 扩展证书语法标准,定义了提供附加实体信息的X.509证书属性扩展的语法。 PKCS#7 密码消息语法标准。为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。 PKCS#8 私钥信息语法标准。定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。 PKCS#9 可选属性类型。 PKCS#10 证书请求语法标准。 PKCS#11 密码令牌接口标准。 PKCS#12 个人信息交换语法标准。 PKCS#13 椭圆曲线密码标准。 PKCS#14 伪随机数产生标准。 PKCS#15 密码令牌信息语法标准。 链接地址
-
2. OpenSSL生成RSA密钥对的命令
没配置环境变量需要进入到bin目录下执行下面的命令
-
生成rsa私钥,文本存储格式,长度2048
openssl genrsa -out ../mycerts/rsa_private_key.pem 2048
-
根据私钥生成对应的公钥
openssl rsa -in ../mycerts/rsa_private_key.pem -pubout -out ../mycerts/rsa_public_key_2048.pub
-
私钥转化成pkcs8格式(java中使用的规定)
openssl pkcs8 -topk8 -inform PEM -in ../mycerts/rsa_private_key.pem -outform PEM -nocrypt > ../mycerts/rsa_private_key_pkcs8.pem
3. 接口加解密请求参数的流程
