位置: IT常识 - 正文

vue前端RSA加密java后端解密的方法(vue sha256加密)

编辑:rootadmin
vue前端RSA加密java后端解密的方法 一、前言

推荐整理分享vue前端RSA加密java后端解密的方法(vue sha256加密),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue 加密解密,vue 加密解密,vue前端密码加密码,vue rsa加密解密,vue js加密,vue rsa解密,vue rsa解密,vue rsa解密,内容如对您有帮助,希望把文章链接给更多的朋友!

最近安全测试的总是测出安全漏洞来,让开发改。

想了想干脆把请求参数都加密下,前端加密后端解密,这样总差不多了。

看了下AES加密,是对称的,前后端用这个不太行。

vue前端RSA加密java后端解密的方法(vue sha256加密)

于是想到用RSA加密,是非对称的,可以前端加密后端解密。

二、前端代码与用法

1.前端是vue项目,使用时,需要先执行:

npm i jsencrypt

把这个依赖下载到node_modules里面。

2.可以增加一个工具类文件:项目名/src/utils/commonUtil.js,内容如下:

import JSEncrypt from "jsencrypt";export default { encodeRSA(word, keyStr) { //这个是公钥,有入参时用入参,没有入参用默认公钥 keyStr = keyStr ? keyStr : 'MIGxxxxxxxxxxxxxxxxxxxxxxxxxx'; //创建对象 const jsRsa = new JSEncrypt(); //设置公钥 jsRsa.setPublicKey(keyStr); //返回加密后结果 return jsRsa.encrypt(word); }}

3.然后,需要使用的地方,就可以这样用:

//引入第2步的工具类import commonUtil from '@utils/commonUtil'//引入一个发请求的方法,这个也需要npm iimport axios from 'axios'//一个发请求用的方法export function myget(userId) { return axios.get(`/xxx/user`, { headers: { //先把参数rsa加密下,再用urlEncoder转下码,然后放header里传给后台 userId: encodeURIComponent(commonUtil.encodeRSA(userId, null)), }, }).then(res => { return res.data })}

这样,就把加密参数放入header里的userId里了,后台可以取出后解密。

三、后端代码与用法

1.可以先写个工具类,如下:(RSA公钥和私钥可以用这个工具类生成,然后自己记录后使用)

import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import javax.crypto.Cipher;import java.security.KeyFactory;import java.security.Security;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Map;import java.util.HashMap;import java.security.KeyPairGenerator;import java.security.SecureRandom;import java.security.KeyPair;public class RSAUtil { //公钥,可以写前端 public static String public_key="MIGxxxxxx"; //私钥,只能放后端 public static String private_key="MIICxxxxxxxx"; public static void main(String[] args) { //解密数据 try { //生成公钥和私钥 genKeyPair(); String publicKey = keyMap.get(0); //打印出来自己记录下 System.out.println("公钥:" + publicKey); String privateKey = keyMap.get(1); //打印出来自己记录下 System.out.println("私钥:" + privateKey); //获取到后,可以放这里,测试下能不能正确加解密 publicKey = public_key; privateKey = private_key; String orgData = "test"; System.out.println("原数据:" + orgData); //加密 String encryptStr =encrypt(orgData,publicKey); System.out.println("加密结果:" + encryptStr); //解密 String decryptStr = decrypt(encryptStr,privateKey); System.out.println("解密结果:" + decryptStr); } catch (Exception e) { e.printStackTrace(); } } /** * RSA公钥加密 * * @param str 加密字符串 * @param publicKey 公钥 * @return 密文 * @throws Exception 加密过程中的异常信息 */ public static String encrypt(String str,String publicKey) throws Exception { //base64编码的公钥 byte[] decoded = decryptBASE64(publicKey); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RSA加密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); String outStr = encryptBASE64(cipher.doFinal(str.getBytes("UTF-8"))); return outStr; } /** * RSA私钥解密 * * @param str 加密字符串 * @param privateKey 私钥 * @return 明文 * @throws Exception 解密过程中的异常信息 */ public static String decrypt(String str, String privateKey) throws Exception { //64位解码加密后的字符串 byte[] inputByte = decryptBASE64(str); //base64编码的私钥 byte[] decoded = decryptBASE64(privateKey); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA解密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; } //编码返回字符串 public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } //解码返回byte public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * 密钥长度 于原文长度对应 以及越长速度越慢 */ private final static int KEY_SIZE = 1024; /** * 用于封装随机产生的公钥与私钥 */ private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); /** * 随机生成密钥对 * @throws Exception */ public static void genKeyPair() throws Exception { // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // 初始化密钥对生成器 keyPairGen.initialize(KEY_SIZE, new SecureRandom()); // 生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); // 得到私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); String publicKeyString = encryptBASE64(publicKey.getEncoded()); // 得到私钥字符串 String privateKeyString = encryptBASE64(privateKey.getEncoded()); // 将公钥和私钥保存到Map //0表示公钥 keyMap.put(0, publicKeyString); //1表示私钥 keyMap.put(1, privateKeyString); }}

2.使用时,把公钥内容放入前端js,私钥内容就放后端代码里,就可以和前端联调测试了。样例如下:

//测试接口 @GetMapping("/xxx/user") public String myget(HttpServletRequest request) { //先用非对称算法RSA解密一下 try { //从header里获取到参数 String userId = request.getHeader("userId"); log.debug("收到userId,内容为:"+userId); //这里解密,注意先用URLDecode处理了下,如果前端没有用的话,这里也不用处理 userId = RSAUtil.decrypt(URLDecoder.decode(userId,"UTF-8"), RSAUtil.private_key); log.debug("RSA解密成功,userId为"+userId); } catch (Exception e) { log.error("RSA解密失败",e); //如果解密失败,就返回null return null; } return "成功"; }
本文链接地址:https://www.jiuchutong.com/zhishi/298740.html 转载请保留说明!

上一篇:JavaScript charCodeAt() 方法

下一篇:Anaconda 3.6安装教程(详细版本)---可运行Python代码(anaconda3.5.2安装教程)

  • 关闭当前窗口快捷键ctrl加什么(关闭当前窗口快捷键手机)

    关闭当前窗口快捷键ctrl加什么(关闭当前窗口快捷键手机)

  • 华为畅享10的解锁方式有哪些(华为畅享10解账户锁的刷机包下载)

    华为畅享10的解锁方式有哪些(华为畅享10解账户锁的刷机包下载)

  • 苹果11通话怎么录音(苹果11通话怎么保存录音)

    苹果11通话怎么录音(苹果11通话怎么保存录音)

  • 电脑版芒果tv怎么下载(电脑版芒果TV怎么开弹幕)

    电脑版芒果tv怎么下载(电脑版芒果TV怎么开弹幕)

  • pr导出时间很长 是因为什么(premiere导出时间太长)

    pr导出时间很长 是因为什么(premiere导出时间太长)

  • 微信收款助手是干嘛的(微信收款助手是干什么用的)

    微信收款助手是干嘛的(微信收款助手是干什么用的)

  • 微信公众号可以放几个视频(微信公众号可以注销吗)

    微信公众号可以放几个视频(微信公众号可以注销吗)

  • 抖音关注请求是对方发的吗(抖音关注请求是对方发过来的吗)

    抖音关注请求是对方发的吗(抖音关注请求是对方发过来的吗)

  • 抖音如何获得qq权限(下载抖音微信登录)

    抖音如何获得qq权限(下载抖音微信登录)

  • 手机为啥没有4g网(手机为啥没有信号)

    手机为啥没有4g网(手机为啥没有信号)

  • 暂停服务的手机号充值后还能用吗(暂停服务的手机号是欠费了吗)

    暂停服务的手机号充值后还能用吗(暂停服务的手机号是欠费了吗)

  • 苹果7静音模式怎么取消(苹果7静音模式在哪里关闭)

    苹果7静音模式怎么取消(苹果7静音模式在哪里关闭)

  • 手机下载不了微信怎么回事(手机下载不了微课掌上通)

    手机下载不了微信怎么回事(手机下载不了微课掌上通)

  • 为什么微信加了人没有显示(为什么微信加了几个人就显示操作频繁)

    为什么微信加了人没有显示(为什么微信加了几个人就显示操作频繁)

  • 星特朗80dx和80eq的区别

    星特朗80dx和80eq的区别

  • 页眉距边界距离怎么弄(页眉距边界距离为0.5厘米)

    页眉距边界距离怎么弄(页眉距边界距离为0.5厘米)

  • i78700是几核处理器(i7870是什么处理器)

    i78700是几核处理器(i7870是什么处理器)

  • 拼多多助力免单要审核多久(拼多多助力免单怎么助力才算成功)

    拼多多助力免单要审核多久(拼多多助力免单怎么助力才算成功)

  • vivos1有红外吗(vivo s1有红外遥控功能吗)

    vivos1有红外吗(vivo s1有红外遥控功能吗)

  • qq怎么看单项好友有谁(qq怎么看单项好友的消息)

    qq怎么看单项好友有谁(qq怎么看单项好友的消息)

  • win7系统输入法切换不了的解决方法(win7系统输入法切换快捷键)

    win7系统输入法切换不了的解决方法(win7系统输入法切换快捷键)

  • VMware11 安装Mac OS X10 提示不可恢复怎么办(vmware11安装win10)

    VMware11 安装Mac OS X10 提示不可恢复怎么办(vmware11安装win10)

  • 浏览器:跨域及解决方法(前端解决浏览器跨域问题)

    浏览器:跨域及解决方法(前端解决浏览器跨域问题)

  • 城建税减半征收政策文件
  • 企业收取的租金应当计入
  • 农产品 税率
  • 可回收再生资源有哪些
  • 以个人名义汇货要交税吗
  • 个体户收现金可以开发票吗
  • 净资产包含哪些方面
  • 资产负债表应付账款怎么算
  • 出纳单据交接表怎么填写
  • 材料成本差异借贷方向
  • 子公司注销资金还母公司冲实收资本吗
  • 中小企业的管理者角色和技能有什么要求
  • 一般纳税人无票收入会计分录
  • 一般纳税人取得3%专票可以抵扣吗
  • 股息红利税补缴什么意思
  • 小规模纳税人标准2019
  • 商品房买卖合同没有约定逾期交房违约金
  • 化妆品的成本利润是多少
  • 购买的风机如何做分录
  • 处置资产发生的清理费计入
  • 监督机关包括哪些
  • 房地产企业工程款支付流程
  • 一般纳税人有什么优惠政策
  • 资本公积金转增资本属于所有者权益吗
  • 税控盘没清盘怎么处罚
  • 纳税人指什么意思
  • 税务局备案的企业是什么
  • 货物劳务和应税收入区别
  • 所得税费用什么时候结转
  • win10禁止使用网络
  • win11如何更改开始菜单位置
  • 购入的车辆入账包括哪些费用
  • MacOS Big Sur 11.3网页怎么设置时间限制?
  • exescope是什么软件
  • 汇算清缴哪些表必填
  • 商业银行提取的贷款损失准备金
  • 耕地佔用税的缴纳期限
  • 企业财务人员如何防范电信诈骗
  • phpsubstr_replace
  • php加密方式有哪些
  • php js
  • 神经网络模型python
  • php 性能优化
  • 公司之间借款利息需要开票吗
  • python怎么做gui
  • 本年利润借方余额是什么意思呢
  • 往来账款应该怎么记账
  • 所得税费用的账目处理
  • 以前年度多交增值税账务处理
  • 城镇土地使用税暂行条例
  • 珠宝行业的会计
  • 企业所得税债务重组一般性税务处理
  • 前几个月的印花税怎么算
  • 生产成本要如何核算
  • 损益类账户借贷方向增减
  • 所得税多缴纳分录
  • 注册资金凭证怎么做
  • 原始凭证按来源分为
  • mysql不能运行
  • centos7 home
  • 安装最新的Google应用
  • ubuntu系统服务器
  • win7 32位内存最大支持多少
  • linux用户登录
  • win8如何调屏幕亮度
  • 斗西游破解版
  • js实现下拉框联动
  • style=display:inline
  • python supper函数
  • unity2020商店
  • jquery选择器的基本语法
  • linux系统启动进程命令
  • linux ls-l命令
  • node解决了什么问题
  • javascript 操作css
  • python遍历文件
  • 国家税务局大厅上班时间
  • 惠州市公交车投诉平台
  • 什么是税务证书密码
  • 发票红冲产生费用吗?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设