You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET C#中跨互联网传输密码等敏感信息的安全实现方法

.NET平台跨互联网传输敏感凭据的原生防护方案

基础传输层防护(必选配置)

所有跨网传输的第一防护层是强制TLS加密,.NET全版本原生支持,无需第三方依赖:

  • 前端到MVC服务端:全站启用HTTPS,MVC管道直接配置强制HTTPS跳转、HSTS头,禁止任何携带凭据的请求走HTTP协议。.NET Framework 4.7+、.NET Core/.NET 5+默认启用TLS1.2/1.3,低版本可在全局启动配置中加代码指定协议版本:
// 全局配置,禁用不安全的SSL、低版本TLS
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
  • MVC服务端到Salesforce等外部应用:调用外部接口时必须使用对方提供的HTTPS端点,禁止调用HTTP接口,上述TLS配置会自动对出站请求生效。

应用层加密补充防护(针对两个核心风险点)

仅靠TLS无法覆盖证书伪造、内部链路泄露、内存dump等极端场景,.NET内置了多套加密类可实现端到端的凭据加密,不需要引入第三方组件。

1. 前端到后端提交环节的明文泄露修复

对应风险:用户在UI输入的凭据POST到MVC控制器时明文传输。
采用RSA非对称加密实现端到端加密,用到.NET内置的System.Security.Cryptography.RSA类,实现流程:

  • 后端提前生成RSA2048位以上的公钥、私钥对,私钥存在服务端本地配置文件(受系统权限保护),公钥通过接口下发给AngularJS前端
  • 前端用户输入凭据提交前,用公钥对凭据字段做加密,POST请求仅传输密文
  • 后端收到请求后,用私钥解密密文得到凭据明文,链路抓包仅能拿到无法破解的密文
    后端加解密参考代码:
using System.Security.Cryptography;
using System.Text;

public static class RsaTransportHelper
{
    // 私钥严禁外传、严禁写入前端代码、严禁存入数据库
    private const string PrivateKeyConfig = "<RSAKeyValue>你的私钥XML内容</RSAKeyValue>";
    // 公钥可公开下发给前端
    public const string PublicKeyConfig = "<RSAKeyValue>对应公钥XML内容</RSAKeyValue>";

    public static string DecryptRequestCipher(string base64Cipher)
    {
        using var rsa = RSA.Create(keySize: 2048);
        rsa.FromXmlString(PrivateKeyConfig);
        var cipherBytes = Convert.FromBase64String(base64Cipher);
        var plainBytes = rsa.Decrypt(cipherBytes, RSAEncryptionPadding.OaepSHA256);
        return Encoding.UTF8.GetString(plainBytes);
    }
}

前端AngularJS侧引入标准的前端RSA加密库,用拿到的公钥加密凭据字段后提交即可。

2. 存储凭据重发校验环节的明文泄露修复

对应风险:数据库加密存储的凭据,重发校验时解密后明文传输。
这里分存储、出站传输、内存防护三个环节做加固,用到.NET内置的System.Security.Cryptography.ProtectedData(DPAPI,Windows系统原生加密能力)和SecureString类:

  • 存储环节:不用自行实现AES等对称加密(不需要自己维护密钥,避免密钥泄露),直接用DPAPI加密凭据,加密后的数据仅能被当前服务器上运行服务的Windows账号解密,密钥由操作系统托管
  • 出站传输环节:依然强制走TLS1.2+的HTTPS请求,从数据库读取解密后的凭据不要转成普通string(普通string在内存中不可变,会驻留到GC回收,易被内存dump窃取),用SecureString存储临时凭据,用完立即释放
  • 传输完成后立即清空内存中的临时明文数据,不要在任何日志、异常堆栈、接口返回值中输出凭据明文
    参考实现代码:
using System.Security.Cryptography;
using System.Security;
using System.Text;

public static class CredentialStorageHelper
{
    // 加密凭据写入数据库
    public static byte[] EncryptForStorage(string plainCredential)
    {
        var plainBytes = Encoding.UTF8.GetBytes(plainCredential);
        // 加密范围指定为当前用户,仅服务运行账号可解密
        var encrypted = ProtectedData.Protect(plainBytes, null, DataProtectionScope.CurrentUser);
        // 立即清空内存里的明文字节数组
        Array.Clear(plainBytes, 0, plainBytes.Length);
        return encrypted;
    }

    // 从数据库读取加密凭据,解密后供外部接口调用使用
    public static SecureString DecryptForExternalCall(byte[] storedEncryptedData)
    {
        var plainBytes = ProtectedData.Unprotect(storedEncryptedData, null, DataProtectionScope.CurrentUser);
        var secureCredential = new SecureString();
        foreach (var b in plainBytes)
        {
            secureCredential.AppendChar((char)b);
        }
        secureCredential.MakeReadOnly();
        // 清清明文缓存
        Array.Clear(plainBytes, 0, plainBytes.Length);
        return secureCredential;
    }
}

额外优化建议

  • 如果对接的外部应用支持OAuth2、API Key等鉴权模式,优先使用短期有效的token代替长期的账号密码凭据,减少敏感凭据的存储周期
  • 所有涉及凭据的接口不要开启请求参数自动日志记录,避免明文被写入日志文件
  • 定期轮换RSA密钥、数据库存储的凭据,降低泄露后的影响范围

内容的提问来源于stack exchange,提问作者Georgia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:36:23