我正在构建移动API&用于记录分析的库,并且一直在探索保护API的不同方法,以防止不需要的第三方记录数据或拦截用户数据。
我建议的方法是使用公钥加密:用户将在API的网站上生成密钥,并提供公钥/私钥。然后,用户将手动存储密钥在应用程序代码中,例如,在Android中,它可以是字符串资源文件。当应用程序运行时,库将读取用户在代码中提供的密钥,加密分析数据,并将其发送到服务器,在服务器上解密和读取。
经过研究,我发现了这种方法的几个问题,最明显的是第三方可以解编译应用程序并获取存储的密钥(不知何故?)。然而,这似乎需要付出很多努力才能获得分析的关键,而分析只包含匿名信息。我还记得读过另一个大型开发者(Twitter?)使用了类似的方法,并在应用版本之间更改了密钥。
另一种方法可以是将用户连接到服务器,进行身份验证,然后为会话分配密钥。但是,我的应用程序无法唯一地识别和验证个人用户(没有用户帐户和密码),因此我仍然需要存储身份以进行身份验证。
我真的很喜欢API用户实现简单易用的解决方案,比如复制单个加密密钥,也不会因网络流量而膨胀,无法进行身份验证,管理会话,分发密钥等等。我会有兴趣了解Fabric和Firebase等现有服务是如何做到的。