位置: 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安装教程)

  • 短信营销不在是几十个字那么简单(短信营销是什么意思)

    短信营销不在是几十个字那么简单(短信营销是什么意思)

  • js 替换指定字符(js中替换字符串中某字符的方法)

    js 替换指定字符(js中替换字符串中某字符的方法)

  • word文本框怎么设置透明色(word文本框怎么对齐)

    word文本框怎么设置透明色(word文本框怎么对齐)

  • 华为nova4支持nfc功能吗(华为nova4支持5g网络吗)

    华为nova4支持nfc功能吗(华为nova4支持5g网络吗)

  • 秒速寻能找到对方位置吗(秒速寻定位是真的吗)

    秒速寻能找到对方位置吗(秒速寻定位是真的吗)

  • 电脑显示器黑屏但灯亮是(电脑显示器黑屏但灯亮主机正常运行)

    电脑显示器黑屏但灯亮是(电脑显示器黑屏但灯亮主机正常运行)

  • 钉钉卸载重装后记录还有吗(钉钉卸载重装后文件还有吗)

    钉钉卸载重装后记录还有吗(钉钉卸载重装后文件还有吗)

  • 真我手机是什么品牌(真我手机是什么充电器)

    真我手机是什么品牌(真我手机是什么充电器)

  • 苹果11 128g够用吗(ipone11 128g够用吗)

    苹果11 128g够用吗(ipone11 128g够用吗)

  • 微信语音太小怎么调大(微信语音太小怎么弄)

    微信语音太小怎么调大(微信语音太小怎么弄)

  • 微信读书无限卡还有时间为什么不能看(微信读书无限卡有什么用)

    微信读书无限卡还有时间为什么不能看(微信读书无限卡有什么用)

  • 健康码怎么查询(健康码怎么查询家人的)

    健康码怎么查询(健康码怎么查询家人的)

  • iphone6plus是什么屏幕(iphone6plus芯片)

    iphone6plus是什么屏幕(iphone6plus芯片)

  • qq通讯录发消息能看到吗(qq通讯录发消息能收到吗)

    qq通讯录发消息能看到吗(qq通讯录发消息能收到吗)

  • 手机卡欠费多久会被注销(手机卡欠费多久会停机)

    手机卡欠费多久会被注销(手机卡欠费多久会停机)

  • 淘宝实名认证怎么解除(淘宝实名认证怎么弄)

    淘宝实名认证怎么解除(淘宝实名认证怎么弄)

  • ios13亮度自动调节不行(ios13亮度自动调整在哪)

    ios13亮度自动调节不行(ios13亮度自动调整在哪)

  • 微视qq运动红包怎么领不了了(qq运动红包能提现吗)

    微视qq运动红包怎么领不了了(qq运动红包能提现吗)

  • 华为畅享9自带膜吗(华为畅享9自带软件有哪些)

    华为畅享9自带膜吗(华为畅享9自带软件有哪些)

  • 手机贴吧私信在哪看(贴吧app私信)

    手机贴吧私信在哪看(贴吧app私信)

  • aoltsmon.exe是什么进程 aoltsmon进程信息查询(autoreg.exe)

    aoltsmon.exe是什么进程 aoltsmon进程信息查询(autoreg.exe)

  • Ghostexp.exe进程是什么文件 作用是什么 Ghostexp进程查询(ghost打开)

    Ghostexp.exe进程是什么文件 作用是什么 Ghostexp进程查询(ghost打开)

  • VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)(vue three.js)

    VUE使用Three.js实现模型,点击交互,相机旋转视角跟随移动(Threejs中使用Tweenjs,含demo源码)(vue three.js)

  • 冰川国家公园中的佩里托莫雷诺冰川,阿根廷 (© Juergen Schonnop/Getty Images)(冰川国家公园在哪)

    冰川国家公园中的佩里托莫雷诺冰川,阿根廷 (© Juergen Schonnop/Getty Images)(冰川国家公园在哪)

  • IDEA 2022专业版创建Java Web项目(保姆式小白讲义,强烈建议入手!)

    IDEA 2022专业版创建Java Web项目(保姆式小白讲义,强烈建议入手!)

  • 考税务师的报考条件
  • 奖金个人所得税税率
  • 政府补助是否可以加计抵扣
  • 工资以现金形式发放的情况说明
  • 所得税忘了计提如何做会计分录还有结转
  • 成品油认证步骤
  • 增值税加计递减额,这个科目如何使用
  • 当月开票当月付款分录
  • 银行存款支付现金股利属于什么科目
  • 房产折旧计算方法 举例
  • 营改增之前材料含税吗
  • 物业公司收物业费如何入账
  • 食堂开支计入什么科目
  • 企业支付小额劳务费税率
  • 单位日常发的钱都有哪些
  • 石家庄国税发票查验平台
  • 公司注销的流程和费用
  • 招标公司返回的钱怎么算
  • system 命令
  • 赠送客户的商品怎么入账
  • 怎么提升电脑速度
  • win8换成win7重装系统
  • 一次性工伤医疗补偿金怎么算
  • 公司一直是亏损怎么赔偿
  • 个人所得税的减数为2000元,实行日期为
  • 将债务转为资本的,债务人应当将债权人
  • 赊销商品属于什么信用
  • 零售商品盘点表填写内容
  • php数据库连接池 实例
  • php模板之家官网
  • 成本会计工作流程表
  • 华硕自带win10系统
  • php正则函数内容匹配
  • php随机生成1到3的数字
  • 简易办法征收增值税政策的通知
  • vue组件标签
  • ai绘画网站
  • 汇兑损益会计处理方法
  • 现金销售商品的会计分录
  • 购进免税农产品进项税额计算
  • linux数据库导入命令
  • 一般纳税人在任何情形下都可以领购使用增值税专用发票
  • 小微企业增值税减免政策
  • 记账凭证填错了怎么办还没有登记账簿
  • 合伙企业分配利润会计分录
  • 会计学中的折旧是什么意思
  • 甲供材料怎么记账
  • 免征增值税和增值税区别
  • 租赁期间因占有、使用租赁物获得的收益
  • 建筑企业收到材料发票没有备注工程地址可以用吗
  • 年末结转本年利润分录
  • 员工拿发票报销怎么做账
  • 成本暂估跨年度怎么算
  • 公司给员工买房子如何做账
  • 收到税务局退还的个税手续费怎么入账
  • 新医院会计制度什么时候实施
  • 应付账款暂估会计分录怎么写
  • 材料的运费计入哪个科目
  • 企业开了发票
  • 关闭terminal monitor
  • win10系统微软账号退不了怎么办
  • w10桌面
  • ubuntu安装transmission
  • mac苹果系统怎么用
  • RSync文件备份同步 Linux服务器rsync同步配置图文教程
  • windows windows.old
  • linuxcpu监控
  • linux extern关键字
  • javascript 基础
  • jquery 元素
  • bash脚本语言
  • 发送邮件python
  • jqury选择器
  • js中!
  • python append、extend与insert的区别
  • pdb settrace
  • 建筑施工企业研发中心建设
  • 税务稽查建议书反馈意见
  • 厦门象屿正式员工招聘
  • 微信申报缴税流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设