首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >保护来自未经授权调用者的C#程序集

保护来自未经授权调用者的C#程序集
EN

Stack Overflow用户
提问于 2010-05-11 06:17:25
回答 6查看 7.9K关注 0票数 18

有没有办法保护您的程序集到类/属性&类/方法级别,以防止未经我们公司签名的其他程序集使用/调用它们?

我想在没有任何强命名要求的情况下这样做(比如使用StrongNameIdentityPermission),并坚持程序集的签名方式。我真的不想求助于使用InternalsVisibleTo属性,因为这在不断变化的软件生态系统中是不可维护的。

例如:

场景一

Foo.dll是由我的公司签名的,而Bar.dll根本没有签名。

Foo有A级酒吧有B级

类A具有公共方法GetSomething(),类B尝试调用Foo.A.GetSomething()但被拒绝

Rejected可以是一个异常,也可以以某种方式被忽略

场景二

Foo.dll是由我公司签署的,Moo.dll也是由我公司签署的。

Foo有A级Moo有C级

类A具有公共方法GetSomething(),类C尝试调用Foo.A.GetSomething(),但未被拒绝

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-11 06:47:53

如果您希望将调用者限制为只使用由特定证书签名的authenticode签名的代码,您仍然可以使用CAS (只是不使用StrongNameIdentityPermission)。

就像使用任何PublisherIdentityPermission权限一样使用CAS。或者,如果您想以声明方式完成此操作,则可以使用use an attribute

票数 6
EN

Stack Overflow用户

发布于 2010-05-11 07:31:58

显然,您必须对来自被调用方法的每个调用执行检查-任何试图强制实施限制的外部系统都可以使用反射轻松绕过。

在该方法中,您可以使用

代码语言:javascript
复制
new StackTrace().GetFrame(1).GetMethod().Module.Assembly

来获取调用程序集。现在您可以使用

代码语言:javascript
复制
callingAssembly.GetName().GetPublicKey()

获取调用程序集的公钥,并将其与被调用程序集的公钥进行比较。如果它们匹配-假设您的所有程序集都使用相同的密钥对签名-调用者将被接受为合法调用者。

但有一个漏洞-第三方程序集可以使用您的公司公钥延迟签名,并排除在数字签名验证之外。因此,加载器将使用强名称和您公司的公钥加载第三方程序集,即使它尚未签名。要关闭此循环漏洞,您必须检查签名。没有托管API,您必须P/Invoke

代码语言:javascript
复制
Boolean StrongNameSignatureVerificationEx(
   String wszFilePath,
   Boolean fForceVerification,
   ref Boolean  pfWasVerified)

fForceVerification设置为true,并检查结果是否为true

总而言之,这可能是每个调用相当多的开销。可能的诱惑是缓存结果,但假设调用者具有反射权限,操作这样的缓存可能并不是很难。另一方面,你永远不会有100%的把握。控制系统的人可以自由地(几乎)做他想做的任何事情--附加调试器、修改内存内容、操纵库或整个运行时。最后,您还必须有效地保护您的程序集不被反编译和修改。

票数 6
EN

Stack Overflow用户

发布于 2010-05-11 06:48:10

我觉得这太大惊小怪了!如果你真的想要安全性,把你的代码放在服务器后面,并使用客户端-服务器架构。或web服务。或者介于两者之间的东西,比如WCF或remoting。然后使用身份验证对客户端进行身份验证。

见鬼,你可以让所有的东西都是私有的,公开一个公共API,并在本地根调用。

在纯桌面环境中保护来自未经授权调用者的dll只会使问题变得更加复杂和难以处理。更不用说它的内部看起来会很丑陋。

我看到了一些惯例的出现。这可能对你有用。但它并不能为您提供所需的“完全安全性”。如果你有一个应该对客户隐藏的程序集,不要把它放在GAC中。使用名称空间,后缀类似于"INTERNAL“。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2806842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档