Android上的用户身份验证 - 安全实施

时间:2016-03-31 19:09:42

标签: android security authentication

到目前为止,我一直主要为Android创建较小的应用和游戏,但现在我正在创建一个拥有大量用户和比高分更为明智的数据的应用程序。

我的常规方法是为所有拥有密码的用户提供一个表,使用HTTP(S)调用通过简单的登录屏幕进行身份验证,就是这样。

我想为这个应用程序改进一些东西:

安全传输

如果我想加密用户密码,我需要在哪里进行加密?在设备上,甚至在发送之前? (如果是不安全的网络,如公共WiFi热点)或更好的服务器,在将其写入数据库之前?或者我应该只使用SQL的加密?

自动登录

我希望用户能够在注销前保持登录状态 - 我最好如何做到这一点?不仅仅是安全方面,还有用户体验。

我的研究表明,使用 AccountManager 最好保存用户名和密码,并在应用启动时自动进行身份验证。还有什么更重要的,我在这里缺少任何安全隐患吗?

访问控制

通常,我只希望应用程序发出的每个调用都是有效的,因为用户无法登录而无法登录登录屏幕。但我如何最好地验证用户的请求以确保它不是攻击者?我不能只发送每个请求的用户名/ ID,所以我可能需要像我在每次登录时生成的会话令牌?或者有更好的方法吗?

还有什么我忘了想的吗?

1 个答案:

答案 0 :(得分:1)

我建议您在不加密密码的情况下传输密码,但需要通过https传输密码。其他方法是在您的应用中实施asymmetric encryption并使用您将从服务器收到的公钥加密密码。

在服务器端,我会使用一些哈希算法来哈希密码。并且只存储哈希和盐。当用户登录时,您可以以相同的方式对传入的密码进行哈希处理,并检查哈希是否相等。

要进行自动登录,您需要使用令牌对授权用户的所有请求进行签名。成功登录后您将从服务器收到的令牌。此令牌可以存储在Keystore或特殊存储中,只能由此应用程序访问。

签名可以通过附加请求带有来自所有请求参数和令牌的校验和的附加参数来实现。

此外,我建议您考虑未经授权的克隆应用程序,它们可能会伪装成您的应用程序并调用您的服务器端API。