限制iPhone应用程序对服务器的访问

限制iPhone应用程序对服务器的访问,iphone,hash,client-server,access-control,client-certificates,Iphone,Hash,Client Server,Access Control,Client Certificates,我正在构建一个客户端/服务器的iPhone游戏,我想阻止第三方客户端访问服务器。这有两个原因:第一,我的收入模式是出售客户并提供服务,第二,我希望避免助长欺诈的客户激增 我正在用rails编写服务器的第一个版本,但我正在考虑在某个时候迁移到erlang 我正在考虑两种方法: 生成一个用户名,比如一个GUID,并用应用程序附带的一个秘密对其进行哈希处理(SHA256或MD5),然后将结果用作密码。当客户端与服务器连接时,两者都通过https上的HTTP Basic Auth发送。服务器用相同的密码

我正在构建一个客户端/服务器的iPhone游戏,我想阻止第三方客户端访问服务器。这有两个原因:第一,我的收入模式是出售客户并提供服务,第二,我希望避免助长欺诈的客户激增

我正在用rails编写服务器的第一个版本,但我正在考虑在某个时候迁移到erlang

我正在考虑两种方法:

生成一个用户名,比如一个GUID,并用应用程序附带的一个秘密对其进行哈希处理(SHA256或MD5),然后将结果用作密码。当客户端与服务器连接时,两者都通过https上的HTTP Basic Auth发送。服务器用相同的密码散列用户名,并确保它们匹配

随iPhone应用程序提供客户端证书。服务器配置为要求客户端证书存在

第一种方法的优点是简单、开销低,并且可能更容易在应用程序中混淆秘密


第二种方法经过了很好的测试和验证,但可能会有更高的开销。然而,我对客户证书的了解是在《达美航空公司飞行杂志》上读到的。这会产生多少带宽和处理开销?每个请求传输的实际数据约为千字节

谁是你的对手?这两种方法都无法防止应用程序的破解副本连接到服务器。我认为这是iPhone游戏或付费应用程序一般开发中最常见的问题


但是,这可能会保护服务器不受其他非iPhone客户端的影响,因为这会阻止程序员对iPhone和服务器之间的网络数据包接口进行反向工程。

没有任何方法是完美的,但质询/响应比密钥更好

证书应使用质询/响应。您发送一个随机字符串,它使用证书的私钥对其进行加密,然后将其取回并使用公钥对其进行解密

根据iPhone对这些东西的支持程度,实现这些东西将是琐碎而富有挑战性的

我使用的中间路线是xor。它比密码稍微安全一点,实现起来很简单,至少需要一到两个小时的时间

您的应用程序附带内置的数字键。 当应用程序连接到您时,您会生成一个随机数,其位数与密钥相同,并将其发送到手机 应用程序获取数字,用xor键对其进行运算,并将结果发送回。 在服务器上,将返回的结果与密钥进行异或运算,该密钥将生成原始随机数。 这只是稍微有点抗黑客,但你可以使用其他技术使其更好,比如每次更新软件时更改密钥,用其他随机数隐藏随机数,等等。隐藏这一点有很多技巧,但最终黑客会找到它。在每次更新时更改方法可能会有所帮助

无论如何,xor是一种黑客攻击,但它适用于发送密码有点难以破解的情况


xor和公钥之间的区别在于,xor只需监控成功的对话,就很容易恢复。理论上,如果没有大量资源和时间,公钥是不可逆的。

让游戏用户通过其帐户进行身份验证,以授权他们在服务器上更改游戏状态


如果无法对用户进行身份验证,则需要以某种方式对游戏应用程序实例进行身份验证。在二进制文件中嵌入身份验证凭据是一个坏主意,因为应用程序盗版非常普遍,并且会使您的方法非常不安全。我关于的问题可能在其他方面对你们有用。

好的方面:见修订后的问题。在任何情况下,破解副本都将是一个问题-希望运行该服务的成本足够低,能够为那些根本不会购买该应用的人提供服务,这不会真正影响我的底线。谢谢,我想你已经把我的想法重新定位到更接近现实的地方了:。一个问题和一个评论:如果不更难实现的话,令牌和秘密连接的SHA256或MD5不是比XOR更好吗?此外,我还想使用一个已经嵌入HTTPs的访问控制系统,这样我就不需要做任何额外的往返,即获取令牌,然后再进行第二次获取以获取游戏状态。这会更好,但我不确定它如何比sendToServer encryptedValue^key更容易;我想我使用xor的原因是我不必有一个库——它就在我的大脑中,但它并不好:我试图消除用户所关心的帐户概念。他们只会通过我的应用程序访问游戏,所以我不想让他们因为选择一个可能已经被使用的用户名和可能很弱的密码而感到负担。