Securly存储OpenID标识符和OAuth令牌

我正在创build一个Web应用程序,使用OpenIDlogin和OAuth令牌与Youtube。 我目前在数据库中以纯文本格式存储OpenID身份和OAuth令牌/令牌密钥。

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

是否有必要encryptionOpenID的身份? 有人可以使用它来访问用户的帐户吗?

首先,有一个具有consumer_keyconsumer_secret的注册应用程序。

当用户authentication并“允许”你的注册应用程序时,你会得到:一个access_token被认为是用户的“密码”,并且允许你的应用程序代表用户行事。

所以,从数据库中获取用户的access_token ,如果他们没有consumer_keyconsumer_secret来获得完整的访问权限,也不会有太大的帮助。

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

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

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

如果您正在运行OAuth服务器,则也会出现这种情况,您仍然需要原始的令牌/密码来validation请求。

如果您想要使用AES等双向encryptionalgorithm,仍然可以对其进行encryption,以便在数据库或数据库备份受到威胁时提供安全保护。

这里有两个思想stream派。

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

第二个说法是:当某人有权访问你的数据库并有足够的权限访问你的networking来运行一个中间人攻击时,无论如何你都会受到攻击。

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

同时,Google也有这样的build议:

“令牌应该和服务器上存储的其他敏感信息一样安全。”

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

而networking上的一些随机的人有具体的实施build议:

  • 如果他们在常规磁盘文件上,请使用文件系统权限保护它们,确保它们已encryption,并且密码良好
  • 如果他们在数据库中,则encryption这些字段,妥善保存密钥,并谨慎地保护对数据库的访问。 *
  • 如果他们在LDAP中,请执行相同的操作。

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

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

如果您必须长期存储令牌,则OAuth令牌/密码应该是保密的,并且encryption可以提高安全性。 在我们的OAuth消费者应用程序中,令牌/秘密仅在会话中存储一段时间,我们select不encryption它们。 我觉得这很安全。 如果有人可以窥探我们的会话存储,他们可能也有我们的encryption密钥。

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

披露:我在SecureDB工作。