分層架構中,業務邏輯層 (BLL) 引用數據訪問層 (DAL) 的 DLL。若客戶獲取 DLL,可直接引用調用敏感方法(如 ChangePwd、TransferMoney),繞過業務邏輯驗證造成破壞。
StrongNameIdentityPermission 限制調用者必須持有相同強名稱密鑰# 開發者命令提示符 (管理員) sn -k D:\Keys\MyProject.snk
生成包含公私鑰的 MyProject.snk 文件,嚴格保管,勿提交代碼倉庫。
項目屬性 → 簽名 → 勾選「為程序集簽名」 → 選擇強名稱密鑰文件
或編輯 AssemblyInfo.cs:
[assembly: AssemblyKeyFile(@"D:\Keys\MyProject.snk")]
# 1. 從 .snk 導出公鑰 sn -p D:\Keys\MyProject.snk D:\Keys\MyProject.PublicKey.snk # 2. 顯示公鑰 Token 與十六進制字符串 sn -tp D:\Keys\MyProject.PublicKey.snk
輸出示例:
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0 Copyright (c) Microsoft Corporation. All rights reserved. Public Key Token: 3b4a5c6d7e8f9a0b Public Key: 0024000004800000940000000602000000240000525341310004000001000100... (一長串十六進制字符)
using System;
using System.Security.Permissions;
[StrongNameIdentityPermissionAttribute(
SecurityAction.LinkDemand, // 或 Demand
PublicKey = "0024000004800000940000000602000000240000525341310004000001000100...")]
public class UserRepository
{
public void ChangePassword(string userName, string newPwd)
{
// 敏感操作
}
}
// BLL 項目 AssemblyInfo.cs [assembly: AssemblyKeyFile(@"D:\Keys\MyProject.snk")]
| 特性 | LinkDemand | Demand |
|---|---|---|
| 檢查範圍 | 直接調用者 | 整個調用堆棧 |
| 性能 | 高 (JIT 時檢查一次) | 低 (每次調用檢查堆棧) |
| 場景 | 信任直接調用者 | 需信任完整調用鏈 |
| 繞過風險 | 中間層可包裝調用繞過 | 難繞過 |
ChangePassword 方法System.Security.SecurityException:Request for the permission of type 'System.Security.Permissions.StrongNameIdentityPermission' failed.dotnet sign 或項目屬性簽名,原理相同[assembly: InternalsVisibleTo("MyTrustedAssembly, PublicKey=...")] 精確控制友元訪問Dotfuscator、ConfuserEx 增加反編譯分析成本強名稱簽名配合 CAS 權限需求,構建「持有密鑰者才能調用」的信任邊界,是保護 .NET 組件知識產權與運行時安全的經典有效手段。