一般在做系统时候对安全性要求比较高,现在通常选择https协议来进行数据传输。很多情况下一般的javaweb网站,如果安全要求不是很高的话,用https协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为请求如果在传输过程中被截了,就可以直接拿明文密码登录网站了。 为了传输数据的安全、今天就采用RSA加密方式来进行加密。

实现方式思路:

编写加解密公共方法类--公钥方法--前端在向后台发起登录请求之前,先请求后台获取公钥的方法,然后经过加密之后再发起登录请求--前端代码需引入jsencrypt.min.js文件--后端接收前端传输过来的密文进行解密--完成登录

完整代码实现:

后端首先引入加密jar包

<!--需要导入的依赖jar--><!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 --><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version></dependency>

编写RSA加密工具类:

package com.railway.common.utils;
/*** Created by Administrator on 2022/2/8 0008.*/import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPublicKey;public class RSAUtil{private static final KeyPair keyPair = initKey();private static KeyPair initKey() {try {Provider provider =new BouncyCastleProvider();Security.addProvider(provider);SecureRandom random = new SecureRandom();KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);generator.initialize(1024,random);return generator.generateKeyPair();} catch(Exception e) {throw new RuntimeException(e);}}private static byte[] decrypt(byte[] byteArray) {try {Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();Security.addProvider(provider);Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);PrivateKey privateKey = keyPair.getPrivate();cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] plainText = cipher.doFinal(byteArray);return plainText;} catch(Exception e) {throw new RuntimeException(e);}}public static String decryptBase64(String string) {return new String(decrypt(Base64.decodeBase64(string.getBytes())));}public static String generateBase64PublicKey() {PublicKey publicKey = (RSAPublicKey)keyPair.getPublic();return new String(Base64.encodeBase64(publicKey.getEncoded()));}}

编写前端需要调用后端生成公钥方法接口:

//   后端登录生成公钥方法@RequestMapping(value = "/getPublicKey", method = RequestMethod.GET)public R RSAKey(){String publicKey = RSAUtil.generateBase64PublicKey();return R.ok().put("publicKey",publicKey);}

前端向后台发送登录请求前,先向后台请求获取公钥,加密后再发起登录请求。

需要提前引入 jsencrypt.min.js文件或npm安装就行

// 获取公钥
export function encryption(username, password) {return new Promise((resolve, reject) => {PublicKey().then((res) => {console.log(res);let encrypt = new JSEncrypt(); //创建加密实例let PublicKey = res.publicKey;encrypt.setPublicKey(PublicKey);username = encrypt.encrypt(username);password = encrypt.encrypt(password);resolve({username: username,password: password})})})
}

后端登录接收并解密:

后端登录接口实现:

/*** 登录*/@RequestMapping(value = "/sys/login",method = {RequestMethod.GET,RequestMethod.POST})public Map<String, Object> login(@RequestParam String username, @RequestParam String password)throws IOException {username=username.replaceAll(" ", "+");password=password.replaceAll(" ", "+");username = RSAUtil.decryptBase64(username.trim());password = RSAUtil.decryptBase64(password.trim());System.out.println(username+password);SysUserEntity user = sysUserService.queryByUserName(username);//账号不存在、密码错误if(user == null || !user.getPassword().equals(new Sha256Hash(password, user.getSalt()).toHex())) {return R.error("账号或密码不正确");}//账号锁定if(user.getStatus() == 0){return R.error("账号已被锁定,请联系管理员");}//生成token,并保存到数据库R r = sysUserTokenService.createToken(user.getUserId());r.put("user",user);return r;}

源码获取:

大家点赞、收藏、关注、评论啦 、查看

RSA加密:Web前端登录账户密码加密传输相关推荐

  1. RSA加密web前端用户名密码加密传输至后台并解密

    RSA加密web前端用户名密码加密传输至后台并解密 编写加解密公共方法类RSAUtils import org.apache.commons.codec.binary.Base64; import j ...

  2. web前端登录密码保存业务

    web前端登录密码保存业务 一.首先要想实现密码保存业务这个需求,首先要明白localstorage,sessionStorage,以及cookie三者之间的区别,为什么要明白这三者之间的联系呢,是应 ...

  3. 前端利用jsencrypt.min.js进行RSA加密(常用在登录密码加密)全局方法封装

    步骤: 项目中下载 npm install jsencrypt untils文件下新建js文件,封装公共方法 import JSEncrypt from 'jsencrypt/bin/jsencryp ...

  4. 用RSA实现Web单点登录密码的加密传输

    在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...

  5. 基于RSA的WEB前端密码加密方案

    受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...

  6. Java 对用户密码加密(Jeecg 登录密码加密方式)MD5andDES方式

    jeecg对应的路径为org.jeecgframework.core.util下的PasswordUtil  可参考作为其他应用的加密方式或者第三方使用Jeecg账号验证登录: 直接上代码(可直接调用 ...

  7. Web前端登录拼图验证功能,看你是人还是机器

    前言 相信大家经常在各种网站上登录.注册.下发短信.活动等会看到,系统会弹出来一个滑块验证,让你把一个滑块滑到指定空缺的位置(还有其他种形式,比如按顺序点击文字或图案等等),系统会校验,校验正确则登录 ...

  8. Web前端——登录界面hover效果

    登录界面hover效果 Demo1(来源:B站"艾恩小灰灰") 源代码: html+javascript: css: 效果图: Demo1(来源:B站"艾恩小灰灰&quo ...

  9. Visual Studio Code:Web前端——登录、注册界面、个人相册

    制作一个网页,有登录界面.注册界面和个人相册界面,注册成功后在登录界面登录成功后进入个人相册界面,个人相册里的所有图片是顺时针旋转的.若失败返回登录界面,登录界面和注册界面可相互切换. 代码: log ...

最新文章

  1. job for nginx.service failed_用Python操作Kubernetes的Job
  2. 面试官:你知道java类是怎么跑起来的吗?问的我一脸懵
  3. HDU-1789-Doing Homework again
  4. asp.net MVC 的处理流程
  5. python笔记:断言assert
  6. 微服务实践(七):从单体式架构迁移到微服务架构
  7. HAProxy 的负载均衡服务器,Redis 的缓存服务器
  8. WPF编程,TextBlock中的文字修饰线(上划线,中划线,基线与下划线)的使用方法。...
  9. C++对象继承中的内存布局
  10. oracle中通过游标实现查询
  11. php中money用什么显示,如何使用PHP将十进制数转换为单词(money格式)?
  12. Android 阿里云推送集成指南
  13. java 定时为每月10号_Java定时任务配置(Scheduled注解)
  14. 2017 暑期实习校园招聘(Java后台开发方向)面经分享
  15. Python地理数据处理 四:矢量数据读写(二)
  16. 深信服技术支持工程师(安全、云计算方向)面试题目
  17. win10 microsoft edge 浏览器收藏夹位置
  18. 分享一篇超全的 Vue 相关的资源,值得收藏!
  19. 共享电单车属于哪个部门管理_“彩虹大战”乱象丛生,长沙将规范共享电单车,实行配额管理...
  20. 智慧物流车联网远程管理终端设备横向评估与优劣势对比

热门文章

  1. 基于瓦片的热力图生成(Qt |C++)
  2. MySql基础知识、存储引擎与常用数据类型
  3. 行测——逻辑推理——2复合命题推理
  4. GFFcompare详解
  5. 威胁人员Hackers
  6. Spring Boot体验
  7. Improving Training of Text-to-image Model Using Mode-seeking Function
  8. 软件工程之软件配置管理
  9. LCD液晶屏的驱动方式
  10. AutoJs学习-实现几款极速版软件自动刷金币的思路参考-下