使用非对称加密(RSA) 实现前端加密后端解密

2023-11-08

数据加密方式有:

单向加密、对称加密、非对称加密、加密盐、散列函数、数字签名。

1、单向加密

单向加密通过对数据进行摘要计算生成密文,密文不可逆推还原。只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性。但是会引发雪崩效应(雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前,山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。 可以用在很多场合对于Hash码,雪崩效应是指少量消息位的变化会引起信息摘要的许多位变化。)

算法代表:Base64,MD5,SHA

2、对称加密

对称加密的加密和解密是使用同一个密钥;加密和解密的速度比较快,效率比较高;但是密钥传输过程不安全,容易破解,而且密钥管理也比较麻烦。

算法代表:DES,3DES,AES,IDEA,RC4,RC5

对称加密可以分为两类:序列密码和分组密码

2.1、序列密码
从概念上讲,序列密码(stream cipher)的操作过程与我们想象中加密的过程一致。将1字节的明文输入加密算法,就得到1字节的密文输出。在对端则进行相反的过程。整个过程持续重复,直到所有数据处理完成。因为这种思路比较简单,序列密码绝不能第二次使用相同的密钥。这是因为在实际使用中,攻击者知道或者可以预测特定区域的明文(请思考加密HTTP请求的情景;许多请求的请求方法、协议版本、请求头名称都是一样的)当你知道明文,又观察到密文时,就可以解析一部分密钥序列。如果使用了相同的密钥,那么就可以解密后续的部分密文。为了解这个问题,序列密码都与从长期密钥中提取出来的一次性密钥一同使用。

2.2、分组密码

分组密码(block cipher)每次加密一整块数据,并且现代的分组密码倾向于使用128位(16字节)大小的块。一种分组密码就是一个变换函数:接受输入并生成看似杂乱无章的输出。只要使用相同的密钥,每一个可能的输入组合都有唯一的输出。

我们可以理解为更高级的对称加密算法。这种加密算法也是非常常见,例如AES加密,有128位、192位和256位的加密强度。在现在的系统对接时,AES加密非常常见。

3、非对称加密

相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。

算法代表:RSA,DSA

4、加密盐

加密盐也是比较常听到的一个概念,盐就是一个随机字符串用来和我们的加密串拼接后进行加密。加盐主要是为了提供加密字符串的安全性。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文,并不是我们加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。

5、散列函数

散列函数在密码学中也是不可缺少的一部分。散列函数(hash function)是将任意长度的输入转化为定长输出的算法。谈到散列函数,肯定会想到MD5加密,这种就是一种最为常见的散列函数。散列函数的特点:

抗原像性(单向性)给定一个散列,计算上无法找到或者构造出生成它的消息。即不能还原,MD5即是一种单项加密,因此,经常用于密码加密,实现即使管理员也无法知道用户的密码的功能。
抗第二原像性(弱抗碰撞性)给定一条消息和它的散列,计算上无法找到一条不同的消息具有相同的散列。
强抗碰撞性 计算上无法找到两条散列相同的消息。

6、数字签名

在通过散列函数来验证消息完整性的时候,仅仅在信息和数据的散列分开传输的时候才可以,否则中间人可以修改数据的同时修改散列,从而避开检测。数字签名主要是验证数据的真伪。微信通过对称加密生成的签名,支付宝通过非对称加密生成签名。效果差别不大。只要足够证明自己的身份即可。

这里着重介绍下RSA,RSA是首个适用以签名作为加密的算法。被用于银行网上支付、电商交易。
RSA是Rivest、Shamir、Adleman三位数学家的缩写。其数学原理是大整数因数分解极其苦难的原因设计的一种算法。

RSA算法优点

不需要进行密钥传递,提高了安全性
可以进行数字签名认证

RSA算法缺点

加密解密效率不高,一般只适用于处理小量数据(如:密钥)
容易遭受小指数攻击

非加密算法实现流程图:
在这里插入图片描述
在此可以看到,非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。公钥用于加密,私钥用于解密。

下面做一个简单的登录功能来测试示例

前端:这里用的是 jsencrypt.js

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div>打开控制台查看</div>
</body>
<!--jquery cdn-->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!--引入jsencrypt.js  cdn-->
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script type="text/javascript">
    var publicKey = '公钥串';
    console.log(encrypt(publicKey, 'HelloWord'))

    // RSA前端加密
    function encrypt(key, oldPwd) {
      let encrypt = new JSEncrypt();
      encrypt.setPublicKey(key);
      let encrypted = encrypt.encrypt(oldPwd);
      return encrypted;
    }
</script>
</html>

获取表单值并请求接口:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form id="doLogin">
    <!--用户名-->
    <input type="text"  name="username" required="" autofocus="">
    <!--密码-->
    <input type="password" name="password" required="">
    <button type="button" id="bt">登录</button>
    <a th:href="@{/AddPage}">注册</a>
</form>
</body>
<!--jquery cdn-->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!--引入jsencrypt.js  cdn-->
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script type="text/javascript">
    var publicKey = '公钥串';
    
    // RSA前端加密
    function encrypt(key, oldPwd) {
      let encrypt = new JSEncrypt();
      encrypt.setPublicKey(key);
      let encrypted = encrypt.encrypt(oldPwd);
      return encrypted;
    }

    $("#bt").click(function () {
      let data = $("#doLogin").serializeArray();
      console.log(data)
      
      var obj = {}
      data.forEach((item) => {
        obj[item.name] = item.value
      })
      console.log(obj)

      $.ajax({
        url: '/app/v1/checkSign',
        type: 'get',
        data: getSign(obj),
        dataType: 'json',
        success: function (res) {
          console.log(res)
        }
      })
    })

    function getSign(params) {
      var signParam = "";
      var bandParam = publicKey;
      params["signTime"] = (new Date().getTime() / 1000).toFixed(0);
      var sign = '';
      var newData = Object.keys(params).sort();
      for (var i = 0; i < newData.length; i++) {
        if (
          Object.prototype.toString.call(params[newData[i]]) !==
          "[object Array]" &&
          Object.prototype.toString.call(params[newData[i]]) !== "[object Object]"
        ) {
          if (newData[i] !== "sign") {
            sign += newData[i] + params[newData[i]];
          }
        }
      }
      signParam = encrypt(publicKey, sign);
      params["sign"] = signParam;
      return params;
    }
</script>
</html>

也可以在页面放一个隐藏域,用于存放公钥:

<!--也可以页面放置一个隐藏域标签,用于存放公钥-->
<input type="hidden" th:value="${session.publicKey}" id="publicKey">
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用非对称加密(RSA) 实现前端加密后端解密 的相关文章

随机推荐

  • Python绘图系统10:在父组件中使用子组件的函数

    文章目录 Combobox绑定事件 互相调用 源代码 Python绘图系统 从0开始实现一个三维绘图系统 自定义控件 坐标设置控件 坐标列表控件 支持多组数据的绘图系统 图表类型和风格 散点图和条形图 混合类型图表 Combobox绑定事件
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 负载均衡入门

    提纲 ADC 行业现状 ADC 原理 ADC 的实现方式 为什么是 ADC 而不是负载均衡 功能的扩展 解决了什么问题 可用性 Availability 伸缩性 Scalability 性能 End user performance 数据中
  • Java-类什么时候被加载

    类什么时候被加载 类加载时机 生成该类对象的时候 会加载该类及该类的所有父类 访问该类的静态成员的时候 class forName 类名 加载完以后JVM中就有了该类的元数据 知道这个Class的成员变量和方法等信息 当要new一个类的实例
  • AIO, DIO, CIO

    复杂度3 5 机密度3 5 这些名词都用于数据 文件 访问的模式 既应用程序用什么方案实现对文件的读写 AIO AIO 的全称为 Asynchronous I O 既异步 I O 在 AIO 的工作模式下 应用程序发起 call I O请求
  • 动态封装对象,属性来自json

    需求 如何动态的获取一个对象的字段 假如一个对象里面有name age sex三个字段 我想取name的值 这个name是存在一个json中 json的格式如下 key name key age key sex 先遍历这个json 然后再根
  • golang struct 详解

    转载自 https juejin im post 6844903814168838151 Go Struct超详细讲解 原创作者 公众号 程序员读书 欢迎关注公众号 转载文章请注明出处哦 Go语言中提供了对struct的支持 struct
  • Ubuntu 通用命令大全

    查看目录 ls 用不同颜色 经过排列的文本列出目录下的文件 不包括隐藏文件 ls a 列出当前路径下的所有文件 ls l 列出当前目录下可见文件的详细信息 包括用户权限 建立用户 建立时间 占用空间等 返回上一级 cd 上级目录名称 在终端
  • c语言获取linux下cpu、mem、disk信息

    linux下的路径 cpu proc stat mem proc meminfo define ULL unsigned long long define SET IF DESIRED x y if x x y static int fiv
  • 13、计算学生总评成绩并排序(友元函数)

    问题描述 问题描述 试定义一个实现计算学生课程成绩的类Student 对学生学期总评成绩进行计算并排序 具体要求如下 1 私有数据成员 int norm ex final overall 分别表示学生的平时成绩 实验成绩 期末考试和总评成绩
  • 【CTF/MISC】一道图片隐写题

    图片隐写 题目 解题思路 binwalk工具查看是否有隐藏信息 foremost工具提取文件 zip2john工具对压缩包进行暴力破解 010editer工具查看图片的二进制数据 base64在线编码和解码 解题心得 题目连接 题目 题目是
  • AWS SAA C003 #29

    A company provides a Voice over Internet Protocol VoIP service that uses UDP connections The service consists of Amazon
  • vue+element+axios实现分页

    之前更了一个react的分页效果 今天给大家发一个vue写的分页 先在全局main js中引入element并使用 import ElementUI from element ui import element ui lib theme c
  • axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken)

    目录 axios是什么 axios特点 axios中文文档 axios常用语法 axios安装 axios简单使用 默认get请求 post put delete axios难点语法 axios create config 对axios请求
  • visual studio重新设置智能提示快捷键

    默认快捷键是ctrl j或者ctrl space 重新设置 搜索complete 找到Edit CompleteWord 通过press shortcut keys重新设置 我这里设置成了Alt
  • 音乐,阳光,csdn,书籍和代码

    辛苦一星期 就盼望着周末 周末到了 可以睡懒觉 可以潇潇洒洒的睡到自然醒 周末到了 还可以去逛公园 呼吸新鲜空气 感受着春天的气息 当然 空气中也可能夹杂着H7N9的讯息 555 周末到了 还可以去逛街 吃自己喜欢的美食 鸭血粉丝就算了 看
  • 用find_if查找容器中符合条件的子集

    比如我有一个结构体 Struct DATA int order 序号 int type 类型 double dValue 值 time t time 时间 现在我有一个容器 里面有N个DATA结构 Vector
  • 并发场景下HashMap死循环导致CPU100%的问题

    参考链接 并发场景下HashMap死循环导致CPU100 的问题 转载于 https www cnblogs com jxxblogs p 11609646 html
  • markdown写作格式

    欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想 整理笔记 知识 并将其中承载的价值传播给他人 Cmd Markdown 是我们给出的答案 我们为记录思想和分享知识提供更专业的工具 您可以使用 Cmd
  • 使用非对称加密(RSA) 实现前端加密后端解密

    数据加密方式有 单向加密 对称加密 非对称加密 加密盐 散列函数 数字签名 1 单向加密 单向加密通过对数据进行摘要计算生成密文 密文不可逆推还原 只能加密 不能解密 常用于提取数据的指纹信息以此来验证数据的完整性 但是会引发雪崩效应 雪崩