除了我正在创建的应用程序之外,我需要保护服务器API不受任何客户端的使用。
没有“用户”,所以我想我可以使用SSL进行硬编码的登录/通过。
经过快速的调查,我发现硬编码甚至加密的登录和进入应用程序都是个坏主意--入侵者总是有一种方法来分析解压缩的代码,找到实际的登录,甚至从加密的存储中传递。
然后,我开始研究使用证书进行身份验证的方向。结果表明,目前标准的SSL认证不安全,最好采用SSL钉扎技术。
SSL钉扎意味着将服务器证书的副本附加到应用程序包,以确保证书验证步骤的安全。
但是我不明白SSL钉扎是否可以以相反的方式实现,即在服务器端存储客户端的证书,并在服务器端执行证书检查,以确保连接的客户端是我的应用程序。看起来,附加到应用程序上的证书也可以被提取出来,并用于外部验证其他客户端。
发布于 2015-01-04 03:55:57
如果你想要高级别的安全,那么你所要求的是不可能的。也就是说,如果您拥有的唯一“身份验证”是下载免费应用程序的人,那么您实际上根本没有任何“身份验证”。
应用程序和服务器之间的整个HTTP会话可以很容易地查看和重播。因此,您在应用程序上放置的任何加密凭据都可以进行反向工程。
您已经提到了一些简单但完全不安全的技巧,它们会阻碍非恶意用户,并使反向工程更加困难。这包括将密码或证书存储在一个不太明显的位置,再加上SSL.有时候这已经足够好了--但听起来你已经排除了这些可能性。
如果您查看在您的PC上运行的传统许可软件,例如Microsoft,它们总是有一些许可密钥或用户输入的其他信息。也许你可以为这个应用程序提供你自己的“许可密钥”?
如果你真的想保护你的应用程序免受恶意客户端的攻击,你需要用户或者一些外键。
如果你有用户,你最好的选择就是在你的应用程序中只存储一个会话令牌。(通常使用共享首选项。)使用Oauth (如Facebook、Twitter (或您自己的服务))执行身份验证并获取令牌。Oauth服务通常对每个应用程序都有一个标识符。例如,Facebook使用了一个“apps”,它可以用来消除应用程序之间的歧义并验证令牌。在API或服务端,您需要使用Facebook的API验证令牌。这需要来自服务的额外API调用。
发布于 2014-12-22 15:29:35
为了防止第三方访问您的服务,您需要告诉您自己的客户端应用程序和第三方分开。
不管是哪种区别--一个应用程序,一个秘密,一个证书(在这种情况下,这只是一种秘密)--你在你的客户应用程序中构建它,它肯定还在它里面,没有可靠的方法来阻止它的反向工程。这只是动机/资源的问题。
如果使用TLS与服务通信,则可以在应用程序代码中嵌入一些随机秘密。在没有TLS的情况下,最好嵌入一个加密密钥(对称的或不对称的),并加密或签名您的数据,这样您的秘密至少不会暴露在通信通道中的纯文本中。
发布于 2015-01-04 01:40:08
因为没有“用户”,所以无法区分普通用户和恶意用户。
但是,您可以为应用程序执行一些基本的DRM,以防止提取凭据。iOS和Android的文件系统上都有安全分区,您可以在其中存储通过反向工程更难提取的凭据。但是,这种保护并不是100%,但可能会稍微降低潜在攻击者的速度。这通常是移动游戏正在做的事情。
如何在您的移动应用程序中存储秘密是另一个问题,取决于使用的平台,系统版本号等等。
https://stackoverflow.com/questions/27603421
复制相似问题