稀土掘金 稀土掘金

RSA加密:Web前端登录账户密码加密传输

​ 「这是我参与2022首次更文挑战的第14天,活动详情查看: 2022首次更文挑战

     一般在做系统时候对安全性要求比较高,现在通常选择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;
	}

大家点赞、收藏、关注、评论查看主页获取联系! 打卡 文章 更新 192/  365天

哆哆女性网周公解梦梦见种树起名10画法用字世界未解之谜故事大全沧州品牌网站建设公司关于新学期的作文600字男孩用谨字起名好吗传奇故事灵异事件网页搜索优化seo劳务工程公司起名大全册子猪的宝宝宜用字起名seo快速排名关键词女人起名姓于高端的网站制作公司精准化营销推广医药网站优化冯起个名周易免费测公司名字测试打分结果测试教育培训行业营销推广方案唐姓男起名商业楼起名平面设计免费学的网站给姓钟的宝宝起名字专业的网络营销推广只管向前奔跑阅读答案网络营销书重生药王医嫁永城市中介公司门户网站怎么建设属鼠的如何起名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化