我正在开发一个移动(Android)API,它连接到我的服务器并获取一些数据并将其发送到使用此API的移动(Android)应用。
我想确保只有经过我服务器身份验证的人才能使用该API。
我可以给他们一个用户名或密码来使用API但是如果其他人使用用户名和密码并向我的服务器发送相同的请求(回复攻击)会怎样。如何避免对我的API进行此攻击?
我已经看到谷歌在他的API上使用API密钥,例如与签名密钥摘要相关联的方向;但我不确定它是如何起作用的,这样的东西是否可以帮助我?
实际上我想确保请求服务器的客户端APPLICATION与我自己开发的应用程序是相同的(不是我的应用程序的反编译和重新编译版本)。有人知道一些标准方法验证API的用户?
答案 0 :(得分:0)
因此,根据您的解释,我假设您希望确保只有您想要的应用程序才能使用服务器API。
没有任何完整的方法可以确保这一点,但有些步骤可以提供很好的保护:
1-您必须拥有允许向您发送请求的包名的完整列表
2-你必须预测你的sdk代码(你说的aar文件)并从这个aar
中获取开发人员的用户名密码,这样开发人员就不需要了解aar中的代码了如下所示:
YourSdkMainClass theInstance = YourSdkMainClass.getInstance(“username”,“password”);
3-您必须获取应用程序包名称并在每次调用任何API时将其与用户名和密码一起发送(使用三个加密的字符串会很好) - 或者您可以选择生成哈希令牌的机制这三个在应用程序开始时调用的特定API中,并在此之后使用该令牌调用其他API(在不使用并且应该生成新令牌的几个小时之后,令牌必须无效)
在服务器端,您必须检查收到的packageName,并将其与特定开发人员允许的packageName(或packageNames列表)进行比较。如果一切正常,则响应API调用(或发送回令牌)注意:可以改进此方案,发送APK的签名而不是packageName。使用签名密钥,具有相同packageName的多个应用程序将无法向服务器发送请求。当然你需要在服务器端签署开发人员的APK(当你想给他们用户密码时询问他们)
但如果你以良好的方式预测aar
,那么所有这些都是完美的。