65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.53/5 (15投票s)

2006年1月16日

CPOL

2分钟阅读

viewsIcon

46345

SecUtil.exe

引言

我们每天在项目中创建大量的程序集。我们有没有想过,我们投入了如此多的努力和心血编写的这些程序集,很容易被其他人使用。有时,你也不希望其他人使用特定的类或方法,因为它可能检索一些重要或机密的信息。.NET 本身就基于在应用程序之间共享程序集的概念,这实现了快速应用程序开发 (RAD)。我们可以通过识别调用者来保护我们的代码。

托管代码提供了几种限制方法访问的方式

  • 如果可以信任它们,则将可访问性的范围限制为类、程序集或派生类。这是限制方法访问的最简单方法。请注意,通常,派生类可能不如它们所派生的类更值得信赖,尽管在某些情况下,它们共享父类的身份。特别是,不要从关键字 protected 推断信任,因为它不一定在安全上下文中被使用。
  • 将方法访问限制为具有你选择的特定身份的调用者——本质上,任何特定的证据(强名称、发布者、区域等)。
  • 将方法访问限制为具有你选择的任何权限的调用者。

让我们看看如何做到这一点

  1. 创建一个强命名程序集,例如 Calc.dll,其中包含一个名为 MyClass 的类,该类具有一个将两个数字相加的 Add() 方法。
  2. .NET Framework 有一个名为 SecUtil.exe 的工具。
  3. 转到 Visual Studio 命令提示符
  4. 键入 SecUtil.exe /?。这将显示帮助和所有可用选项。
  5. 然后键入 secutil.exe -s -hex -c Calc.dll(或你的 DLL 的名称)。
  6. 这将以十六进制值显示公钥,如下所示
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)
{
}
}
  1. 现在创建一个 Win 应用程序,它将是此程序集的客户端应用程序。
  2. 不要为这个程序集进行强命名。
  3. 在客户端 App 中引用上面的程序集。
  4. 调用 Add 方法或 Myclass 的任何其他方法。
  5. 代码将编译通过。
  6. 尝试执行函数调用。你将收到类似于下面的错误消息
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 日:初始发布
有人在使用你的程序集吗? (SecUtil.exe .NET Framework 工具系列) - CodeProject - 代码之家
© . All rights reserved.