我面临着一个WCF安全场景,在线上没有特别好的文档。
我正在WCF中开发一个产品许可服务,该服务将与我们的软件一起部署(即该服务与客户端在同一台PC上运行)。此许可服务将负责与控制我们软件的使用和连接到我们的远程许可服务器以进行更新,撤销等相关的许多事情。因此,这不是我想要欺骗的服务,我真的不想欺骗客户与之沟通。
由于它与客户端在同一台PC上运行,任何人都可以为此方案建议安全策略吗?我对身份验证特别感兴趣,因为大多数其他安全原则都很简单。如果我能帮助它,我不愿意进入证书,但由于相互认证是一个优先事项,我开始认为我可能需要在服务和客户端之间实施自定义的“质询/验证”方案。
有什么想法吗?谢谢你的阅读。
克里斯。
答案 0 :(得分:1)
我的建议是,无论你付出多少努力,都会有一个攻击向量,使你的所有努力都无效。一种选择是使用ILMerge为整个应用程序提供单个dll,并将其加密存储在磁盘上,并创建一个能够通过注册信息传递到您的服务的加载器。在您这方面,该服务将验证客户信息并发回一个解密密钥。加载器将使用解密密钥在内存中解密DLL并动态加载它。
这种方法的缺点是确定的破解者可能会调试您的应用程序,并且当DLL被解密时,将未加密的流写入磁盘。您唯一的报复手段是在DLL上放置某种标记,这样您就可以确定谁有责任打破您的版权保护,并在互联网上发现它时会采取法律行动。
答案 1 :(得分:0)
只要您将此软件部署到客户端,就不能将任何类型的密钥存储在其中,而不会有任何危险。即使您使用证书,也不能将它们从客户端隐藏,同时仍然使它们对您的应用程序可见。如果你将密钥嵌入到程序集中,那么有人会使用Reflector将其弹出。
假设您不关心直接破解(即修补程序集的代码以简单地绕过许可证检查),那么实现此类安全性的唯一正确方法就是模仿PKI的工作方式,通过专门使用远程服务器。
在PKI中,当服务器需要通过证书验证客户端时,它会根据证书颁发机构的CRL检查该证书。如果CRL报告证书已被撤销,则拒绝访问。如果无法联系CRL,则证书被视为无效。
如果要实现此方案,则需要3个逻辑服务,但不需要当前配置。您需要的是远程许可服务器,客户端和应用程序服务器。理论上,应用程序服务器可以驻留在客户端上,但此应用程序服务器的关键方面是它对远程许可服务执行许可检查并处理所有重要的应用程序逻辑。这样,“欺骗”服务器变成了一项几乎不可能完成的任务,因为随意的破解者必须在整个过程中对整个应用程序进行逆向工程。
这比使应用程序服务器成为远程服务器要安全得多,并且与仅在客户端本身嵌入远程安全检查并完全废弃本地应用程序/许可服务器相比,可能无法提供许多优势。但如果您决定采用这种3层方法,那么前面提到的架构将是可行的方法。
同样,这是假设您并不担心“直接”破解。如果你是,那么你将不得不阅读特定于该特定攻击向量的技术,并了解它们都不是万无一失的;他们只能减慢攻击者的速度,永远不要完全阻止他。