在 WCF/Web 服务/WS-Trust 联合安全性的上下文中,对应用程序而不是用户进行身份验证的普遍接受的方法是什么?据我所知,证书身份验证似乎是可行的方法,IE 专门为应用程序生成证书。我在正确的轨道上吗?还有其他选择吗?
2 回答
如果应用程序在您的控制之下(例如您的服务器),那么一定要使用证书。如果这是用户控制(桌面)下的应用程序,那么就没有真正的方法来以强大的方式对应用程序进行身份验证。即使您使用证书,用户也可以提取它并在该应用程序的上下文之外发送消息。如果这不是一个关键的安全系统,您可以做一些足够好的事情,例如将证书嵌入应用程序资源中。但是请记住,一旦应用程序物理地位于用户计算机上,其中的每个秘密迟早都会被泄露。
您要做的是解决一般的数字版权管理问题,目前这是一个未解决的问题。
远程证明有很多选项,包括尝试隐藏某种秘密(传统密钥或半秘密行为特征)。
一些简单的示例可能会阻止您的 API 的临时用户使用它:
- 包含
&officialclient=yes
在请求中 - 包含
&appkey=<some big random key>
在请求中 - 在应用程序中存储一个秘密并使用简单的挑战/响应:向
nonce
应用程序发送随机数,应用程序返回HMAC(secret,nonce)
)
但总的来说,“防御者优势”非常小 - 无论您付出多少努力来尝试验证与您交谈的软件实际上是您的软件,它都不会让您的攻击者/用户付出更多努力模仿它。(打破我给出的第三个例子,你甚至不需要对官方客户端进行逆向工程——用户只需连接官方客户端即可回答他们自己的客户端收到的挑战。)
您可以追求的更强大的途径是许可/法律选择。一个著名的例子是 Twitter,它阻止你通过他们的API 许可条款和条件敲击任何旧客户端- 如果你创建了自己的(流行的)客户端,假装 Twitter API 是官方的 Twitter 客户端,假设是他们的律师会来敲门。