前后端分离密码登陆加密RSA方案(java后端)

摘要:
//从“jsencrypt”导入jsimport{JSEncryption}//提交表单方法dataFormSubmit(){this.dataForm.password=this.passwordEncryption(this.dataForm.password+','+newDate().getTime())this.$http({url:

前言:密码加密有很多种方案,这里不做过多讨论,本篇文章是基于RSA加密实现。

首先在前端工程中需要引入加密js: "jsencrypt": "2.3.1",(注意单独导入可能报错,可以删除整个node_modules,然后重新npm install)

然后在登陆提交表单的地方代码修改如下:

// 引入js
import {JSEncrypt} from 'jsencrypt'

 // 提交表单方法
      dataFormSubmit () {
        this.dataForm.password = this.passwordEncryption(this.dataForm.password + ',' + new Date().getTime())
      this.$http({
              url: this.$http.adornUrl('/sys/login'),
              method: 'post',
              data: this.$http.adornData({
                'username': this.dataForm.userName,
                'password': this.dataForm.password,
                'uuid': this.dataForm.uuid,
                'captcha': this.dataForm.captcha
              })
      },
  //密码加密方法
  passwordEncryption (passwordUser) {
    console.log(this.rsaKey + ' ********后台获取公钥********** ')
    let publicKey = this.rsaKey // 从后台获取公钥
    let encryptor = new JSEncrypt()  // 新建JSEncrypt对象
    encryptor.setPublicKey(publicKey)  // 设置公钥
    let passwordEncryp = encryptor.encrypt(passwordUser)  // 对密码进行加密
   console.log(passwordEncryp + ' ****************** ')
    return passwordEncryp
  },
// 获取公钥的方法
getRsaKey () {
  this.$http({
    url: this.$http.adornUrl('/sys/login/rsaKey'),
    method: 'get'
  }).then(({data}) => {
    this.rsaKey = data
  })
}

  

 后端工程代码如下

//controller 密码加密后用密钥解密
form.setPassword(AccountSecurityUtils.decrypt(form.getPassword()));

//AccountSecurityUtils 工具类
public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsD1gI70BxYujhNw8NpaVKRXkcRofoeUbN9Dj5m3i3h9XAIS6LkjI01L4ieRpTHnMEzoXUY8a2/svDf//xuHuDJlZBNtCXK4DPx5x4zHdUWDjFGpWlMQzhsqQlfs0tkN5gP095g27L0ki/NrRuBpgxP1q2dHKpL37sBF8XNRpedwIDAQAB";

private static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKwPWAjvQHFi6OE3Dw2lpUpFeRxGh+h5Rs30OPmbeLeH1cAhLouSMjTUviJ5GlMecwTOhdRjxrb+y8N///G4e4MmVkE20JcrgM/HnHjMd1RYOMUalaUxDOGypCV+zS2Q3mA/T3mDbsvSSL82tG4GmDE/WrZ0cqkvfuwEXxc1Gl53AgMBAAECgYEAogyhgWi0bRYW92Z/yv6julvMQRE8l3sBcJ//uTbwbwqECrw1tkYu+wsTOCyO2pHnCjPoX6zJTziSeMJpMCPsToCm3+EO38Ki/12RSJ51DgSl7C4R8leoFMZAmExQO4L1rVae2dJS80dvfpLeNiquJw4y7xjXIBUYbQfu+mNKHoECQQDic2F3UMm05M1d/POQHqsuMohoDhwVM0N8/SdbA4fpYFFOahMWdmuFclYbkgTwfYBdGMH/UHLsCGWVv8z48jKHAkEAwoMID93DzTsZWqxAoyGDg7GGdNsMPvYErRxwcOVNpdQXv8F7IAXOslLTvJF542dplCCNzLgyupwxMPlMLuZAkQJANpcoHPJt3dz2oTzUnp62F6n49lTIclfsYhpJPYipYBpnH2c0+MpNe1sn5Peblzo6ErdgNSN4wOv5SVN2n2ELywJAGjyiccFwD9bQ7LIfZeG3Y6QmhsylMjjtGIylfhTwDFY3fd4TRZaC8vrJJL5aupnQW/KoLd0KurEm0XxPEmRsgQJARKNghvpoce39bD/BbC2AojY5Ea6afLzW+GllxHGNGkgGu+x3c4PIUDAt8f60021WoENtonEQpEjzbIU5XpefJA==";

/**
* 加密数据和秘钥的编码方式
*/
public static final String UTF_8 = "UTF-8";

public static final String RSA_ALGORITHM_NO_PADDING = "RSA";

public static String decrypt(String password) {
try {
String getPass = decryptRSADefault(PRIVATE_KEY, password);
String longtime = StringUtils.substringAfterLast(getPass, ",");
if ((System.currentTimeMillis() - Long.valueOf(longtime) > 30 * 60 * 1000)) {
        //抛出自定义异常
throw new MYException("密码超时");
}
return StringUtils.substringBeforeLast(getPass, ",");
} catch (Exception e) {
if (e instanceof MYException) {
throw new MYException(e.getMessage());
}
log.error("password is :" + password + " 密码解密异常:" + e.getMessage());
}
return null;
}
public static String decryptRSADefault(String privateKeyStr, String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM_NO_PADDING);
byte[] privateKeyArray = privateKeyStr.getBytes();
byte[] dataArray = data.getBytes();
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyArray));
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

Cipher cipher = Cipher.getInstance(RSA_ALGORITHM_NO_PADDING);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return new String(cipher.doFinal(Base64.decodeBase64(dataArray)), UTF_8);
}


相关代码参考博客:https://blog.csdn.net/qq_37346607/article/details/85237368

免责声明:文章转载自《前后端分离密码登陆加密RSA方案(java后端)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#抽象类java字符编码(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

笔记:bash脚本入门

编写bash脚本,首先在文件的第一行加入如下代码: #! /bin/bash 比如文件test1.sh的完整代码: #! /bin/bash echo "Just a test!" 执行如下指令: chmod +x test1.sh && ./test1.sh 即可看到效果。 一、变量相关 1、输入变量 read var 2、输出变量 ec...

测试用例--用户登录

什么是等价类划分和边界值分析方法呢?首先,这二者都隶属于最常用、最典型、也是最重要的黑盒测试方法。 等价类划分方法,是将所有可能的输入数据划分成若干个子集,在每个子集中,如果任意一个输入数据对于揭露程序中潜在错误都具有同等效果,那么这样的子集就构成了一个等价类。后续只要从每个等价类中任意选取一个值进行测试,就可以用少量具有代表性的测试输入取得较好的测试覆...

Android开发 WebView的详解

前言  WebView 是Android显示html内容的主要方式,当然TextView也可以加载html内容.但是WebView除了功能更加强大,最重要的是还能调用Html里的JavaScript语言,这才是我们必需学习WebView的原因. 加载内容方式方式一:加载一个网页 mWebView.loadUrl("http://www.baidu.com"...

Windows服务器实现自动化部署-Jenkins

在引入自动化部署工具的时候,对比了jenkins和gitlab CI,jenkins有非常丰富的插件,配置起来方便。gitlab CI更倾向于脚本配置,当然jenkins也可以使用pipeline实现全脚本化配置。我们这里主要讲述jenkins的自动化部署。基本组合是jenkins+git+msbuild,实现从代码仓库拉取、编译、打包、部署、自动化测试。...

Centos7 之 MariaDB(Mysql) root密码忘记的解决办法

MariaDB(Mysql) root密码忘记的解决办法 1.首先先关闭mariadb数据库的服务 # 关闭mariadb服务命令(mysql的话命令就是将mariadb换成mysql) [root@node ~]# systemctl stop mariadb # 通过进行查询服务或者通过端口查询服务还是否存在 [root@node ~]# ps aux...

SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)

前言:   俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的。目前市面上比较流行的Git可视化管理工具有SourceTree、Github Desktop、TortoiseGit,综合网上的一些文章分析和自己的日常开发实践心得个人比较推荐开发者使用SourceTree,因为SourceTree同时支持Windows和Mac...