我正在开发一个移动(Android) API,它连接到我的服务器并获取一些数据并将其发送到使用此API的移动(Android)应用程序。
我想确定,只有通过我的服务器身份验证的人才可以使用API。
我可以给他们一个用户名或密码来使用API,但如果其他人使用用户名和密码并向我的服务器发送相同的请求(回复攻击)怎么办?如何避免对我的API的这种攻击?
我看到google在他的API上使用API密钥,比如与签名密钥摘要相关的方向;但我不确定它是如何工作的,以及类似的东西是否能帮助我?
实际上,我要确保请求服务器的客户端应用程序与我自己开发的应用程序相同(不是我的应用程序的反编译和重新编译版本)。有人知道认证API用户的标准方法吗?
所以根据你的解释,我假设你想确保只有你想要的应用程序应该能够使用服务器api。
没有任何完整的方法来确保这一点,但是一些步骤可以做一个很好的保护:
1-你必须有一个允许发送请求的完整包名列表
2-你必须保护你的sdk代码(你说的aar文件),并从这个aar
中获取开发人员的用户名密码,这样开发人员就不需要知道aar内部的代码,如下所示:
YourSdkMainClass theInstance = YourSdkMainClass. getinstance ("username","password");
3 -你必须得到应用packagename和发送用户名和密码你每次调用任何API(让一个加密的字符串三就太好了),或者你可以选择一种机制生成散列令牌的这三个在一个特定的API,叫做初调用其他API的应用程序和使用令牌之后(令牌必须失效后几个小时不使用和新的令牌应该生成)
4-在服务器端,您必须检查接收到的packageName,并将其与特定开发人员允许的packageName(或packageNames列表)进行比较。如果一切正常,则响应API调用(或发回令牌)
注意:这个场景可以改进发送APK签名而不是packageName。使用签名密钥,具有相同packageName的多个应用程序将无法向服务器发送请求。当然,你需要在服务器端有开发者的apk签名(当你想给他们用户密码时询问他们)
aar
,这些都是完美的。