安卓系统上的用户身份验证-安全实现



到目前为止,我主要为Android创建较小的应用程序和游戏,但现在正在创建一个有点大的应用程序,它有很多用户,数据比高核心更合理。

我通常的方法是为所有有密码的用户创建一个表,使用HTTP(S)调用通过简单的登录屏幕进行身份验证,仅此而已

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

安全传输

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

自动登录

我希望用户能够一直登录到注销——我该如何最好地做到这一点?不仅在安全方面,而且在用户体验方面。

我的研究表明,使用AccountManager最好保存用户名和密码,并在应用程序启动时自动进行身份验证。还有什么其他的吗,我在这里遗漏了什么安全风险吗?

访问控制

通常,我只希望应用程序发出的每个呼叫都是有效的,因为用户在没有登录的情况下除了登录屏幕之外什么都不能访问。但是,我如何最好地验证用户的请求,以确保它不是攻击者?我不能只在每次请求时发送用户名/id,所以我可能需要在每次登录时生成一个会话令牌?或者有更好的方法吗?

还有什么我忘了想的吗?

我建议您在不加密密码的情况下通过https传输密码。另一种方法是在您的应用程序中实现非对称加密,并使用您将从服务器接收的公钥加密密码。

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

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

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

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

最新更新