有没有办法保护您的程序集到类/属性&类/方法级别,以防止未经我们公司签名的其他程序集使用/调用它们?
我想在没有任何强命名要求的情况下这样做(比如使用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(),但未被拒绝
发布于 2010-05-11 06:47:53
如果您希望将调用者限制为只使用由特定证书签名的authenticode签名的代码,您仍然可以使用CAS (只是不使用StrongNameIdentityPermission)。
就像使用任何PublisherIdentityPermission权限一样使用CAS。或者,如果您想以声明方式完成此操作,则可以使用use an attribute。
发布于 2010-05-11 07:31:58
显然,您必须对来自被调用方法的每个调用执行检查-任何试图强制实施限制的外部系统都可以使用反射轻松绕过。
在该方法中,您可以使用
new StackTrace().GetFrame(1).GetMethod().Module.Assembly
来获取调用程序集。现在您可以使用
callingAssembly.GetName().GetPublicKey()
获取调用程序集的公钥,并将其与被调用程序集的公钥进行比较。如果它们匹配-假设您的所有程序集都使用相同的密钥对签名-调用者将被接受为合法调用者。
但有一个漏洞-第三方程序集可以使用您的公司公钥延迟签名,并排除在数字签名验证之外。因此,加载器将使用强名称和您公司的公钥加载第三方程序集,即使它尚未签名。要关闭此循环漏洞,您必须检查签名。没有托管API,您必须P/Invoke
Boolean StrongNameSignatureVerificationEx(
String wszFilePath,
Boolean fForceVerification,
ref Boolean pfWasVerified)
将fForceVerification
设置为true
,并检查结果是否为true
。
总而言之,这可能是每个调用相当多的开销。可能的诱惑是缓存结果,但假设调用者具有反射权限,操作这样的缓存可能并不是很难。另一方面,你永远不会有100%的把握。控制系统的人可以自由地(几乎)做他想做的任何事情--附加调试器、修改内存内容、操纵库或整个运行时。最后,您还必须有效地保护您的程序集不被反编译和修改。
发布于 2010-05-11 06:48:10
我觉得这太大惊小怪了!如果你真的想要安全性,把你的代码放在服务器后面,并使用客户端-服务器架构。或web服务。或者介于两者之间的东西,比如WCF或remoting。然后使用身份验证对客户端进行身份验证。
见鬼,你可以让所有的东西都是私有的,公开一个公共API,并在本地根调用。
在纯桌面环境中保护来自未经授权调用者的dll只会使问题变得更加复杂和难以处理。更不用说它的内部看起来会很丑陋。
我看到了一些惯例的出现。这可能对你有用。但它并不能为您提供所需的“完全安全性”。如果你有一个应该对客户隐藏的程序集,不要把它放在GAC中。使用名称空间,后缀类似于"INTERNAL“。
https://stackoverflow.com/questions/2806842
复制相似问题