如何在 .NET Core WebAPI 和 Javascript 应用程序中安全地发送/接收密钥参数

如何在 .NET Core WebAPI 和 Javascript 应用程序中安全地发送/接收密钥参数

目录

描述

JavaScript 中的加密

C# 中的解密

结论


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

描述

在 API 中,通常会使用一些标识符密钥来识别用户详细信息并据此处理数据。这些信息通常从客户端的查询参数、请求头或路由路径中获取。
然而,这些 API 会在安全审计过程中被拒绝,因为它们暴露了用户数据,并且存在不安全的对象引用漏洞,攻击者可以通过修改这些 API 参数来恶意利用该漏洞获取其他用户的信息。
有很多方法可以解决这个安全问题,但本教程将解释如何通过将这些参数加密成一个密钥并将其放在请求头中来解决这个问题。我还会解释如何使用 .NET Core API 中的中间件在 API 级别处理这个问题。加密在客户端应用程序中使用 JavaScript 完成,解密在 API 级别使用 C# 完成。
我使用了 AES 密钥加密算法来实现加密和解密。

假设我们有一个薪资 API,其中 employeeid 作为参数。

api/salaries/getbyemployeeid?employeeid=1031

在这个 API 中,我们公开了一个重要的关键标识符 employeeid,因此它被暴露了,因为任何拥有基本身份验证的人都可以查看其他员工的详细信息。为了避免这种情况,我们首先将删除查询参数。

api/salaries/getbyemployeeid

接下来,我们将使用 AES 加密生成一个加密密钥,然后将该密钥作为标头发送。

JavaScript 中的加密

安装软件包npm install crypto-js

const CryptoJS = require('crypto-js');
function Encrypt(str) {
                 var KEY = "12345678900000001234567890000000";//32 bit
                 var IV = "1234567890000000";//16 bits
        var key = CryptoJS.enc.Utf8.parse(KEY);
        var iv = CryptoJS.enc.Utf8.parse(IV);

        var;

        var srcs = CryptoJS.enc.Utf8.parse(str);
        encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

        return encrypted.ciphertext.toString();
    }
var encryptedEmployeeId = Encrypt("1031");
console.log(encryptedEmployeeId);
//result would be EF082204BF6F804099396A96CC7733F4

C# 中的解密

public class EncryptDecrypt
{
    public static string AESDecryption(string input)
    {
        string AES_IV = "1234567890000000";//16 bits 
        string key = "12345678900000001234567890000000"; //32 bits
        byte[] inputBytes = HexStringToByteArray(input);
            byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
            using AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider();
            aesAlg.Key = keyBytes;
            aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16));

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            using MemoryStream msEncrypt = new MemoryStream(inputBytes);
            using CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read);
            using StreamReader srEncrypt = new StreamReader(csEncrypt);
            return srEncrypt.ReadToEnd();
    }

private static byte[] HexStringToByteArray(string s)
        {
            s = s.Replace(" ", "");
            byte[] buffer = new byte[s.Length / 2];
            for (int i = 0; i < s.Length; i += 2)
                buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
            return buffer;
        }
}

我在请求头中发送了加密参数,并添加了一个名为 Request-Id 的请求头。
Request-Id : EF082204BF6F804099396A96CC7733F4

添加请求中间件来获取标头值并对其进行解密。

public class RequestMiddleware
    {
        private readonly RequestDelegate _next;
        public RequestMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Headers.TryGetValue("Request-Id", out var requestid))
            {
                var employeeid = EncryptDecrypt.AESDecryption(requestid);     
            }

            await _next(context);
        }
    }

在其他 API 使用的中间件之前配置该中间件,使其可用并可以保存在静态变量中。

app.UseMiddleware(typeof(RequestMiddleware));

结论

在本教程中,解释了如何在 API 请求的标头中发送基于密钥的加密参数,而不是直接发送,并按照最初所示修改了 API。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

Read more

801-203_各无人机厂家对RemoteID支持情况汇总

1. 大疆DJI 参考链接:大疆无人机RemoteID支持情况 DJI航拍无人机的RID广播信息包含以下信息: 1. ID等身份认证 2. 无人机的纬度、经度、几何高度和速度 3. 控制站的纬度、经度和几何高度的指示 4. 时间信息、紧急状态信息 支持RID的航拍无人机型号 大疆无人机支持RID型号列表 序号无人机机型支持情况备注1DJI Mavic 4 Pro支持2DJI Flip支持3DJI Air 3S支持4DJI Neo支持WIFI直连模式下和脱控模式下不支持5DJI Mini 4K支持V01.07.0400 及以后6DJI Avata 2V01.00.0300 及以后7DJI Mini 4 Pro支持V01.00.0400 及以后8DJI Air 3支持V01.00.1200 及以后9DJI Mini 3支持V01.

【FPGA】Vivado 保姆级安装教程 | 从官网下载安装包开始到安装完毕 | 每步都有详细截图说明 | 支持无脑跟装

【FPGA】Vivado 保姆级安装教程 | 从官网下载安装包开始到安装完毕 | 每步都有详细截图说明 | 支持无脑跟装

安装包下载:Xilinx_Vivado Download Link(下好后可直接安装) 目录 (有安装包后,可直接跳转至 Step5,免得去官网下了,比较麻烦) Step1:进入官网 Step2:注册账号 Step3:进入下载页面 Step4:下载安装包 Step5:安装 Step6:等待软件安装完成 安装完成 Step1:进入官网 ① 我们可以选择在 XILINX 官网下载其公司旗下的产品 Vivado 🔍 官网地址:www.xilinx.com           (英文)www.china.xilinx.com  (官方中文网站) 👉 点击直达:Xilinx - Adaptable. Intelligent | together we advance_    (英文)

【数据库】国产数据库的新机遇:电科金仓以融合技术同步全球竞争

【数据库】国产数据库的新机遇:电科金仓以融合技术同步全球竞争

7月15日,国产数据库厂商中电科金仓(北京)科技股份有限公司(以下简称“电科金仓”)在北京举行了一场技术发布会,集中发布四款核心产品:AI时代的融合数据库KES V9 2025、企业级统一管控平台KEMCC、数据库一体机(云数据库AI版)以及企业级智能海量数据集成平台KFS Ultra,并同步举行了“金兰组织2.0”启动仪式。 如果放在过去几年,这场发布会可能被归入“信创替代”的常规范畴。但这一次,电科金仓试图讲述的不再是“我们也能做、我们可以兼容”,而是“我们能不能定义下一代数据库形态”。 整个发布会贯穿了三个关键词:“融合”“AI”“平台能力”。这背后的核心逻辑是清晰的:在“去IOE”与“兼容Oracle”的红利渐近尾声之际,国产数据库厂商开始面对一个更加复杂、也更具挑战性的市场命题——如何在大模型时代支撑非结构化数据、高维向量检索和复杂语义计算的新需求? 正如我国数据库学科带头人王珊教授所说,数据库内核与AI能力的深度结合,已成为释放数据核心价值的关键路径,正催生着更智能、更自适应、更能应对复杂挑战的新一代数据库形态。

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程 在数字化办公日益普及的今天,企业微信作为国内领先的企业级通讯工具,其群机器人功能为团队协作带来了极大的便利。本文将手把手教你如何从零开始配置企业微信群机器人Webhook,实现自动化消息推送,提升团队沟通效率。 1. 准备工作与环境配置 在开始创建机器人之前,需要确保满足以下基本条件: * 企业微信账号:拥有有效的企业微信管理员或成员账号 * 群聊条件:至少包含3名成员的群聊(这是创建机器人的最低人数要求) * 网络环境:能够正常访问企业微信服务器 提示:如果是企业管理员,建议先在"企业微信管理后台"确认机器人功能是否已对企业开放。某些企业可能出于安全考虑会限制此功能。 2. 创建群机器人 2.1 添加机器人到群聊 1. 打开企业微信客户端,进入目标群聊 2. 点击右上角的群菜单按钮(通常显示为"..."或"⋮") 3. 选择"添加群机器人"选项 4.