安全地存储OpenID标识符和OAuth令牌

Mat*_*ick 58 database security openid encryption oauth

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

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

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

Feh*_*eha 28

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

当用户验证并"允许"您注册的应用程序时,您会回来:access_token这被认为是用户的"密码",并允许您的应用程序代表用户行事.

所以,想起来了用户的access_token从你的数据库将帮助不大,如果他们不也有consumer_keyconsumer_secret的完全访问权限.

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

这只是在您需要代表用户更新或更改用户的资源所有者时.要让用户登录您的站点,请使用会话.

  • 如果您使用带有承载令牌的OAuth 2.0,则情况并非如此.您只需要一个访问令牌(身份验证令牌)来访问用户数据.需要注意的事情. (34认同)

小智 19

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

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

如果您愿意,仍然可以使用双向加密算法(如AES)对它们进行加密,以便在数据库或数据库备份受到威胁时提供安全性.

  • @Lekensteyn可能是AES,与单向加密哈希函数相比是双向的.当您在同一环境中使用两者时,公私密钥密码术并不会给您带来太大的影响. (3认同)
  • 其他答案说将它们视为密码,但这个答案很好,因为它指出你需要一种双向加密算法.使用散列密码,您可以散列用户键入的内容并检查散列密码.使用令牌和秘密,您需要再次获取原始文本. (2认同)

Ben*_*her 12

这里有两种思想流派.

第一个论点是:您应该将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/

  • 如果有人还在追踪这个 - 我非常同情加密像这样的东西的想法,但它让我的新手大脑感到震惊,我们只是将问题推到另一个层面 - 我们可以加密,但现在我们有了将加密秘密放在某处,防止IT被盗.将它放在webroot之外的某个文件中是否足够? (2认同)
  • Web服务器用户无法访问的webroot外部的文件(如果他们以这种方式进入).或者是一个单独的PKI基础设施,它可以解决各种复杂问题.这可以防止攻击者找到转储数据库的方法而不是整个文件系统 - 比如通过SQL注入攻击. (2认同)
  • @BenWalther Web服务器无法访问的文件?但是,Web服务器必须访问该文件(纯文本标记)才能与基于OAuth的服务进行交互. (2认同)