我正在开发客户端-服务器应用程序,其中客户端应用程序将在移动设备(Android、iOS)上运行,并将通过 HTTP 协议与服务器通信。移动应用程序将在市场上免费提供,多个用户将在同一设备上使用相同的应用程序实例。
我需要对服务器的每个请求进行身份验证,并且我需要对设备进行身份验证,而不是对用户进行身份验证,实际上任何人都可以拥有设备。
我已经解决了这个解决方案:
安装应用程序后:
假设这是在安全网络上完成的:
- 管理员(不是普通用户)在给定设备上运行应用程序并使用应用程序的身份验证表单一次(填写他的登录名和密码)。
- 服务器对管理员进行身份验证并发回设备的秘密设备密钥和特定于设备的“公共”设备 ID 。
- 服务器存储设备密钥和设备 ID。
- 设备将设备密钥存储在安全存储和设备 ID中。
现在该设备有自己的“凭据”。
对于每个客户请求:
- 客户端请求一个请求密钥。该请求包含设备 ID。
- 服务器生成请求密钥,将其与设备 ID一起存储并将其发送给客户端。
- 客户端发送带有设备 id和哈希(数据 +请求密钥+设备密钥)的请求数据,从而对请求进行签名。
- 服务器检查哈希。服务器也使请求密钥无效。
我的问题:
假设存在诸如安全存储之类的东西:这种方法有多安全?
有没有任何人(但唯一的应用程序)可以在 iOS 和 Android 中读取的安全存储?您能否提供一些学习链接(尤其是对于 android)。这是否取决于设备的生根?
一些注意事项:
我相信由于请求密钥,客户端确实需要证明秘密设备密钥的知识(没有请求密钥,黑客可以再次发送截获的数据)。由于设备密钥是通过安全网络发送的,因此无法被拦截,并且由于它存储在安全存储中,因此无法从设备中窃取。
但是我希望没有 100% 的安全存储(至少在 android 上),如果设备被植根,秘密设备密钥可能会被盗。将其加密存储只会让黑客更难 - 他需要反编译客户端应用程序并找到如何解密它。
编辑:建议的方法变化不大(存在安全漏洞),添加了一些注释和其他一些小细节。