【发布时间】:2014-11-07 13:18:23
【问题描述】:
我正在建立一个网站以使用 Google 的 OAuth2 界面进行用户身份验证。该网站将存储与每个用户相关的私人数据——我打算对其进行加密。
如果我为网站实施了自己的身份验证方法,我可以轻松地从用户的凭据(包括用户的密码)中派生出一个密钥,从而为每个用户的数据提供强有力的保护。但是使用 OAuth2,我相信我只能收到一个访问令牌,在一段时间内授予该用户权限 - 问题是访问令牌值会随着时间而变化。
OAuth2 有没有一种方法可以为我提供与用户相关的不可变机密,我可以使用该机密从中派生安全密钥?还是有其他使用 OAuth2 创建安全持久密钥的方法?
--- 编辑---
针对问题和 cmets,以下是一些需要考虑的想法:
- 应始终使用强加密和用户身份验证来保护所有用户信息 - 我们阅读如此多有关网站和数据库黑客攻击的新闻文章的原因是因为开发人员说“我们真的需要保护它吗”然后回答“不 -因为除了我们之外没有人可以访问数据库,安全性很困难等等”。黑客下载了数据库et violá。信用卡、电子邮件地址、电话号码、密码,随便你说出来,然后就被泄露了。
- 只有两个真正的秘密 - 一个是存储在某人头脑中的密码,另一个是只有授权用户才能访问的强随机值(如物理令牌)。如果您认为安全密钥可以仅从电子邮件地址派生,或者需要将机密存储在数据库中,那么您并不真正了解安全性。
我想我试图发现的是 OAuth 提供者是否可以向 OAuth 客户端提供安全链接到用户和客户端的不可变值 - 实际上,这将是一个只能由 OAuth 提供者使用解锁的密钥用户密码(他们的身份验证密码)和客户端密码(在 OAuth 协议中使用)的组合。然后,客户端可以使用此值为用户数据提供合理的安全级别。
当然,这种实施并非完美无缺,但实施得当,可以提供一种合理的方式来保护数据,同时仍然使用 OAuth 方案的良好做法。
【问题讨论】:
-
我投票决定关闭,因为它太宽泛了。但是,我认为这个问题很好,而且问得很好。我从不太确定这样的问题是否应该关闭。这个问题显然是从程序员的角度来看的,但它是stackoverflow范围内的编程问题吗?
-
您打算如何从非机密信息(例如用户 ID)中导出机密信息?请记住,密码和电子邮件地址可以并且将会改变,唯一不变的是用户 ID,这不是秘密。您需要生成一个随机密钥,并将其存储在您的数据库中,与用户 ID 相关联。但是用于解密数据库中数据的秘密也在数据库中,这使得它毫无意义。
-
我认为不可能得到你想要的——如果你需要访问数据,那么你需要访问密钥。 “用户的秘密”和“客户的秘密”并不是真正不同的东西。 OAuth 用于确定用户是他们所说的那个人——你要么必须信任,要么不信任。
-
您可以做的另一件事是在应用服务器上存储一个“服务器加密密钥”,并将其与用户的密钥结合起来加密数据库中的数据。这样,如果您有数据库泄漏,假设他们没有获得您的服务器密钥,您的数据库内容仍然是安全的。
-
@adelphus 你解决过这个问题吗?我正在尝试做类似的事情。
标签: security authentication encryption oauth-2.0