假设您有一个移动应用程序(Windows Phone或Android),它使用SOAP连接您的后端。
为了方便起见,我们假设我们有一个用C#实现的Web服务。服务器公开以下方法:
[WebMethod]
public string SayHallo() { return "Hallo Client"; }
从服务器的角度来看,您无法判断调用者是您的移动应用程序还是尝试调试您的Web服务的开发人员或者是试图对您的后端进行反向工程/利用的黑客。
如何确定Web服务调用的来源是应用程序?因为任何拥有WSDL的人都可以调用WS。
我知道我可以对Web服务实施一些标准的安全措施,如:
然而,任何经验丰富的黑客或知道签名算法的开发人员仍然可以生成签名良好,格式正确的消息。或者一个非常好的黑客可以反汇编应用程序并获取我的“绝密”通信协议的隐藏技术。
任何想法如何使SayHallo()方法仅回答我的移动应用程序发出的请求?
我们在移动应用程序的环境中运行,通过硬件访问,可以利用硬件功能完成某些工作。
如果有人想知道,我正在考虑如何使移动应用程序足够安全,例如银行等敏感应用程序。
感谢您的想法。
答案 0 :(得分:10)
您所描述的是双向身份验证。它只能通过在通信的两侧存储签名的公钥(证书)来完成。这意味着每个应用程序都需要使用您的服务器公钥来验证您的服务器,并且服务器需要对您的应用程序的每个实例进行身份验证。应用程序的公钥需要在部署时与应用程序的每个实例一起生成并存储在服务器上。可以将其视为双向HTTPS,通常唯一需要完成的身份验证是一个方向,浏览器使用受信任的签名密钥对服务器进行身份验证。在你的情况下,这需要双方都做。通常情况下,你会有一个像VeriSign这样的服务签署公钥的每个实例,这对于应用程序的多次部署来说会非常花钱。在您的情况下,您可以使用OPENSSL之类的东西创建内部签名应用程序,以便在每次分发时对您的应用进行签名。这并不意味着有人仍然无法破解您的代码并在应用程序端提取签名密钥。一般来说,任何代码都可以被黑客攻击,这只是一个问题,即在他们放弃之前你有多难做到这一点?如果您要使用自定义硬件路由,那么诸如加密芯片和TMP之类的东西可以作为关键信息,并使人们更难以访问设备上的私钥。
快速谷歌搜索发现了以下内容:
http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication
如果您正在考虑使用奖励积分,并且真的担心有人从外部游戏系统,那么更好的解决方案是让每个人都创建一个安全存储在服务器上的帐户,并在那里保存并记录他们的积分。这可以集中所有数据,并允许您完全控制它,而无需担心恶意应用程序报告不存在的点。 (这就是银行的工作方式)
答案 1 :(得分:6)
如果您想验证用户是移动 他们说的用户,那么最好的方法就是利用网络。使用您希望用户通过的哈希键发送推送通知:
适用于iOS的APN
类似urban airship的Windows Phone
GCM。
答案 2 :(得分:2)
通常,模型看起来像:
所以,如果你想知道这种事情在银行应用程序等方面是如何工作的,基本上它是如何分解的:(1)客户端和服务器使用服务器建立一个安全通道,如共享密钥公钥,(2)客户端使用其他机制通过此安全通道进行身份验证。
然而,你的具体问题似乎更多地针对应用程序进行身份验证(即,来自您的应用程序的任何请求都是可信的),并认为如果只有您的应用程序可以进行身份验证,并且您的应用程序运行良好,那么一切应该是安全的。这有一些含义:
一般来说:
答案 3 :(得分:2)
除了已经给出的答案之外,如何使用具有手机唯一ID和密码的登录类型方案?让用户注册您的“后端”,每次必须使用后端进行交易,需要密码或有自动登录选项。
答案 4 :(得分:2)
您可以使用以下方式来保护和跟踪您对服务器的请求。
通过REST methods
Custom Headers
设备类型
通过强制每个客户端拥有您作为授权的Web服务提供商提供的自己的用户名和密码来使用基本的http身份验证。
如果您需要更高级的保护,可以使用OAuth 2.0
保护您的网络服务。
答案 5 :(得分:1)
由于您的原始应用程序将是Android或Windows Phone应用程序,因此对于想要黑客调试而言,其中任何一个都相对容易。无论如何,你将在你无法控制的机器上运行代码,所以没有ssl技巧或检查签名将解决你的根本问题。
唯一能够对抗威胁的方法就是不信任客户。如果您正在制作游戏,请确认来自客户端的输入在作出之前是有效的 - 它附带有效的安全令牌等。
本质上构建您的服务,以便用户使用非官方客户端无关紧要。