我写了一个我不希望其他人能够使用的程序集。我的程序集使用强名称密钥文件进行签名,但是如何保护代码以便只有使用相同密钥签名的其他程序集才能调用此程序集中的成员?
答案 0 :(得分:12)
有一些选项,没有一个非常有效,因为它们只会使事情变得有点困难,但不会阻止已提交的用户解决任何限制:
在每个入口点上,您可以调用Assembly.GetCallingAssembly()并将结果与允许调用库的程序集列表进行比较,否则抛出异常。
您可以使用像ilmerge这样的工具将程序集合并到主应用程序中,并将所有内部标记为私有。与混淆器结合使用可以更好地保护结果。
但是保护程序集与保护攻击者可以物理访问它的计算机一样可靠:只有在授予物理访问权限后才能保护内容。
答案 1 :(得分:3)
您需要将StrongNameIdentityPermissionAttributeattributes添加到需求安全性
例如
[assembly:StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum,
PublicKey="00240000048000009400000006020000002400005253413100040000010001005" +
"38a4a19382e9429cf516dcf1399facdccca092a06442efaf9ecaca33457be26ee0073c6bde5" +
"1fe0873666a62459581669b510ae1e84bef6bcb1aff7957237279d8b7e0e25b71ad39df3684" +
"5b7db60382c8eb73f289823578d33c09e48d0d2f90ed4541e1438008142ef714bfe604c41a4" +
"957a4f6e6ab36b9715ec57625904c6")]
请参阅此msdn page了解详情
或在代码中执行,请参阅this example
答案 2 :(得分:2)
我建议您使用LicenseProvider属性来保护程序集的使用。有关确切用法的更多信息,请访问here on MSDN
答案 3 :(得分:1)
不确定这是否是最佳选择,但您可以在程序集内部创建所有“公共”类,然后使用[InternalsVisibleTo]程序集级别属性显式指定其他已签名的程序集。
[assembly: InternalsVisibleTo('MyAssembly,Version=1.0.0.1, Culture=neutral,PublicKeyToken=...");
Here是该属性的MSDN文档。
答案 4 :(得分:1)
首先,我认为您可以将已签名的程序集中的成员/类设为私有,并将程序集级InternalsVisibleTo attribute应用于其他程序集。我猜测反射会让你破解那个。
也许StrongNameIdentityPermission正是您所寻找的。 p>
答案 5 :(得分:0)
听起来像是一个不可能的问题。你不能相信你的环境。这是一个基本的计算原理,以及公钥/私钥加密的原因。