应使用.NET内置的aspnet_regiis.exe工具加密web.config中的connectionStrings节,命令为aspnet_regiis -pef "connectionStrings" "C:\YourWebAppPath",加密后IIS运行时自动解密,无需代码改动。

直接在 Web 应用中明文存放数据库连接字符串,等于把钥匙挂在门把手上——配置文件一旦被下载、泄露或误提交到代码仓库,攻击者就能直连数据库。加密存储不是“可选项”,而是基础防线。核心思路是:不让连接字符串以明文形式落盘,且密钥不与代码共存。
优先使用 .NET 内置的配置节加密机制
这是 Windows 服务器环境最稳妥、零代码改动的方式,由框架自动加解密,无需自己管理密钥逻辑。
- 确保 web.config 中的
节独立存在,内容为标准格式(如Server=...;Database=...;User Id=...;Password=...;) - 用命令行工具
aspnet_regiis.exe加密该节:aspnet_regiis -pef "connectionStrings" "C:\YourWebAppPath" - 加密后,web.config 中该节会变成密文块,部署时无需修改代码;IIS 运行时自动解密并提供给
ConfigurationManager.ConnectionStrings - 注意:若用
RSAProtectedConfigurationProvider,需提前授权密钥容器访问权限,例如运行aspnet_regiis -pa "NetFrameworkConfigurationKey" "IIS APPPOOL\YourAppPoolName"
云环境或跨平台推荐环境变量 + 外部密钥服务
当应用部署在 Azure、AWS 或 Docker/K8s 环境时,硬编码或本地加密已不适用。应剥离敏感配置,交由专业服务托管。
- 将连接字符串整体作为密文,存入 Azure Key Vault / AWS Secrets Manager / HashiCorp Vault
- 应用启动时,通过托管身份(Managed Identity)或短期凭证从服务中拉取密文
- 在代码中调用解密 API(如 Azure SDK 的
SecretClient.GetSecretAsync()),再传给数据库连接工厂 - 绝不把密钥、Vault 地址、访问令牌写死在 config 或代码里;所有凭据通过运行时注入
自定义 AES 加密需严控密钥生命周期
仅在无法使用上述方案时采用,但必须解决密钥安全这个“鸡生蛋”问题。
- 密钥长度必须为 32 字节(AES-256),向量(IV)16 字节,且每次加密应生成新 IV 并与密文一同存储(如 Base64 拼接)
- 密钥本身不能出现在源码、config 或资源文件中;可考虑从 HSM、TPM 或操作系统 DPAPI 提取派生密钥
- 若必须硬编码,请将密钥拆分为多段,在运行时拼接,并混淆加载逻辑(但此法仅防低阶扫描,不防反编译)
- 解密操作应封装在独立初始化模块中,避免在日志、异常堆栈或内存转储中暴露明文连接串
配套必须做的三件事
加密只是起点,漏掉任一环节都可能让努力白费。
-
禁用敏感端点:Spring Boot Actuator 默认开放
/actuator/env会直接吐出所有配置,务必设management.endpoints.web.exposure.include=health,info,关闭其余项 -
限制配置文件访问:确保 web.config 不被 IIS 直接响应(检查
配置),防止用户通过/web.config下载原始文件 -
禁止日志打印连接串:在 Entity Framework 或 Dapper 初始化、异常捕获等位置检查是否无意记录了
ConnectionString,统一用占位符(如"[DB_CONN_REDACTED]")替代










