如何在 .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

手把手教你:在 Windows 部署 OpenAkita 并接入飞书模块,实现真正能干活的本地 AI 助手

手把手教你:在 Windows 部署 OpenAkita 并接入飞书模块,实现真正能干活的本地 AI 助手

目 录 * 前言 * 第一章:为什么选 OpenAkita,而不是直接用 OpenClaw? * 1.1 当前 AI 助理的几个现实痛点 * 1.2 OpenAkita 的核心优势(对比 OpenClaw) * 1.3 谁最适合用 OpenAkita? * 第二章:Windows 下安装 OpenAkita(两种方案) * 2.1 准备工作 * 2.2 方案一:一键脚本安装(适合能接受 PowerShell 的用户) * 2.3 方案二:桌面安装包(最像普通软件,新手友好) * 第三章:配置蓝耘(Lanyun)平台 API 密钥

鸿蒙 AI App 的技术架构解析

鸿蒙 AI App 的技术架构解析

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

AI绘画插件本地部署:从入门到精通的完整解决方案

AI绘画插件本地部署:从入门到精通的完整解决方案 【免费下载链接】krita-ai-diffusionStreamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-ai-diffusion 还在为AI绘画插件的复杂配置而头疼?想要在本地轻松享受AI创作的自由?本文将为你提供一套全新的问题导向式部署方案,让你用最简单的方式完成AI绘画插件的本地安装。无论你是完全的新手还是有一定经验的用户,都能在这里找到适合你的解决方案。 为什么选择本地部署?🎨 数据隐私保护:所有生成过程都在本地完成,无需担心敏感内容泄露 离线创作自由:无需网络连接,随时随地都能进行AI绘画 个性化定制:完全掌控模型选择、参数调整和生成效果 想象一下,你只需要在Krita软件中输入简单的文字描述,就能在几分钟内获得精美

AIGC全栈实践指南:从模型选型到产业落地(附2025实战手册)

AIGC 全栈实践指南:从模型选型到产业落地(附 2025 实战手册) 引言:AIGC 的工业化革命 —— 从 “生成内容” 到 “创造价值” 2025 年的 AIGC 早已跳出 “文生图”“写文案” 的娱乐化陷阱:阿里 “魔绘” 工业设计 AI 能在 3 分钟内生成符合力学原理的机械零件图纸,字节跳动 “灵笔” 影视 AI 单日产出 200 条符合平台调性的短视频脚本,华为 “筑境” 建筑 AI 设计方案中标率较人类团队提升 47%。这些突破的核心,是 AIGC 从 “内容生成工具” 到 “产业生产力引擎” 的进化。 据 IDC《