【问题标题】:How secure is storing data with localStorage?使用 localStorage 存储数据的安全性如何?
【发布时间】:2013-08-11 06:01:59
【问题描述】:

我的应用需要登录,并且我有Remember username and password 的权限。然后用

存储用户名和密码

localStorage.setItem('用户名', 用户名);

这种存储用户名和密码的方式有多安全?我担心的是,特别是在 Android 上,其他应用是否可以访问数据并获取登录信息。

该应用适用于 iOs 和 Android,我使用的是PhoneGap 2.9

【问题讨论】:

    标签: cordova security local-storage


    【解决方案1】:

    LocalStorage 在正常情况下只能由您的应用访问。它与特定平台(iOS、Android)上的沙盒一样安全,能够保护您的应用数据不被其他应用读取。

    有时沙盒并不像您想象的那么强大,例如在这些情况下:

    • 设备已root或越狱
    • 制造商未能提供安全更新或用户没有更新
    • 攻击者可以物理访问设备,例如当设备被盗时。

    如果攻击者可以访问明文密码和用户名,他们也可以尝试其他帐户(不仅仅是您的服务)。因此,如果您的应用的用户对多个服务使用相同的密码,攻击者也可以访问它们。

    如何存储密码哈希?

    对于服务器端应用程序,这是一个好主意,因为它们在受保护的环境中运行(具有访问控制的数据中心,负责安全更新的系统工程师)。

    另一方面,手机很容易被盗,用户通常不会或无法安装安全更新。

    如果散列没有加盐,如果你得到散列,使用彩虹表很容易得到明文密码。如果哈希是加盐的,那么很容易获得简单密码的明文密码。此外,很容易生成不安全的密码哈希。

    解决方案:存储随机生成的访问令牌:无论密码多么简单或复杂,都不可能通过查看令牌来获取明文密码。

    TL;DR

    如果您使用凭据对某种 API 服务进行身份验证,您应该将密码和用户名存储在本地,即使在 iOS 钥匙串等安全存储中也是如此。

    您应该做的是仅存储您从该 API 获得的随机生成的令牌不是密码哈希!)(类似于存储会话的概念cookie 中的 ID 而不是用户/通行证组合)。一种可能性是使用 OAuth。

    这样可以确保真实凭据永远不会泄露,即使沙盒无法保护数据或手机被盗也是如此。

    【讨论】:

    • 在 2016 年仍然有效。如果可能,请避免将用户凭据保存为普通的,甚至在安全的密码存储中。在后端生成随机身份验证令牌。
    • @stefreak 在这种情况下,我应该将访问令牌存储在钥匙串还是本地存储中?
    • @rohitgoyal 钥匙串是最好的:)
    • "LocalStorage 在正常情况下只能由您的应用访问。"。有官方链接吗?
    【解决方案2】:

    每个应用程序在 PhoneGap 中使用它自己的 webview,localStorage 只能在该 webview 中访问。

    编辑:我仍然会考虑散列密码。

    【讨论】:

    【解决方案3】:

    在 localStorage 中保存密码不是一种安全的方法。如果您使用的是 PhoneGap,请尝试将用户名和密码保存在 iOS 钥匙串中。看看这个插件: https://github.com/shazron/KeychainPlugin

    【讨论】:

    • 我知道问得太晚了,但是类似的安卓手机呢?
    【解决方案4】:

    每个不同的cordova应用程序,就像不同的网络浏览器只能访问他们自己设置的数据或localStorage数据,所以不同的应用程序无法访问您自己的应用程序设置的localStorage中的数据.同时,如果您想对用户进行身份验证,请考虑为此使用 jwt 访问令牌,而不是在设备上存储实际的原始用户名或密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2017-06-07
      • 2020-06-28
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      相关资源
      最近更新 更多