目录
一、对称加密
1、凯撒加密算法:位偏移
2、byte 和 bit
3、常见的对称加密算法
4、工作模式和填充模式
5、对称加密应用实战
二、非对称加密
6、非对称加密算法
7、非对称加密RSA的分段加密
8、非对称加密RSA的分段解密
9、RSA非对称加密/解密保存秘钥对
10、非对称加密RSA特点
三、消息摘要
11、消息摘要算法介绍
12、消息摘要MD5的使用
13、获取文件MD5的值
14、消息摘要sha1和sha256的使用
15、消息摘要应用实战
四、数字签名
16、数字签名
17、数字签名实战
五、加密与解密总结
18、加密算法总结
19、加密算法应用注意点
1 byte = 8 bit
中文当中utf-8编码每一个中文占用3个字节,24位;若是GBK编码,则占用2个字节,即16位;
1)DES(Data Encryption Standard,数据加密标准)加密之后,密文的长度的8的整数倍,秘钥长度是8字节(password),即64bit位
2)AES(Advanced Encryption Standard,高级加密标准)加密和解密,秘钥长度是16字节,即128bit位
3)对称加密密钥长度分析:
4)对称加密的特点:加密计算量小、速度块,适合对大量数据进行加密的场景。(记住这个特点,实际使用是会用到的)
工作模式和填充模式的使用:默认工作模式和填充模式使用的是ECB/PKCS5Padding
CBC模式必须添加一个额外的参数
NoPadding填充模式:
-DES:明文必须是8个字节的整数倍
-AES:明文必须是16个字节的整数倍
数据库配置加密 ?添加一个依赖
算法:DES、AES
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
怎么解决这个问题?
私钥加密,公钥解密;
公钥加密,私钥(自己的)解密;
非对称加密RSA生成秘钥对:
私钥加密和公钥加密的数据字节数不能超过245个字节,否则会出现下述的异常
javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes
分段加密思想:
设置一个常量,表示RSA一次加密的最大字节数245byte;然后将明文字段加密若干次,若待加密的明文的字节数正好是245的整数倍,
则直接加密完即可;若加密到剩余不足245字节的明文,使用普通方式进行加密即可;
分段加密用到的类:
Cipher:加密/解密算法核心类
ByteArrayOutputStream:字节数组输出流
Cipher类加密三部曲:
1)创建Cipher类的对象
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
2)初始化加密/解密的方式:加密、解密
cipher.init(加密/解密,key);
3)加密/解密
doFinal() ---- 完成多部分加密或解密操作,这取决于该密码如何初始化。
doFinal(byte[] input) ---- 在单一部分操作中加密或解密数据,或完成多部分操作
doFinal(byte[] input, int inputOffset, int inputLen) ---- 在单一部分操作中加密或解密数据,或完成多部分操作
RSA一次解密的最大字段为?256 Byte
在解密之前需要使用Base64解码
每一次的生成的公钥和私钥都是不一样的
保存方式:
将生成的私钥和公钥以常量的形式保存起来,
使用秘钥工厂KeyFactory来创建秘钥工厂对象 kf = KeyFactory.getInstance("算法");
使用工厂对象 kf 来生成公钥和私钥
其中私钥使用PKCS8EncodeKeySpec(参数:KeySpec)编码规范:Only RSAPrivate(Crt)KeySpec and PKCS8EncodedKeySpec supported for RSA private keys
公钥使用的编码规范 :Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys
秘钥对:公钥和私钥
非对称:公钥加密,私钥解密;私钥加密,公钥解密;
加密:MAX 245
解密:MAX 256
加密解密速度较慢
公钥互换
存储秘钥对:存储在常量中
数字签名:校验数据安全?????HOW!!!
1)定义:
Message Digest有称为Digital Digest(数字摘要),它由一个单向Hash加密函数对消息进行作用而产生,消息摘要能够保证了消息的完整性。
算法:MD5、sha1、sha256
2)特点:
*加密后不可逆
*消息摘要的结果是 固定长度,无论数据有多大,摘要结果都是定长;
*应用场景:加密用户登录注册登录
MD5摘要:验证软件是否是正版的、完整的
加密的原文:"你那里天气好吗?有没有什么新闻可以当做笑话"
特殊情况:3ee055f0e75d445cb58524fd7807e4,MD5加密数据长度为:30
使用:
1)创建消息摘要的对象
2)使用对象调用加密方法
1)使用MD5对文件摘要
应用场景:文件唯一性、病毒判断
java.io.FileNotFoundException: spring-framework-5.1.4.RELEASE-dist (系统找不到指定的文件。) ?????
文件的后缀名没有写!!!
消息摘要两部曲:
1)创建MessageDigest对象
2)调用digest()方法
sha1:摘要的结果为20位,转为16进制后为40位
sha256:摘要的结果为32位,转为16进制后为64位
MD5:摘要的结果为16位,转为16进制后为32位
常用算法:MD5、sha256
应用场景:登录/注册用户密码,MD5密文传输
签名四部曲:
* 1)、创建数字签名对象
* 2)、初始化签名:必须传递私钥
* 3)、传入原文
* 4)、开始签名
校验签名四部曲:
* 1)、创建数字签名对象
* 2)、初始化校验:传入公钥
* 3)、传入原文
* 4)、开始校验
数字签名总结:
RSA数字签名 = 数字签名
消息摘要和非对称数字加密的组合
签名的时候使用私钥
校验的时候使用公钥
作用:校验数据的完整性
数字签名流程图分析:
1)时间戳
MessageDigestUsage里面的
2)校验重复登录
1)对称加密
算法:DES、AES
加密速度快
对称:有秘钥就可以破解
应用场景:只要可逆都可以使用,比如缓存信息
2)非对称加密
RSA
RSA加密原理基于四个数学知识:“欧互模”:互质定理、欧拉函数、欧拉定理、模反元素
密钥对:公钥和私钥
秘钥对不能手动指定,有系统生成
公钥加密,私钥解密;私钥加密,公钥解密
公钥互换
缺点:加密计算量大、速度慢,适合对少量数据进行加密的场景。(刚好和对称加密是反着来的)
3)消息摘要
算法:MD5 sha1 sha256
摘要后不可逆
摘要后是固定长度,和数据大小无关
应用场景:不可逆都可以使用,比如用户密码
4)数字签名
算法:消息摘要结合RSA,比如SHA256withRSA
私钥签名、公钥检验
应用场景:校验户数的完整性,支付宝支付校验支付参数
传递的仍然是明文,但是在明文中加上数字签名,就可以验证明文数据是否被更改过!
针对非对称加密加密计算量大、速度慢,只适合对少量数据进行加密这个不足,实际开发中,
我们如果遇到要对大量数据加密,那就一定要采用RSA+AES加密相结合的方式,
用AES加密数据,而用RSA加密AES的密钥。
当然,需要加密的数据如果数据量不大的话,可以直接用RSA加密。
到这里,我们也可以看出AES对称加密和RSA非对称加密其实是互补的,我们经常把它俩结合起来使用。