2009-12-10 93 views
53

我正在创建一个Web应用程序,它将使用OpenID登录和OAuth令牌与Youtube。我目前在数据库中以纯文本形式存储OpenID身份和OAuth令牌/令牌密钥。Securly存储OpenID标识符和OAuth令牌

将这些值存储为纯文本不合适吗?我可以使用OpenID标识符的单向加密,但我不知道这是否有必要。对于OAuth令牌,我需要使用双向加密,因为我的应用依赖于获取会话令牌的某些用途。

是否需要加密OpenID身份?有人可以使用它来访问用户的帐户吗?

回答

27

首先,有一个注册申请consumer_keyconsumer_secret

当用户验证并“允许”您的注册应用程序时,您会收到: 和access_token,这被认为是用户的“密码”,并允许您的应用程序仅代表用户采取行动。

因此,从数据库中获取用户的access_token对于完全访问没有consumer_keyconsumer_secret也无济于事。

服务提供商根据请求比较所有4个参数。在存储之前加密这4个参数并在响应之前将它们解密是明智的。

这就是您需要代表用户更新或更改用户资源所有者的情况。要让用户登录到您的网站,请使用会话。

+28

如果您将OAuth 2.0与承载令牌一起使用,则不是这种情况。所有你需要的是访问令牌(auth令牌)来访问用户数据。有些事情要小心。 – FajitaNachos 2013-03-04 03:18:44

11

这里有两个学派。

第一个参数是:您应该对待OAuth令牌,如密码。如果有人访问您的数据库,获取所有OpenID/OAuth对并运行中间人攻击,他们可以模拟您网站上的任何用户。

第二个参数是:当某人有权访问您的数据库并且有足够的权限访问您的网络以运行中间人攻击时,无论如何您都会受到攻击。

我个人会在谨慎的方面犯错,只是加密它们;这是密码的标准做法,所以你不妨给自己一点点额外的安心。

与此同时,谷歌有这样的建议:

“标记应尽可能安全地视为存储在服务器上的任何其他敏感信息。”

来源:http://code.google.com/apis/accounts/docs/OAuth.html

和网络上一些随机的家伙有具体实施意见:

  • 如果他们是在一个普通的磁盘文件,使用文件系统权限 保护他们,确保他们' 已加密,并很好地隐藏了密码
  • 如果它们位于数据库中,请对字段进行加密,存储密钥 ,并保护对数据库本身的访问小心。 *
  • 如果他们在LDAP中,请执行相同操作。

http://brail.org/wordpress/2009/05/01/implementing-oauth-take-care-with-those-keys/

+2

如果有人仍然在追踪这个问题 - 我非常同情这种加密这种东西的想法,但是它触发了我的新手大脑,我们只是将问题推到另一个层面 - 我们可以加密,但是现在我们必须把加密秘密放在某个地方,并防止IT被盗。把它放在webroot之外的某个文件中足够了吗? – 2012-02-15 01:40:46

+2

Web服务器用户无法访问的webroot外部文件(以防他们以这种方式获取)。或者是一个单独的PKI基础设施,只是各种各样的复杂。这可以防止攻击者找到转储数据库的方法,但不是整个文件系统 - 比如通过SQL注入攻击。 – 2012-02-16 14:04:50

+0

感谢您的更新;这就是我要走的方向。 – 2012-02-16 16:47:22

0

的OpenID URL不应该被加密,因为这是你的 “开放ID” 从字面上看,每个人都应该知道的值。此外,URL需要是数据库中的索引,并且对数据库中的索引进行加密始终存在问题。

如果您必须长期存储令牌,OAuth令牌/机密应该是保密的,并且加密可以提高安全性。在我们的OAuth消费者应用程序中,令牌/秘密仅在会话中存储一段时间,我们选择不加密它们。我认为这足够安全。如果有人可以窥探我们的会话存储,他们可能也有我们的加密密钥。

+0

不完全正确。 OpenID网址不一定是公开的。为了防止RP之间的相关性,Google使用定向身份,以便每个RP为同一用户获得唯一的OpenID。如果所有这些都是公开的,从字面上来说每个人都知道这些价值,那么相关性将再次成为可能。 – 2009-12-10 14:42:09

+0

OP正在谈论后端数据库。它是公开的,你有更多的隐私问题需要处理。 – 2009-12-10 15:33:22

18

OAuth令牌和秘密应该在您的数据库中明显保持安全,但您无法像使用密码一样使用单向加密来存储它们。原因是您需要令牌和秘密才能签署请求。

如果您正在运行OAuth服务器,您仍然需要原始的令牌/密码来验证请求。

如果您希望您仍然可以使用2路加密算法(如AES)对它们进行加密,以便在数据库或数据库备份受到威胁时提供安全保护。

+2

其他答案说他们作为密码,但这个答案很好,因为它指出你需要一个2路加密算法。使用散列密码,您可以散列用户输入的内容,并根据散列密码进行检查。有了令牌和秘密,您需要重新获取原始文本。 – paulmorriss 2010-10-05 16:18:22

+0

双向加密算法?你的意思是公钥加密像RSA(应该使用两个不同的密钥)? AES是“双向”,因为您可以对其进行加密和解密,但只能使用相同的私钥。 – Lekensteyn 2011-10-09 20:21:42

+2

@Lekensteyn可能是AES,与单向加密散列函数相比,它是双向的。当你在同一个环境中使用这两种公钥时,公钥和私钥加密不会给你带来很多麻烦。 – skeggse 2014-08-16 21:10:57

0

是的,这些应该在数据库中静态对称加密(比如CBC模式下的AES-256)。加密这些令牌的简单方法是使用SecureDB的加密作为服务RESTful API。

披露:我在SecureDB工作。