限制移动应用程序成为唯一有权使用服务器API的客户端

时间:2014-12-22 13:11:52

标签: security authentication mobile

我需要保护服务器API免受任何客户端的使用,除了我正在创建的应用程序。

没有"用户",所以我认为我可以使用SSL进行硬编码登录/传递。

经过快速调查,我发现硬编码甚至加密登录&传入应用程序是一个坏主意 - 入侵者总是有办法分析反编译代码并找到实际登录并通过加密存储传递。

然后我开始使用证书挖掘身份验证的方向。事实证明,现在使用证书的标准SSL身份验证并不安全,并且使用SSL Pinning技术会更好。

SSL固定意味着将服务器证书的副本附加到应用程序包,以确保证书验证步骤。

但是我无法理解SSL Pinning是否可以以相反的方式实现,即在服务器上存储客户端的证书并在服务器端执行证书检查以确保连接客户端是我的应用程序。看起来附加到应用程序的证书也可以被提取并在外部用于验证其他客户端。

3 个答案:

答案 0 :(得分:3)

为了防止第三方访问您的服务,您需要告诉您自己的客户端应用和第三方。

什么样的区别 - 一个应用程序,一个秘密,一个证书(在这种情况下只是一种秘密形式)并不重要 - 你构建到你的客户端应用程序,它必须仍然在它内部没有可靠的方法可以防止逆向工程。这只是动力/资源问题。

如果使用TLS与服务进行通信,则可以在应用程序代码中嵌入一些随机密钥。如果没有TLS,您最好嵌入加密密钥(对称或不对称)并加密或签名您的数据,这样您的秘密至少不会在通信渠道中显示为纯文本。

答案 1 :(得分:1)

如果您想要高水平的安全性,那么您提出的问题是不可能的。也就是说,如果只有"身份验证"你有一个人下载了一个免费的应用程序,那么你真的没有任何"身份验证"一点都不

您的应用和服务器之间的整个HTTP(s)对话可以相当轻松地查看和重播。因此,您在应用上放置的任何加密凭据都可以进行逆向工程。

您已经提到了一些简单但却完全不安全的技巧 - 它们会阻止非恶意用户并使逆向工程变得更加困难。这些包括将密码或证书存储在不太明显的位置,并与SSL结合使用。有时这很好 - 但听起来你已经排除了这些。

如果您查看在PC上运行的传统许可软件,例如Microsoft Office,它们总是会有一些许可证密钥或用户输入的其他信息。也许你可以提供许可证密钥"您自己的应用程序?

如果您真的想要保护您的应用免受恶意客户的侵害,您需要用户或某些外部密钥。

如果您有用户,最好的办法是只在您的应用中存储会话令牌。 (通常使用共享首选项。)使用非现场Oauth API(如Facebook,Twitter(或您自己的服务))执行身份验证并获取令牌。 Oauth服务通常具有每个应用程序的标识符。例如,Facebook使用" App ID"可用于消除应用之间的歧义并验证令牌。在API或服务方面,您需要使用Facebook的API验证令牌。这需要来自服务的额外API调用。

答案 2 :(得分:0)

因为没有"用户"你不能分辨普通用户和恶意用户。

但是,您可以为应用程序执行一些基本DRM,以防止提取凭据。 iOS和Android在其文件系统上都有安全分区,您可以在其中存储通过逆向工程难以提取的凭据。但是,这种保护不是100%,但可能会使潜在的攻击者稍微减速。这通常是手机游戏的作用。

如何在移动应用程序中存储机密信息受另一个问题的影响,具体取决于所使用的平台,系统版本号等。

E.g。 https://stackoverflow.com/a/786588/315168