离线 Web 应用程序中的安全用户身份验证
Posted
技术标签:
【中文标题】离线 Web 应用程序中的安全用户身份验证【英文标题】:Secure user authentication in offline web apps 【发布时间】:2014-06-16 14:27:36 【问题描述】:这个问题以各种形式出现了好几次,但我还没有看到满足我要求或让我充满信心的答案。让我来设置场景。
我们目前有一个 Web 应用程序,它允许用户提交对预设问题的响应,其中数据最终存储在 SQL Server 数据库中,我们也有一个 Windows 应用程序,它可以做同样的事情,但可以离线运行;即它连接到 SQL Server,下载问题,允许用户离线完成它们,当他们下次有网络连接时,他们可以同步数据,将其上传到 SQL Server。太好了!
作为我们开发战略的一部分,鉴于 html 5 的离线功能和本地存储,尝试将这些产品整合到一个 Web 应用程序中似乎是完全明智的。这意味着我们能够在单个代码库上工作,这也将使应用程序能够在大多数设备上的浏览器中运行;独立于平台。
对此我发现了几个潜在的问题,我非常感谢您指导这些问题:
用户需要能够在离线和在线模式下登录。这可能意味着我们下载所有用户用户名和密码的哈希值,或者只下载那些在在线模式下登录的用户名和密码。然而,即使这样做,也需要一种方法来检查这些,并且鉴于 javascript 是可读的,有人可以轻松地对他们的凭据进行逆向工程。是的,您可以混淆代码,但这并非万无一失。
需要存储在本地的数据可能是高度敏感的;包含个人信息等。因此这也需要加密,至少 AES 256。
我希望乌托邦吗?这是目前不可能的事情吗?我是否需要寻找另一种解决方案并暂时忽略它?
非常感谢您可爱的人提供的任何帮助。
【问题讨论】:
"Am I hoping for utopia? Is this something that's just not possible at this time? Do I need to be looking at another solution and dismissing this for the time being?"
在我看来,是的,是的,是的。
大声笑,感谢您的回复!
:咧嘴笑:不客气。
【参考方案1】:
首先是更简单的问题 2:这是完全可能的。您可以在设备上生成密钥,然后通过 https 将其同步发送到您的服务器,然后服务器可以解密数据。
至于问题 1,我想说离线登录并不可行,但你真的需要一个吗?下载问卷后(需要在线模式,因此需要登录很好),您只需要同步传输它,再次需要在线,您也可以要求用户在那里登录。我不建议将任何敏感的用户数据(例如哈希)下载到设备。
【讨论】:
回应: 1. 是的,恐怕是这样,用户可能会共享一个设备,并且由于数据可能会持续存在,这可能是机密的,每个用户都不应该看到其他任何人的数据,所以这是必须的。此外,用户还可以进入社区并收集有关多个患者(许多记录)的信息,他们可能会丢失设备。如果病人的机密信息落入坏人之手,IG 会发疯的,ICO 将有一个现场日! 2.再次与 1 一样,加密需要存储在设备上,我们在查看 JavaScript 以对凭据进行逆向工程时也会遇到同样的问题。 加密部分必须在 Java 中完成,Cordova 为从 Javascript 调用 Java 函数提供了出色的支持。这样,您还可以使用其他应用程序通常无法读取的应用程序的用户空间。 谢谢马丁。我宁愿尝试在不使用任何商业产品的情况下做到这一点,即它是基于标准的。除了你已经说过的以外,还有什么想法吗? 哦,我看到它是开源的,我怕它也不会浮动 - 我不是很挑剔!!!【参考方案2】:您可以做的是仅在在线登录后缓存当前用户。这将降低枚举本地数据库中的用户的风险。
然后您需要在前端加密用户的数据,我会选择一个为您完成这项工作的库(例如,RxDB)。 RxDB 接受密码(您可以即时生成)并基于它加密您的数据库数据。然后用户填写表格(做他想做的任何事情),如果突然互联网消失了,用户仍然能够继续他的工作,并且必须将该工作添加为待处理的请求才能进行同步。 (你已经有了)
当互联网恢复时,您将检查用户的会话是否已过期,如果是,则提示用户再次登录,如果是同一用户则进行同步。如果它仍然存在,请执行同步。
【讨论】:
以上是关于离线 Web 应用程序中的安全用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章
java- 哪种方式易于实现且安全,用于 Web 应用程序/Web 服务中的最终用户身份验证
为 iOS 应用程序中的 Facebook 身份验证设计,该应用程序还访问安全的 Web 服务