有人在使用你的程序集吗? (SecUtil.exe .NET Framework 工具系列)






2.53/5 (15投票s)
SecUtil.exe
引言
我们每天在项目中创建大量的程序集。我们有没有想过,我们投入了如此多的努力和心血编写的这些程序集,很容易被其他人使用。有时,你也不希望其他人使用特定的类或方法,因为它可能检索一些重要或机密的信息。.NET 本身就基于在应用程序之间共享程序集的概念,这实现了快速应用程序开发 (RAD)。我们可以通过识别调用者来保护我们的代码。
托管代码提供了几种限制方法访问的方式
- 如果可以信任它们,则将可访问性的范围限制为类、程序集或派生类。这是限制方法访问的最简单方法。请注意,通常,派生类可能不如它们所派生的类更值得信赖,尽管在某些情况下,它们共享父类的身份。特别是,不要从关键字 protected 推断信任,因为它不一定在安全上下文中被使用。
- 将方法访问限制为具有你选择的特定身份的调用者——本质上,任何特定的证据(强名称、发布者、区域等)。
- 将方法访问限制为具有你选择的任何权限的调用者。
让我们看看如何做到这一点
- 创建一个强命名程序集,例如 Calc.dll,其中包含一个名为
MyClass
的类,该类具有一个将两个数字相加的Add()
方法。 - .NET Framework 有一个名为 SecUtil.exe 的工具。
- 转到 Visual Studio 命令提示符
- 键入 SecUtil.exe /?。这将显示帮助和所有可用选项。
- 然后键入 secutil.exe -s -hex -c Calc.dll(或你的 DLL 的名称)。
- 这将以十六进制值显示公钥,如下所示
C:\DotNet\DLLProj\bin\Debug>secutil -hex -c -s Calc.dll
Microsoft (R) .NET Framework SecUtil 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Public Key =
0x0024000004800000940000000602000000240000525341310004000001000100D96FE3B963FC64
B8A9B6CA05B859A67B8B30603A0D696E1F95D8C9B23C5B2EEF139B96A5CC55C2E38D05B7FD675434
A3EE1EF70C69AE3BDE8E646BF652C006278884856E10D3CD0273B458A3E8ECAF47BE51FC7619E271
6602B6EFE34824238F1CAF86960691256D0608E317217E174F4947397A9D5D0BA48785E8CB726E0F
CA
Name =
Calc
Version =
1.0.1761.29820
Success
现在你可以使用这个公钥与程序集中的任何类或方法,你不想让其他人访问它,可以使用 StrongNameIdentityPermissionAttribute
来实现。任何没有使用你的 *.snk 文件签名的调用代码都将无法访问它。
这里我已经在类级别使用了它。你也可以在方法或程序集级别实现相同的功能。
那么,让我们保护我们的类吧
// put this code above the class as shown
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand,
PublicKey =
"0x0024000004800000940000000602000000240000525341310004000001000100D96FE3B963FC64" +
"B8A9B6CA05B859A67B8B30603A0D696E1F95D8C9B23C5B2EEF139B96A5CC55C2E38D05B7FD675434" +
"A3EE1EF70C69AE3BDE8E646BF652C006278884856E10D3CD0273B458A3E8ECAF47BE51FC7619E271"+
"6602B6EFE34824238F1CAF86960691256D0608E317217E174F4947397A9D5D0BA48785E8CB726E0FCA")]
public class MyClass
{
public MyClass()
{
}
public int Add(int i , int j)
{
}
}
- 现在创建一个 Win 应用程序,它将是此程序集的客户端应用程序。
- 不要为这个程序集进行强命名。
- 在客户端 App 中引用上面的程序集。
- 调用
Add
方法或Myclass
的任何其他方法。 - 代码将编译通过。
- 尝试执行函数调用。你将收到类似于下面的错误消息
Additional information: Request for the permission of
type System.Security.Permissions.StrongNameIdentityPermission, mscorlib,
Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed.
历史
- 2006 年 1 月 16 日:初始发布