最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)WebAPI接口安全加密的具體方案

 更新時間:2025年06月20日 08:28:18   作者:小碼編匠  
在項目開發(fā)過程中,接口的安全性往往是一個容易被忽視但極其關(guān)鍵的環(huán)節(jié),本文介紹了一套實際項目中已落地的?Web?API?安全加密方案,涵蓋了?SHA256?加簽、RSA?非對稱加密、AES?對稱加密?以及相關(guān)數(shù)據(jù)格式轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下

前言

在項目開發(fā)過程中,接口的安全性往往是一個容易被忽視但極其關(guān)鍵的環(huán)節(jié)。尤其是在項目上線后,面對外部攻擊、攻防演練等情況,如果沒有一套完善的加密機(jī)制,我們的數(shù)據(jù)極有可能遭受竊取或篡改。

本文介紹了一套實際項目中已落地的 Web API 安全加密方案,涵蓋了 SHA256 加簽、RSA 非對稱加密、AES 對稱加密 以及相關(guān)數(shù)據(jù)格式轉(zhuǎn)換等內(nèi)容,適用于對外暴露的 API 接口保護(hù)場景。希望通過本文,能夠幫助大家構(gòu)建更安全的接口通信體系。

一、方案設(shè)計

為了保障接口調(diào)用過程中的安全性,我們采用以下加密策略:

加簽(Sign):使用 SHA256 對請求參數(shù)進(jìn)行簽名,防止請求內(nèi)容被篡改;

加密傳輸

  • 使用 RSA 進(jìn)行非對稱加密,用于加密密鑰;
  • 使用 AES 進(jìn)行對稱加密,用于加密實際數(shù)據(jù);

數(shù)據(jù)編碼轉(zhuǎn)換:涉及 Base64 編碼、16進(jìn)制與字節(jié)數(shù)組之間的相互轉(zhuǎn)換,確保數(shù)據(jù)在網(wǎng)絡(luò)中正確傳輸和解析。

該方案不僅提升了接口的安全性,也兼顧了性能和易用性。

1、SHA256 加簽實現(xiàn)

加簽是為了驗證請求的完整性,防止請求參數(shù)在傳輸過程中被篡改。以下是 C# 實現(xiàn)的 SHA256 加簽方法:

#region 加簽SHA256
public static string GetSHA256Hash(string input)
{
    using (SHA256 sha256Hash = SHA256.Create())
    {
        byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < bytes.Length; i++)
        {
            builder.Append(bytes[i].ToString("x2"));
        }
        return builder.ToString();
    }
}
#endregion

通過此方法可以生成唯一的哈希值,作為請求的簽名字段附加在請求頭或參數(shù)中。

2、RSA 加密與解密

RSA 是一種非對稱加密算法,適合用于密鑰交換或數(shù)字簽名等場景。以下是 C# 中的 RSA 加解密實現(xiàn):

#region RSA加密/解密
private readonly RSA _privateKeyRsaProvider;
private readonly RSA _publicKeyRsaProvider;
private readonly Encoding _encoding;

/// <param name="encoding">編碼類型</param>
/// <param name="privateKey">私鑰</param>
/// <param name="publicKey">公鑰</param>
public RSAHelper(Encoding encoding, string privateKey, string publicKey = null)
{
    _encoding = encoding;
    if (!string.IsNullOrEmpty(privateKey))
    {
        _privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey);
    }
    if (!string.IsNullOrEmpty(publicKey))
    {
        _publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey);
    }
}

// 解密
public string Decrypt(string cipherText)
{
    if (_privateKeyRsaProvider == null)
    {
        throw new Exception("_privateKeyRsaProvider is null");
    }
    return Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1));
}

// 加密
public string Encrypt(string text)
{
    if (_publicKeyRsaProvider == null)
    {
        throw new Exception("_publicKeyRsaProvider is null");
    }
    return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
}
#endregion

客戶端使用公鑰加密敏感信息,服務(wù)端使用私鑰解密,從而保證傳輸數(shù)據(jù)的機(jī)密性。

3、AES 加密與解密

AES 是一種對稱加密算法,常用于大量數(shù)據(jù)的加密處理。以下是 C# 中的 AES 加解密示例:

#region AES加密/解密
/// <summary>
/// 加密不帶偏移量
/// </summary>
/// <param name="input"></param>
/// <param name="key">秘鑰</param>
/// <returns></returns>
public static string EncryptByAES(string input, string key)
{
    if (string.IsNullOrWhiteSpace(input))
    {
        return input;
    }
    using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
    {
        rijndaelManaged.Mode = CipherMode.ECB;
        rijndaelManaged.Padding = PaddingMode.PKCS7;
        rijndaelManaged.FeedbackSize = 128;
        byte[] data3 = Enumerable.Range(0, key.Length / 2)
            .Select(x => Byte.Parse(key.Substring(x * 2, 2), NumberStyles.HexNumber))
            .ToArray();
        rijndaelManaged.Key = data3;
        ICryptoTransform encryptor = rijndaelManaged.CreateEncryptor(rijndaelManaged.Key, rijndaelManaged.IV);
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(input);
                }
                byte[] bytes = msEncrypt.ToArray();
                return HexConvert.byteToHexStr(bytes);
            }
        }
    }
}

/// <summary>
/// 返回解密后的字符串
/// </summary>
/// <param name="input"></param>
/// <param name="key">秘鑰</param>
/// <returns></returns>
public static string DecryptByAES(string input, string key)
{
    if (string.IsNullOrWhiteSpace(input))
    {
        return input;
    }
    var buffer = HexConvert.strToToHexByte(input);
    using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
    {
        rijndaelManaged.Mode = CipherMode.ECB;
        rijndaelManaged.Padding = PaddingMode.PKCS7;
        rijndaelManaged.FeedbackSize = 128;
        byte[] data3 = Enumerable.Range(0, key.Length / 2)
            .Select(x => Byte.Parse(key.Substring(x * 2, 2), NumberStyles.HexNumber))
            .ToArray();
        rijndaelManaged.Key = data3;
        ICryptoTransform decryptor = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV);
        using (MemoryStream msEncrypt = new MemoryStream(buffer))
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srEncrypt = new StreamReader(csEncrypt))
                {
                    return srEncrypt.ReadToEnd();
                }
            }
        }
    }
}
#endregion

AES 通常用于加密業(yè)務(wù)數(shù)據(jù)本身,結(jié)合 RSA 可以實現(xiàn)更完整的安全體系。

4、數(shù)據(jù)格式轉(zhuǎn)換工具類

為了支持不同格式的數(shù)據(jù)處理,還需要一些輔助函數(shù)來完成數(shù)據(jù)轉(zhuǎn)換:

#region 數(shù)據(jù)轉(zhuǎn)換
// 字符串轉(zhuǎn)換為字節(jié)數(shù)組
byte[] originalBytes = System.Text.Encoding.UTF8.GetBytes(originalText);

// 進(jìn)行Base64編碼
string base64Encoded = Convert.ToBase64String(originalBytes);

// 進(jìn)行Base64解碼
byte[] base64DecodedBytes = Convert.FromBase64String(base64Encoded);

// 字節(jié)數(shù)組轉(zhuǎn)字符串
string base64DecodedText = System.Text.Encoding.UTF8.GetString(base64DecodedBytes);

// 16進(jìn)制轉(zhuǎn)base64字符串
byte[] enterpriseCode_ = HexConvert.strToToHexByte(data.enterpriseCode);
string enterpriseCode = Convert.ToBase64String(enterpriseCode_);

/// <summary> 
/// 字節(jié)數(shù)組轉(zhuǎn)16進(jìn)制字符串 
/// </summary> 
/// <param name="byteArray"></param> 
/// <returns></returns> 
public static string byteToHexStr2(byte[] byteArray)
{
    string hexString = BitConverter.ToString(byteArray);
    return hexString.Replace("-", "");
}

/// <summary> 
/// 字節(jié)數(shù)組轉(zhuǎn)16進(jìn)制字符串 
/// </summary> 
/// <param name="bytes"></param> 
/// <returns></returns> 
public static string byteToHexStr(byte[] bytes)
{
    string returnStr = "";
    if (bytes != null)
    {
        for (int i = 0; i < bytes.Length; i++)
        {
            returnStr += bytes[i].ToString("X2");
        }
    }
    return returnStr;
}

/// <summary> 
/// 字符串轉(zhuǎn)16進(jìn)制字節(jié)數(shù)組 
/// </summary> 
/// <param name="hexString"></param> 
/// <returns></returns> 
public static byte[] strToToHexByte(string hexString)
{
    hexString = hexString.Replace(" ", "");
    if ((hexString.Length % 2) != 0)
        hexString += " ";
    byte[] returnBytes = new byte[hexString.Length / 2];
    for (int i = 0; i < returnBytes.Length; i++)
        returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    return returnBytes;
}
#endregion

這些方法廣泛應(yīng)用于加密前后數(shù)據(jù)格式的處理,如將加密結(jié)果轉(zhuǎn)為16進(jìn)制字符串、Base64編碼等。

項目效果

通過上述加密機(jī)制,API 請求在傳輸前會經(jīng)過如下流程:

1、參數(shù)拼接并計算 SHA256 簽名;

2、敏感數(shù)據(jù)使用 AES 加密;

3、AES 密鑰使用 RSA 公鑰加密;

4、所有數(shù)據(jù)打包發(fā)送至服務(wù)端;

5、服務(wù)端使用 RSA 私鑰解密密鑰,再使用 AES 解密數(shù)據(jù),并驗證簽名。

整個流程有效防止了中間人攻擊、數(shù)據(jù)篡改和重放攻擊等問題,極大增強(qiáng)了接口的安全性。

總結(jié)

本文詳細(xì)介紹了在實際項目中使用的 Web API 接口安全加密方案,包括:

  • 使用 SHA256 對請求參數(shù)進(jìn)行簽名;
  • 使用 RSA 進(jìn)行非對稱加密傳輸密鑰;
  • 使用 AES 進(jìn)行對稱加密保護(hù)數(shù)據(jù);
  • 提供了完整的 C# 示例代碼;
  • 包含常用數(shù)據(jù)格式轉(zhuǎn)換方法。

這套方案已在生產(chǎn)環(huán)境中穩(wěn)定運行,具有良好的兼容性和擴(kuò)展性。如果你也有類似的加密需求,歡迎交流分享你的經(jīng)驗!

最后

到此這篇關(guān)于C#實現(xiàn)WebAPI接口安全加密的具體方案的文章就介紹到這了,更多相關(guān)C# WebAPI接口加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# 中的 LINQ語法和類型(兩種語法)

    C# 中的 LINQ語法和類型(兩種語法)

    LINQ 允許開發(fā)人員直接在 C# 代碼中編寫查詢,從而更輕松地操作和轉(zhuǎn)換數(shù)據(jù),這篇文章主要介紹了C# 中的 LINQ:語法和類型,需要的朋友可以參考下
    2024-06-06
  • 基于WPF實現(xiàn)3D導(dǎo)航欄控件

    基于WPF實現(xiàn)3D導(dǎo)航欄控件

    這篇文章主要介紹了如何基于WPF實現(xiàn)簡單的3D導(dǎo)航欄控件效果,文中的示例代碼講解詳細(xì),對我們的學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下
    2024-03-03
  • C#實現(xiàn)Word文檔自動化創(chuàng)建與管理詳解

    C#實現(xiàn)Word文檔自動化創(chuàng)建與管理詳解

    在日常的軟件開發(fā)和業(yè)務(wù)流程中,我們經(jīng)常面臨需要自動化生成復(fù)雜文檔的需求,本文將深入探討如何利用C#的強(qiáng)大能力,結(jié)合現(xiàn)代化的工具庫,實現(xiàn)Word文檔的自動化創(chuàng)建與管理,感興趣的小伙伴可以了解下
    2025-11-11
  • C#?使用SpecFlow創(chuàng)建BDD測試用例的示例代碼

    C#?使用SpecFlow創(chuàng)建BDD測試用例的示例代碼

    這篇文章主要介紹了C#?使用SpecFlow創(chuàng)建BDD測試用例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 使用C#實現(xiàn)MD5加密的方法詳解

    使用C#實現(xiàn)MD5加密的方法詳解

    在軟件開發(fā)中,加密是保護(hù)數(shù)據(jù)安全的重要手段之一,MD5(Message Digest Algorithm 5)是一種常用的哈希算法,用于生成數(shù)據(jù)的摘要或哈希值,本文介紹了如何使用C#語言實現(xiàn)MD5加密的方法,涵蓋了基本的使用方式和擴(kuò)展方法封裝,需要的朋友可以參考下
    2024-08-08
  • C#程序中創(chuàng)建、復(fù)制、移動、刪除文件或文件夾的示例

    C#程序中創(chuàng)建、復(fù)制、移動、刪除文件或文件夾的示例

    這篇文章主要介紹了C#程序中創(chuàng)建、復(fù)制、移動、刪除文件或文件夾的示例,即對System.IO命名空間中類的運用,需要的朋友可以參考下
    2016-02-02
  • C#快速實現(xiàn)拖放操作

    C#快速實現(xiàn)拖放操作

    這篇文章介紹了C#快速實現(xiàn)拖放操作的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Unity實現(xiàn)多平臺二維碼掃描

    Unity實現(xiàn)多平臺二維碼掃描

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)多平臺二維碼掃描,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C#推送信息到APNs的方法

    C#推送信息到APNs的方法

    這篇文章主要介紹了C#推送信息到APNs的方法,涉及C#推送通知到蘋果APNs的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • C#事務(wù)處理(Execute Transaction)實例解析

    C#事務(wù)處理(Execute Transaction)實例解析

    這篇文章主要介紹了C#事務(wù)處理(Execute Transaction)實例解析,對于理解和學(xué)習(xí)事務(wù)處理有一定的幫助,需要的朋友可以參考下
    2014-08-08

最新評論

宁波市| 始兴县| 伊春市| 元谋县| 邹城市| 黔东| 梧州市| 廉江市| 宜城市| 叙永县| 环江| 台中县| 朝阳区| 崇文区| 洛扎县| 内江市| 大庆市| 雷山县| 广南县| 彝良县| 景德镇市| 麟游县| 安多县| 北安市| 泽普县| 阿拉善左旗| 金山区| 邻水| 沭阳县| 丰顺县| 汤原县| 莱阳市| 锦州市| 鄢陵县| 新乐市| 呼伦贝尔市| 中宁县| 页游| 阿坝| 南宫市| 余江县|