保护装配体,使其不能被第三方使用
时间:2020-03-06 14:46:49 来源:igfitidea点击:
我编写了一个我不希望其他人能够使用的程序集。我的程序集使用强名称密钥文件签名,但是如何保护代码,以便只有其他使用相同密钥签名的程序集才能调用此程序集中的成员?
解决方案
在我看来,这是不可能解决的问题。我们不能相信自己的环境。这是基本的计算原理,也是公用/专用密钥加密的原因。
我们需要添加StrongNameIdentityPermissionAttribute属性以要求安全性
例如
[assembly:StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum, PublicKey="00240000048000009400000006020000002400005253413100040000010001005" + "38a4a19382e9429cf516dcf1399facdccca092a06442efaf9ecaca33457be26ee0073c6bde5" + "1fe0873666a62459581669b510ae1e84bef6bcb1aff7957237279d8b7e0e25b71ad39df3684" + "5b7db60382c8eb73f289823578d33c09e48d0d2f90ed4541e1438008142ef714bfe604c41a4" + "957a4f6e6ab36b9715ec57625904c6")]
请参阅此msdn页面以获取更多信息
或者在代码中看到这个例子
我建议我们使用LicenseProvider属性来确保对程序集的使用。有关确切用法的更多信息,请参见MSDN。
不确定这是否是最佳选择,但是我们可以将程序集中的所有"公共"类设置为内部,然后使用[InternalsVisibleTo]程序集级别属性来显式指定其他已签名的程序集。
[assembly: InternalsVisibleTo('MyAssembly,Version=1.0.0.1, Culture=neutral,PublicKeyToken=...");
这是有关该属性的MSDN文档。
最初,我认为我们可以将我们签名的程序集中的成员/类设为私有,然后将程序集级别的InternalsVisibleTo属性应用于其他程序集。我猜想这种反射会让我们克服困难。
也许StrongNameIdentityPermission是我们要寻找的。
有几种选择,没有一种非常有效,因为它们只会使事情变得有些困难,而不会阻止忠实的用户解决任何限制:
在每个入口点上,都可以调用Assembly.GetCallingAssembly()并将结果与允许调用到库中的程序集列表进行比较,否则抛出异常。
我们可以使用ilmerge之类的工具将程序集合并到主应用程序中,并将所有内部部件标记为私有。与混淆器结合使用,可以更好地保护结果。
但是保护程序集就像保护攻击者对其具有物理访问权限的计算机一样牢固:一旦授予了物理访问权限,我们就可以采取什么措施来保护内容。