当前位置:   article > 正文

RSA加密:Web前端登录账户密码加密传输_登录密码前端传输处理方法

登录密码前端传输处理方法

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

实现方式思路:

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

完整代码实现:

后端首先引入加密jar包

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

编写RSA加密工具类:

  1. package com.railway.common.utils;
  2. /**
  3. * Created by Administrator on 2022/2/8 0008.
  4. */
  5. import org.apache.commons.codec.binary.Base64;
  6. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  7. import javax.crypto.Cipher;
  8. import java.security.*;
  9. import java.security.interfaces.RSAPublicKey;
  10. public class RSAUtil{
  11. private static final KeyPair keyPair = initKey();
  12. private static KeyPair initKey() {
  13. try {
  14. Provider provider =new BouncyCastleProvider();
  15. Security.addProvider(provider);
  16. SecureRandom random = new SecureRandom();
  17. KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
  18. generator.initialize(1024,random);
  19. return generator.generateKeyPair();
  20. } catch(Exception e) {
  21. throw new RuntimeException(e);
  22. }
  23. }
  24. private static byte[] decrypt(byte[] byteArray) {
  25. try {
  26. Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
  27. Security.addProvider(provider);
  28. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
  29. PrivateKey privateKey = keyPair.getPrivate();
  30. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  31. byte[] plainText = cipher.doFinal(byteArray);
  32. return plainText;
  33. } catch(Exception e) {
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. public static String decryptBase64(String string) {
  38. return new String(decrypt(Base64.decodeBase64(string.getBytes())));
  39. }
  40. public static String generateBase64PublicKey() {
  41. PublicKey publicKey = (RSAPublicKey)keyPair.getPublic();
  42. return new String(Base64.encodeBase64(publicKey.getEncoded()));
  43. }
  44. }

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

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

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

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

  1. // 获取公钥
  2. export function encryption(username, password) {
  3.   return new Promise((resolve, reject) => {
  4.     PublicKey().then((res) => {
  5.       console.log(res);
  6.       let encrypt = new JSEncrypt(); //创建加密实例
  7.       let PublicKey = res.publicKey;
  8.       encrypt.setPublicKey(PublicKey);
  9.       username = encrypt.encrypt(username);
  10.       password = encrypt.encrypt(password);
  11.       resolve({
  12.         username: username,
  13.         password: password
  14.       })
  15.     })
  16.   })
  17. }

后端登录接收并解密:

 后端登录接口实现:

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

 源码获取: 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/948433
推荐阅读
相关标签