这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
📖摘要
拒绝学习的惰性很可怕
现在与以前不一样,资料多、途径广,在这中间夹杂的广告也非常多。这就让很多初学者很难找到自己要的知识,最后看到有人推荐相关学习资料立刻屏蔽、删除,但同时技术优秀的资料也不能让需要的人看见了。久而久之把更多的时间精力都放在游戏、娱乐、影音上,适当的放松是可以的,但往往沉迷以后就很难出来,因此需要做好一些可以让自己成长的计划,稍有克制。
今天分享下 ——
springboot
+security
基于前后端分离的RSA
密码加密登录流程,欢迎关注!
重点说明一下关于这个方式请求时可能会出现参数携带+号被置换成空格的骚操作,请移步这篇文章:RSA加密请求报错:javax.crypto.BadPaddingException: Decryption error
🌂RSA加密简介
RSA加密
是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。
✨RSA加密
加密是为了安全性考虑,简单的说,加密是为了防止信息被泄露
场景:特工B要给特工A传递一条消息,内容为某一命令。
RSA的加密过程如下:
(1)A特工生成一对密钥(公钥和私钥),私钥不公开,A特工自己保留。公钥为公开的,任何人可以获取。
(2)A特工传递自己的公钥给B特工,B特工用A特工的公钥对消息进行加密。
(3)A特工接收到B特工加密的消息,利用A特工自己的私钥对消息进行解密。
在这个过程中,只有2次传递过程,第一次是A特工传递公钥给B特工,第二次是B特工传递加密消息给A特工,即使都被敌方截获,也没有危险性,因为只有A特工的私钥才能对消息进行解密,防止了消息内容的泄露。基于这一特性,我们可以在前后端登陆上进行密码加密。保证密码的安全性。
💖RSA密码加密(Java)实现
- 登录功能,密码肯定不能以明文形式传输,所以前端传过来的密码就应该是RSA加密过后的密码。
- 因为
RSA
是需要公钥和私钥的,公钥加密,私钥解密。那么就可以随机生成一个公钥私钥密钥对,然后将这个密钥对保存下来,不要泄露,将公钥给前端将密码加密,后端通过私钥解密。最终再使用加盐加密的方法将密码保存到数据库中- 下面是
RSA加密
的代码*- 实际工作中可以将公钥和私钥提前生成好,然后放到配置文件中去
- 说一下思路,具体用法可以直接运行
main
主函数慢慢研究。
Base64:封装base64编码。用于RSA密码编码解码
1 | java复制代码import com.fckj.fckjrestaurant.constant.Constant; |
✔Springboot
业务代码实现
逻辑:前端获取 publickey——公钥
,用公钥对密码进行编码加密,后端获取密码,用相对应的私钥解密加密数据,与数据库比对密码是否一致
controller
层就不写了,主要看 service
层业务逻辑代码:生成密钥对,放到 redis
里面存储,返回前端公钥
1 | java复制代码 @Override |
前端:基于iview和vue框架
1 | javascript复制代码前端用crypto-js进行加密, |
1 | javascript复制代码getPublicKey().then(res => { |
登录验证密码时解密对比
1 | java复制代码String inputDecryptData = ""; |
先获取私钥,我是放到redis里面,然后用私钥解密加密数据,同事获取数据库用户对象,获取密码同样用私钥解密比对与用户输入的密码是否一致
至此,Springboot&security基于前后端分离的RSA密码加密登录流程就完成了
🎉最后
- 更多参考精彩博文请看这里:《陈永佳的博客》
- 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!
本文转载自: 掘金