前端接口RSA加密(h5+小程序,支持超长内容、中文字符)

本文主要是介绍前端接口RSA加密(h5+小程序,支持超长内容、中文字符),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

h5端和小程序端使用的插件不同,小程序端使用自己封装的方式,支持超长内容、中文字符,且打包后仅60kb左右的体积。

一、接口加密概述

加密目的:
1、防止信息泄露(防止用户登录账号、密码等)
2、防止数据篡改(防止篡改数据后模拟请求等)

设计原则:
1、加密方式安全可靠
2、开发成本可接受
3、易于调试测试

加密范围:
1、业务相关api接口请求
2、排除图片和文件上传

二、前端常见的加密方式

1、Base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

2、MD5

一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。特点是加密后的结果长度一致且不可逆。

3、AES

密码学中的高级加密标准(AES),这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,成为对称密钥加密中最流行的算法之一。

4、RSA

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。RSA是被研究得最广泛的公钥算法,经历了各种攻击的考验,普遍认为是目前最优秀的公钥方案之一。

  • 对称加密:加密密钥和解密密钥相同。
  • 非对称加密:加密密钥和解密密钥不相同。
  • 某种角度来说,Base64和MD5不算是加密方式,只是一种编码方式,在特定的场景下发挥作用。
  • 对于加密来说,目前对称加密使用AES居多,非对称加密使用RSA居多。
  • 相对于对称加密来说,非对称加密的安全性更高,但加密速度较慢。
  • 所以,一种推荐的方案是结合对称和非对称加密,数据加密采用AES,而把AES的加密秘钥用RSA加密,这样兼顾速度及安全性。
  • 然并卵,我司采用的仍然是纯RSA加密,本文主要讲的就是纯RSA加密方式。

三、接口RSA加密

加密流程:

  • 前端api请求数据转json字符串
  • 对该字符串用RSA公钥加密
  • 生成base64格式字符串
  • 后端接收用RSA私钥解密

注意点:

  • RSA 算法规定:待加密的字节数不能超过密钥的长度值除以 8 再减去 11,加密后得到密文的字节数,是密钥的长度值除以 8。
  • 所以,如果要加密较长的字符串,需要采用分段加密的方式。

四、h5端

  • h5端的RSA加密使用了node-rsa插件github传送门,支持node环境及浏览器环境,支持超长字符加密。
  • 安装插件依赖:
npm i node-rsa -S
  • 使用方式
import NodeRSA from 'node-rsa'// 定义待加密的字符串(换成你的接口请求数据转换后的json字符串)
const str = '{"name":"neo"}'
// 定义公钥(换成你自己的公钥)
const publicKey = `-----BEGIN PUBLIC KEY-----SSS0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZYGuVQdX6RSb5TUN8xfIHjw+JSFSDcDzLPp/Ug/fmmt++guuDI4wl72G9Z9df+0BKgRwknOmuqO9FkM1rlEdUOx6HFolje4A/aEp6/HFUcpoQF6sQkGQ3Yvx4RwMYtOgOotucB2TRSd2NuQNpEivGaNFW7jihJTegg3D6wIDAQAB-----END PUBLIC KEY-----
`const myEncrypt = new NodeRSA(publicKey)
myEncrypt.setOptions({ encryptionScheme: 'pkcs1' }) // 指定RSA加密协议,pkcs1 或 pkcs1_oaep,默认pkcs1_oaep
const cryptStr = myEncrypt.encrypt(str, 'base64') // 指定输出编码类型为base64console.log('加密后的结果:', cryptStr)

五、微信小程序端

  • 上述h5端用的node-rsa插件在微信小程序里无法使用(构建npm后报错)
  • 其他各类插件也试了好几个,要么不支持超长加密,要么体积太大容易导致小程序主包体积超限(主包2Mb限制)
  • 最终使用了基于插件jsencrypt二次修改封装,已发布到npm上,安装及使用方式参考文档:wxmp-rsa(欢迎star)。
  • 更新:
    • 之前偶现的加密异常的问题已于v2.0.0+版本中修复。
    • 之前偶现的解密后部分中文乱码的问题已于v2.1.0+版本中修复。

六、提示

  • 为了方便调试及测试,建议在测试环境关闭加密功能,在预发环境和线上环境再开启。
  • 要进一步提升安全性,可视情况考虑以下方式:
    1、密钥不存储在前端,而是从后端接口获取。
    2、后端可以对密钥使用混淆或简单加密后再传给前端。
    3、由后端获取密钥时,后端可以定期更改密钥。
    4、不同的端分别使用不同的密钥处理,例如android、ios、h5、小程序等前端使用不同的密钥。

这篇关于前端接口RSA加密(h5+小程序,支持超长内容、中文字符)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960068

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.