【问题标题】:User Authentification on Android - Security ImplementationAndroid 上的用户身份验证 - 安全实施
【发布时间】:2016-04-01 15:21:55
【问题描述】:

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

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

不过,我想为这个应用改进一些事情:

安全传输

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

自动登录

我希望用户能够在注销之前保持登录状态 - 我该怎么做才能最好?不仅在安全方面,而且在用户体验方面也是如此。

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

访问控制

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

还有什么我忘了考虑的吗?

【问题讨论】:

    标签: android security authentication


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的建议,虽然我不太确定我还能做些什么来阻止任何人提出请求 - 如果他们无法登录,他们就无法获得令牌并且可以什么都不做,对吧?
    • 是的,完全正确。其他解决方案是生成签名的 APK 并使用密钥库中的密钥对 API 的请求进行签名。比你可以放弃所有未经授权的请求。
    猜你喜欢
    • 2013-07-31
    • 2019-05-01
    • 1970-01-01
    • 2017-01-03
    • 2020-07-04
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多