我想为我的网站开发一个Android应用程序。一种方法是为网站提供API,让应用程序使用该API。但是我希望我的Android应用程序使用 ONLY 这个API,我不希望任何其他客户端使用此API。
有没有办法确保这个?
我可以想到一种方法:在应用程序中放置一个秘密,让应用程序始终将此秘密传递给API。但我不确定这种方法有多安全,因为任何数据包嗅探器都可以轻松地嗅探参数,从而嗅探秘密。还有其他建议吗?
答案 0 :(得分:4)
我认为这与我几天前回答的问题类似。 Securing a REST API from Android
即,找到一种使用共享密钥验证所有请求的方法。
如果你用一个秘密签署路径和params,那么别人就没有办法伪造请求。
答案 1 :(得分:2)
最后得到了android开发者博客article的答案。
答案 2 :(得分:1)
简短的回答是不,对不起。如果有人真的想利用您的网站/ api / device / program / 在此处插入任何内容,他们就会有时间和资源。
要直接回答您的问题,在您的应用中放置密钥并不安全,因为任何人都可以反编译应用并尝试从源文件重建密钥,他们不需要嗅探流量。
答案 3 :(得分:1)
如果我错了,请纠正我!数据包嗅探器只能用于未加密的WiFi和(现在)罕见的网络配置(路由器或交换机阻止它们)。
对于严重问题,您应该考虑安全连接(https)。
那就是说,对于标准内容,我觉得密码短语足够安全。许多流行的网络应用程序不会使用超过http的cookie来让您登录,这正是您提出的建议。
答案 4 :(得分:0)
我在解决这个问题上遇到了困难,实际上我最终实现了一个 OAuth 版本来保护我的API。如果您不启动浏览器来执行OAuth的“登录”部分,则可能很困难。我将登录权限加入到我的应用程序中,并实际实现了封面下的令牌交换。在这里发布代码涉及太多,但它工作得很好。显然,HTTPS需要额外的安全级别。
答案 5 :(得分:0)
如果您可以从自己的应用程序的软件包管理器获得某种签名,您可以使用模糊处理来使其变得更加困难,并且包管理器的签名/哈希签名是HMAC的关键 - SHA1。
可能必须尝试此操作(How to get APK signing signature?)
如果你这样做,会使它更难以使用。显然,它仍然可以反编译,但如果他们重新编译它与调试等,它将有错误的密钥。然后,他们必须在root设备上实际创建自己的包管理器才能获得签名。