如何验证Web服务调用的来源

Adr*_*zar 16 security android cryptography web-services windows-phone-7

假设您有一个移动应用程序(Windows Phone或Android),它使用SOAP连接您的后端.

为了方便起见,我们假设我们有一个用C#实现的Web服务.服务器公开以下方法:

[WebMethod]
public string SayHallo() { return "Hallo Client"; }
Run Code Online (Sandbox Code Playgroud)

从服务器的角度来看,您无法判断调用者是您的移动应用程序还是尝试调试Web服务的开发人员或试图反向工程/利用您的后端的黑客.

如何识别Web服务调用的来源是应用程序?任何拥有WSDL的人都可以调用WS.

我知道我可以对Web服务实施一些标准的安全措施,例如:

  • 在服务器上实施HTTPS,使邮件加密,减少窃听的危险.
  • 使用摘要/散列算法在客户端对请求进行签名,验证服务器中的签名并拒绝未正确签名的消息.
  • 在HTTP请求中编写自定义标头.无论如何都可以模拟标题.

但是,任何经验丰富的黑客或知道签名算法的开发人员仍然可以生成签名良好,格式正确的消息.或者一个非常好的黑客可以反汇编应用程序并访问我的"绝密"通信协议的隐藏技术.

任何想法如何使SayHallo()方法只回答我的移动应用程序的请求?

我们在移动应用程序的环境中运行,通过硬件访问,可以利用硬件功能完成某些任务.

如果有人想知道,我正在考虑如何使移动应用程序足够安全,以便敏感的应用程序,如银行业务.

谢谢你的想法.

Jim*_*son 10

您所描述的是双向身份验证.它只能通过在通信的两侧存储签名的公钥(证书)来完成.这意味着每个应用程序都需要使用您的服务器公钥来验证您的服务器,并且服务器需要对您的应用程序的每个实例进行身份验证.应用程序的公钥在部署时需要与应用程序的每个实例一起生成并存储在服务器上.可以将其视为双向HTTPS,通常唯一需要完成的身份验证是一个方向,浏览器使用受信任的签名密钥对服务器进行身份验证.在你的情况下,这需要双方都做.通常情况下,你会有一个像VeriSign这样的服务签署公钥的每个实例,这对于应用程序的多次部署来说会非常花钱.在您的情况下,您可以使用OPENSSL之类的东西创建内部签名应用程序,以便在每次分发时对您的应用进行签名.这并不意味着有人仍然无法破解您的代码并在应用程序端提取签名密钥.一般来说,任何代码都可以被黑客入侵,这只是一个问题,即在他们放弃之前你有多难做到?如果您要使用自定义硬件路由,那么诸如加密芯片和TMP之类的东西可以作为关键的sotre,并使人们更难以访问设备上的私钥.

快速谷歌搜索出现以下情况:

http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication

如果你正在考虑使用奖励积分,和真的担心有人从外面游戏系统更好的解决方案是让每个人做安全地存储在服务器上,他们的积分将被保存并有相符的帐户.这可以集中所有数据,并允许您完全控制它,而无需担心恶意应用程序报告不存在的点.(这是银行的工作方式)


ERR*_*RR0 6

如果您想验证用户是否都是移动 用户以及 他们说自己,那么最好的方法就是利用网络.使用您希望用户通过的哈希键发送推送通知:

  • 适用于iOS的APN

  • 像Windows手机的城市飞艇

  • 适用于Android的GCM.