目录描述JavaScript 中的加密C# 中的解密结论如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。描述在 API 中通常会使用一些标识符密钥来识别用户详细信息并据此处理数据。这些信息通常从客户端的查询参数、请求头或路由路径中获取。然而这些 API 会在安全审计过程中被拒绝因为它们暴露了用户数据并且存在不安全的对象引用漏洞攻击者可以通过修改这些 API 参数来恶意利用该漏洞获取其他用户的信息。有很多方法可以解决这个安全问题但本教程将解释如何通过将这些参数加密成一个密钥并将其放在请求头中来解决这个问题。我还会解释如何使用 .NET Core API 中的中间件在 API 级别处理这个问题。加密在客户端应用程序中使用 JavaScript 完成解密在 API 级别使用 C# 完成。我使用了 AES 密钥加密算法来实现加密和解密。假设我们有一个薪资 API其中 employeeid 作为参数。api/salaries/getbyemployeeid?employeeid1031在这个 API 中我们公开了一个重要的关键标识符 employeeid因此它被暴露了因为任何拥有基本身份验证的人都可以查看其他员工的详细信息。为了避免这种情况我们首先将删除查询参数。api/salaries/getbyemployeeid接下来我们将使用 AES 加密生成一个加密密钥然后将该密钥作为标头发送。JavaScript 中的加密安装软件包npm install crypto-jsconst CryptoJS require(crypto-js);function Encrypt(str) {var KEY 12345678900000001234567890000000;//32 bitvar IV 1234567890000000;//16 bitsvar key CryptoJS.enc.Utf8.parse(KEY);var iv CryptoJS.enc.Utf8.parse(IV);var encrypted ;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 EF082204BF6F804099396A96CC7733F4C# 中的解密public class EncryptDecrypt{public static string AESDecryption(string input){string AES_IV 1234567890000000;//16 bitsstring key 12345678900000001234567890000000; //32 bitsbyte[] 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。如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。