一般在做系统时候对安全性要求比较高,现在通常选择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. php $this self,php中self与$this的区别
  2. Python 14.1 TCP/IP协议简介
  3. mysql分组后组内排序_数据小白的转行之路-MYSQL(七)
  4. 经典日剧、电影、动漫
  5. 蔡砚刚:uAVS3对标x265 veryslow将节省30%码率
  6. 人工机器:作为归纳系统的深度学习
  7. Mysql Oracle Tidb对空值的处理
  8. 数据科学包8-pandas高级内容之聚合统计
  9. python prettytable格式设置_Python prettytable模
  10. inceptor手册
  11. vmlinux vmlinuz zimage uimage 区别
  12. 68个Python内置函数详解,进阶必备!
  13. 怎么启动mysql2008_SQL Server 2008初次启动
  14. Is your Tecplot 360 EX liense valid?
  15. Linux驱动笔记--主机驱动与外设驱动概念以及分离思想
  16. 基于Python完成云知声平台的语音合成接口
  17. 两张图片切换比例虚拟进度条
  18. 小程序常见故障解决方法分享|微信小程序平台常见拒绝情形
  19. amh搭建php网站,AMH6.0发布 (免费版本) – AMH终于可以免费用了。
  20. (转自)何新:谈“玄”(一)

热门文章

  1. html在线填空题,答案(填空题).html
  2. QML会眨眼的流星雨制作Demo
  3. 043_《Delphi程序开发范例宝典(第2版)》
  4. android sdk广告是什么东西,Android广告SDK的Package
  5. unity开发知识点小结01
  6. 草绘常用命令+配置编辑器
  7. 3dmax打开错误html,3dmax出现错误解决办法
  8. 基于STM32结合CubeMX学习Free-RT-OS的源码之消息队列
  9. PS里的抠图工具都有哪些?各类工具的适用情景
  10. vue集成echarts,vue+echarts实现中国地图和河南省地图