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

Sentinel - 告警通知:通过 Webhook 接入企业微信/钉钉

Sentinel - 告警通知:通过 Webhook 接入企业微信/钉钉

👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Sentinel这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Sentinel - 告警通知:通过 Webhook 接入企业微信/钉钉 📢 * 🌐 一、引言:为什么需要告警通知? * 1.1 微服务架构下的挑战 * 1.2 Sentinel 的核心价值与局限 * 1.3 告警通知的重要性 * 1.4 企业微信 & 钉钉的优势 * 🧠 二、核心概念与原理 * 2.1 Sentinel 告警机制

WebAssembly 逆向分析:如何反编译 Wasm 二进制文件,修改游戏里的“金币数量”?

WebAssembly 逆向分析:如何反编译 Wasm 二进制文件,修改游戏里的“金币数量”?

标签: #WebAssembly #ReverseEngineering #Security #Wasm #GameHacking #CTF 🕵️‍♂️ 前言:Wasm 不是加密,只是二进制 WebAssembly 是一种基于堆栈虚拟机的二进制指令格式。它类似于汇编语言,但比 x86 汇编更抽象。 浏览器加载 .wasm 文件,编译为机器码运行。 逆向 Wasm 的两种核心思路: 1. 静态分析:将 .wasm 反汇编为 .wat (WebAssembly Text) 或伪 C 代码,分析逻辑。 2. 动态调试:利用浏览器开发者工具挂载断点,或直接修改 WebAssembly.Memory(线性内存)。 Wasm 加载与逆向流程 (Mermaid): 逆向攻击路径 Wasm 运行环境 1.

FastAPI 完全指南:现代 Python Web 开发的终极选择

FastAPI 完全指南:现代 Python Web 开发的终极选择

目录 1. 引言:为什么选择 FastAPI? 2. 环境搭建与基础配置 3. 核心概念深度解析 4. 路由与请求处理 5. 数据验证与序列化 6. 依赖注入系统 7. 数据库集成 8. 认证与安全 9. 中间件与后台任务 10. 测试与部署 11. 性能优化最佳实践 引言:为什么选择 FastAPI? FastAPI 是由 Sebastián Ramírez 于 2018 年创建的现代、高性能 Web 框架。它基于 Starlette(ASGI 工具集)和 Pydantic(数据验证库),为 Python 开发者带来了革命性的开发体验。 核心优势 特性说明极致性能与

Debian环境下libwebkit2gtk-4.1-0安装及依赖处理详解

Debian环境下 libwebkit2gtk-4.1-0 安装与依赖处理实战指南 你有没有遇到过这样的场景?刚写好的GTK+程序在开发机上跑得好好的,一部署到新系统就报错: error while loading shared libraries: libwebkit2gtk-4.1.so.0: cannot open shared object file 或者执行 apt install libwebkit2gtk-4.1-0 时,APT突然告诉你:“ E: Unable to locate package ”——明明文档里都说支持的,怎么就是装不上? 别急。这背后不是你的代码有问题,而是Linux包管理世界的“暗流”在作祟:复杂的依赖层级、版本锁定、软件源配置差异……尤其是像 libwebkit2gtk-4.1-0 这种深度集成于GNOME生态的核心渲染库,稍有不慎就会掉进“依赖地狱”