验证移动设备

Posted

技术标签:

【中文标题】验证移动设备【英文标题】:Authenticating mobile device 【发布时间】:2013-10-14 08:04:37 【问题描述】:

我正在开发客户端-服务器应用程序,其中客户端应用程序将在移动设备(androidios)上运行,并将通过 HTTP 协议与服务器通信。移动应用程序将在市场上免费提供,多个用户将在同一设备上使用同一个应用程序实例。

我需要对服务器的每个请求进行身份验证,并且我需要对设备而不是用户进行身份验证,实际上任何人都可以拥有设备。

我已经围绕这个解决方案工作了:

安装应用后:

假设这是在安全网络上完成的:

    管理员(不是普通用户)在给定设备上运行应用程序并使用应用程序的身份验证表单一次(填写他的登录名和密码)。 服务器对管理员进行身份验证并返回一个秘密设备密钥和一个特定于设备的“公共”设备ID。 服务器存储设备密钥设备ID。 设备将设备密钥存储在安全存储设备ID中。

现在设备有了自己的“凭据”。

每个客户请求:

    客户端请求请求密钥。该请求包含设备 ID。 服务器生成请求密钥,将其与设备ID一起存储并发送给客户端。 客户端发送带有设备ID的请求数据和(数据+请求密钥+设备密钥)的哈希值,从而对请求进行签名. 服务器检查哈希。服务器也会使请求密钥失效。

我的问题:

    假设存在类似安全存储的东西:这种方法的安全性如何?

    有没有像 安全存储 这样没有人(但唯一的应用程序)可以在 iOS 和 Android 中读取的东西?您能否提供一些学习链接(尤其是对于 android)。这是否取决于设备的 root 权限?


一些注意事项:

我相信由于请求密钥,客户​​端确实需要证明秘密设备密钥的知识(没有请求密钥 黑客可以再次发送截获的数据)。由于设备密钥是通过安全网络发送的,因此无法被截获,并且由于它存储在安全存储中,因此无法从设备中窃取。 p>

但是我希望没有 100% 安全的存储(至少在 android 上),如果设备被植根,秘密 设备密钥 可能会被盗。将其加密存储只会让黑客更难 - 他需要反编译客户端应用程序并找到如何解密它。


编辑:建议的方法变化不大(存在安全漏洞),添加了一些注释和其他一些小细节。

【问题讨论】:

你好 Lukas,我今天刚遇到这个问题,你找到解决办法了吗? 你好钦坦。不幸的是,我没有找到比上述协议更好的东西。对我来说幸运的是,在我认为高安全性并不重要的情况下,我只想让它尽可能安全。最后我基本上没有写android应用程序,只写了服务器。但请注意,我发表了一条评论“从带有 TPM 的 Android 4.3 开始,使用 KeyChain 可以保护数据(即使黑客具有物理访问权限)”。也许您想检查它是否真实并且对您有任何可能的用途。 实际上,确切地说,我对协议进行了一些改进:所有请求密钥都只有时间限制的持续时间(比如 5 分钟)+ 一些其他轻微的特定于上下文的修改,所以没有人可以搞砸服务器通过创建大量无用的请求密钥,但这些都是细节。 感谢 Lukas 回复,此信息很有帮助 【参考方案1】:

我要做的是为您在 Android 上的应用程序中的登录创建一个 Web 服务(当然,您需要加密和解密您的登录)。如果登录成功,将用户会话保存在 sharedPreferences 或您选择的其他存储中。用户完成后,用户可以注销,用户会话将被销毁。

【讨论】:

问题是,我真的需要验证设备而不是用户(只是为了确保请求来自特定设备)。用户甚至没有任何登录名/密码,他们只有 ID。但是,(服务器的)管理员从设备登录一次是没有问题的,但他不能每天都登录,也不能在整个会话期间观看设备。 基本上,我只需要确保具有给定用户 ID 的请求来自正确的设备(管理员将管理允许的设备列表)。 获取DeviceID,可以这样做: Secure.getString(ContentResolver, Secure.ANDROID_ID);但是,这是为您的应用程序识别用户的一种冒险方式,因为如果用户擦除设备,它就会消失,并且您的用户可能无法在不同的设备上运行您的应用程序。有关设备 ID 的更多信息,请查看此链接:android-developers.blogspot.in/2011/03/… 谢谢,我知道 DeviceID,但是虽然任何人都可以访问设备,但任何人都可以访问 DeviceID,然后伪造通信(就像设备一样)。 好吧,在这种情况下,您需要想出一个算法来加密您的客户端凭据【参考方案2】:

http://developer.android.com/reference/android/accounts/AccountManager.html我想你已经知道了。 keytool 和自签名证书呢?我可能帮不上什么忙。

【讨论】:

是的,我也发现了...我现在不确定,如果任何其他应用程序可以访问保存的帐户信息...无论如何,黑客都可以访问存储的设备是否植根的信息......如果我存储在任何其他“仅用于应用程序”存储中,他可以......根据我的发现 - 数据可以使用 KeyChain 保护(即使黑客具有物理访问权限),因为带有 TPM 的 Android 4.3(不是很令人满意) 如果它有助于 android 用于个人设备,那么系统没有用户帐户。但是构建 android 的 Linux 内核确实有用户。浪费这些功能将是一种耻辱,所以他们做了什么重新调整了它的用途。应用程序供应商有帐户,因此默认情况下应用程序只能访问自己的包名称。您可以覆盖。这在清单权限和安装应用程序时用户必须接受“sudo”权限但仅在安装时。

以上是关于验证移动设备的主要内容,如果未能解决你的问题,请参考以下文章

移动设备的最佳实践身份验证

保护来自移动设备的身份验证

在移动设备中粘贴事件后处理验证 jquery

移动设备上的 Azure App Service 身份验证问题

在没有浏览器的移动设备上使用 HTTP 进行 Facebook 登录验证

Laravel 从在 API 级别更新它的用户中验证唯一的移动设备?