【问题标题】:JS client side encryption & OauthJS客户端加密和Oauth
【发布时间】:2021-03-02 16:55:00
【问题描述】:

我们正在构建一个开源 SaaS 应用程序,有一些信息是服务器不需要知道的,而用户更愿意保密。

这不是超级机密/危及生命的东西,但是服务器不需要知道...

我们使用来自各种流行第三方的 Oauth 对用户进行身份验证。

如何根据 Oauth 令牌派生加密密钥? (让我们保留一些,仅支持 Google、Facebook 和 Twitter)令牌

【问题讨论】:

  • OAuth 令牌将随着会话的变化而变化。您确定要将它们用作键吗?
  • 您可以为此使用基于密码的密钥派生函数。如果你想知道如何在代码中做到这一点,stackoverflow 一定有你的答案。
  • 基本的想法是能够加密这些数据,而不会有用户丢失他的主密钥的风险。如果可能的话,我正在寻找一种无需额外密码即可提供良好安全性的方法。如果没有,我们只需要一个 PIN/密码。

标签: encryption javascript oauth-2.0


【解决方案1】:

强制性的第一条评论:整个模型不可能安全地完成。如果服务器是恶意/受损的,它将为用户 JS 提供服务,该用户 JS 窃取了攻击者想要知道的任何秘密并将它们发送(到服务器或其他地方)而用户不知道。如果您希望客户端加密提供任何真正的安全性,您需要在本地获取其代码的东西,例如客户端应用程序或浏览器扩展程序。


不幸的是,OAuth(尤其是第三方身份提供商)非常不适合这种情况。使用远程后端进行客户端加密的通常方式是客户端对用户的密码进行两次哈希处理(以不同的方式/使用不同的盐),然后将一个传递给服务器进行身份验证,并使用另一个来派生/解密用户的主加密密钥。由于用户实际上没有您网站的任何密码,并且他们拥有的密码是使用您无法控制的代码在第三方网站上输入的,因此这显然不适合您。

我看不出有任何方法可以让用户知道但服务器或攻击者都不知道的秘密,除非在您的应用程序验证后添加一个额外的“解锁”密码。 OAuth 服务器不会返回任何值,客户端可以用来派生秘密,尤其是服务器不知道的秘密。

您最好的选择可能只是将加密密钥存储在用户数据库中,或者可能存储在只有服务器可以访问的 HSM 中,并将加密数据存储在其他地方(S3 或其他地方)。这甚至比正常尝试的安全性更低——攻击服务器的攻击者可以在不更改任何内容的情况下解密所有内容,当然也不会更改客户端看到的任何代码——但如果你可以将密钥和数据保存在不同的位置,那么至少您可以安全地防止有人破坏一个位置而不是另一个位置(而不是连接它们的服务器)。这至少比将密钥存储在数据旁边要好一些,在这种情况下,加密根本不会增加安全性,只是一个非常小的减速带。

【讨论】:

  • 谢谢,是的,我知道受感染的服务器可能会向客户端发送恶意 JS,但主要用例确实是为了避免任何数据泄露的情况对任何人都有任何用处。您确认了我的期望,即您需要让用户自己提供秘密以确保可靠的加密。我真的希望有人比我更聪明,我会想出一些办法:)。我对用户提供自己的解密密钥/密码的问题是用户往往会经常丢失密码。无法恢复他的数据是一个大问题!谢谢
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 2017-10-18
  • 2015-09-06
  • 2019-12-04
  • 2012-02-15
  • 2021-07-16
  • 2021-05-12
  • 2013-11-06
相关资源
最近更新 更多