我开发了一个.Net 3.5 Windows表单应用程序。我还想设计一个网站,该网站具有具有多个Web方法的Web服务,以查询主机上的数据库。我希望仅通过我的 winapp 和我的网站调用网络服务!而且我不希望任何其他人能够调用和使用我的 Web 服务,而只能让一些有权访问我开发的 Windows 应用程序的人。
为此,我需要一个良好的安全方案!我非常感谢任何可以帮助我的人,因为这是我第一次开发 Web 服务,我真的需要它像我提到的那样安全!
由于几个原因,你所说的很难做到,但主要是这个:
如果您在 WinForms 应用程序上的代码中放置任何内容,则可以非常轻松地对其进行反编译。 您可以随心所欲地混淆代码,但可以对其进行反编译。
因此,您拥有的应用中的任何代码都可以由有权访问该代码的任何人读取。 您应该始终将任何 WinForms 应用程序视为完全受到损害,并确保服务器端的安全性得到补偿。
因此,您不能简单地将用户名和密码存储在配置文件或代码中。 你必须想出别的东西。 您可以使用身份验证并在程序启动时提示用户输入用户名/密码,然后使用该用户名/密码。 但是,人们倾向于分享这些东西,因此您可能需要寻求额外的保护。
您可以将连接信息或机密放入 app.config 并对其进行加密,但任何可以反编译代码的人都可以重新编译它,并随意添加代码来解密它。
你可以为应用提供签名密钥,并在身份验证机制中使用它,但可以绕过它。
您可以将 IP 地址限制为特定 IP 地址,但这些地址可能会被欺骗。
然而。。。
通过对上述所有技术进行分层,可以使攻击者难以绕过您的预防措施。 我们在其中一个应用中做了以下操作,其中我们有类似的要求:
- 我们设置了一个数据库,其中包含每个授权客户的 GUID 记录,以及该客户允许的 IP 地址。
- 每个 Web 方法都需要一个客户密钥参数。(上面提到的 GUID)每次调用 Web 服务都会根据 IP 地址检查密钥。
- 如果匹配,则返回有效数据。
- 如果失败,则返回有效的查找数据。我们实际上返回了看似良好的数据,但实际上并非如此。 这使得攻击者更难知道他们是否真的突破了防御。
- 在WinForms应用程序中,密钥存储在app.config中,该应用程序在main()事件(WinForms应用程序的入口点)中加密。 这是为了防止普通读者访问它。
- 该程序在安装时自动启动,以便在启动时进行加密,以最大程度地减少有人在加密文件之前读取文件的机会。
- 此外,代码被混淆。
希望分层防御将阻止普通攻击者。
Microsoft也有一些指导方针:http://msdn.microsoft.com/en-us/library/ff648643.aspx