资讯专栏INFORMATION COLUMN

一套简单的基于 RSA + AES 加密机制的前端解决方案

Travis / 2828人阅读

摘要:前言因公司现有后台管理系统项目需对部分网络请求接口的重要数据进行加密,整合了一套简单的基于加密机制的前端解决方案。用户已登录成功,页面刷新后将会重新生成,这时候需从中获取并和上传后端,后端重新绑定和。

前言

因公司现有后台管理系统项目需对部分网络请求接口的重要数据进行加密,整合了一套简单的基于 RSA + AES 加密机制的前端解决方案。

参考文献:

crypto 廖雪峰

crypto-js aes 加解密

rsa 加解密

参考 API:

crypto-js

JSEncrypt

依赖

crypto-js: npm i crypto-js

JSEncrypt:npm i jsencrypt

加密流程
先上图

因项目为后台管理系统,所以这里会有两种业务场景:

用户在未登录前是没有鉴权 token 的,需在成功登录并获取 token 后和 encryptKey 一并上传后端,后端才能将 token 与 encryptKey 做绑定。

用户已登录成功,页面刷新后将会重新生成 aesKey ,这时候需从 cookie 中获取 token 并和 encryptKey 上传后端,后端重新绑定 token 和 encryptKey。

代码
encryption.js 封装
import CryptoJS from "crypto-js"
import JSEncrypt from "jsencrypt"

const encryptor = new JSEncrypt()

// 生成 AESKEY
export const aesKey = createAesKey()

export function createAesKey () {
  const expect = 16
  let str = Math.random().toString(36).substr(2)
  while (str.length < expect) {
    str += Math.random().toString(36).substr(2)
  }
  str = str.substr(0, 16)
  return str
}

/**
 * AES 加密
 * @param word 待加密字段
 * @param keyStr 加密 key
 * @returns {string} 返回加密字段
 */
export function aesEncrypt (word, keyStr) {
  keyStr = keyStr || aesKey
  console.log(keyStr)
  const key = CryptoJS.enc.Utf8.parse(keyStr)
  let srcs = ""
  switch (typeof (word)) {
    case "string":
      srcs = CryptoJS.enc.Utf8.parse(word)
      break
    case "object":
      srcs = CryptoJS.enc.Utf8.parse(JSON.stringify(word))
      break
    default:
      srcs = CryptoJS.enc.Utf8.parse(word.toString())
  }
  const encrypted = CryptoJS.AES.encrypt(srcs, key, {iv: key, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7})
  return encrypted.toString()
}

/**
 * AES 解密
 * @param word 待解密数据
 * @param keyStr 解密 key
 * @returns {string} 返回解密字符串
 */
export function aesDecrypt (word, keyStr) {
  keyStr = keyStr || aesKey
  const key = CryptoJS.enc.Utf8.parse(keyStr)
  const decrypt = CryptoJS.AES.decrypt(word, key, { iv: key, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 })
  return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}

/**
 * RSA 设置公钥
 * @param val 公钥
 */
export function setPublicKey (val) {
  encryptor.setPublicKey(val)
}

/**
 * RSA 加密
 * @param data 待加密数据
 * @returns {PromiseLike} 返回加密字符串
 */
export function rsaEncrypt (data) {
  return encryptor.encrypt(data)
}
总结
AES 加解密涉及到的模式(如 CBC、ECB 等)、偏移量和填充等,请参考文中前言提及的文献和 API

本文仅为解决方案参考,请结合实际业务需求及业务场景自由发挥

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104431.html

相关文章

  • 循序渐进学加密

    摘要:在古典加密算法当中,加密算法和密钥都是不能公开的,一旦泄露就有被破解的风险,我们可以用词频推算等方法获知明文。年美国公司研制的算法是人类历史上第一个公开加密算法但不公开密钥的加密方法,后来成为美国军方和政府机构的标准加密算法。 还记得上初二的那年夏天,班里来了一个新同学,他就住在我家对面的楼里,于是我们一起上学放学,很快便成了最要好的朋友。我们决定发明一套神秘的沟通方式,任何人看到都不...

    Y3G 评论0 收藏0
  • 循序渐进学加密

    摘要:在古典加密算法当中,加密算法和密钥都是不能公开的,一旦泄露就有被破解的风险,我们可以用词频推算等方法获知明文。年美国公司研制的算法是人类历史上第一个公开加密算法但不公开密钥的加密方法,后来成为美国军方和政府机构的标准加密算法。 还记得上初二的那年夏天,班里来了一个新同学,他就住在我家对面的楼里,于是我们一起上学放学,很快便成了最要好的朋友。我们决定发明一套神秘的沟通方式,任何人看到都不...

    fsmStudy 评论0 收藏0
  • 【大量干货】史上最完整Tengine HTTPS原理解析、实践与调试

    摘要:内容主要有四个方面趋势基础实践调试。一趋势这一章节主要介绍近几年和未来的趋势,包括两大浏览器和对的态度,以及淘宝天猫和阿里云的实践情况。完整性是指为了避免网络中传输的数据被非法篡改,使用算法来保证消息的完整性。 摘要: 本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验。内容主要有四个方面:HTTPS趋势、HTTPS基础、HTTPS实践、HTTPS...

    snowell 评论0 收藏0
  • 一种基于http协议敏感数据传输方案

    摘要:比如加密算法但是加密也存在局限性,需要定期维护。当然聪明的你可能会说,那我就使用非对称加密算法,比如好了。所以本次结合了和来实现我们的数据传输。发送方接收到请求返回结果后,通过约定的方式对返回结果进行处理,以供后续使用。 最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现。既然不能用https协议,那就退而求其次采用http...

    yagami 评论0 收藏0
  • SSL:今天截获,明天解密

    摘要:然而,最近被泄密的文件表明,美国国家安全局记录了庞大的互联网流量并且保留其中的加密信息供以后解密分析。的加密套件列表和在的调查中实际协商的加密套件。如果美国国家安全局获得了这些网站的私钥,除了谷歌以外所有的站点历史通信都将被解密。 成千上万的网站和个人依靠SSL来保护敏感信息的传输,比如密码、信用卡信息和那些期望通过加密来保障隐私的个人信息。然而,最近被泄密的文件表明,美国国家安全局N...

    ConardLi 评论0 收藏0

发表评论

0条评论

Travis

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<