API 秘密应该散列吗?
Should API Secrets Be Hashed?
这听起来像是一个愚蠢的问题,因为密码当然需要散列并且永远不会存储原始密码。
然而,对于 API 个秘密,通常我在注册时看到它们以明文形式显示。
例如,如果我转到 google api 控制台并查看我的凭据页面,我可以查看我的客户端密码,对于 Twitter 也是如此。
肯定 api 密钥和密码一样敏感?
是否仅仅是因为从提供商方面,您可以确信正在生成足够强的密码?
如果是这种情况,那么这不会提供任何保护,因为您的数据库已受到威胁。
或者可能是因为如果您使用的是基于令牌的身份验证,您要么在执行密码授予类型,这要求您发送您的凭据以及客户端 ID 和密码,要么是刷新令牌,所以用户应该已经被攻破了?
我能想到几个可能的答案:
- 在某些情况下,服务器可能需要永久存储明文 API 密钥以满足可用性要求(Google 和 Twitter 就是示例)。
- 在某些情况下,单独的 API 密钥根本不足以做很多事情——此外,还需要有一个经过身份验证的帐户——因此 API 密钥本身是有限的价值(因此价值低于密码)。
- 在许多情况下,API 密钥在客户端应用程序中被硬编码(尤其是移动应用程序,几乎总是这样做),因此在服务器上添加额外的保护没有意义当可以从客户端简单地提取相同的令牌时。
- 安全行业还没有那么成熟。也许一旦黑客开始倾销 API 密钥,像这样的想法可能会受到更认真的对待。
顺便说一句,我对最后一点很认真。事实是,很多好的想法只有在获得足够多的支持后才能成为现实。例如,我曾经写过一篇关于相关主题的博客——protecting user confidential information by hashing it in the database,但在合法用户登录时可以恢复的方式。我以 Ashley Madison 为例——在那种情况下,黑客是在电子邮件地址、phone 号码和物理地址之后比密码更多。因此,当黑客抢走数据库时,他们立即得到了他们想要的东西,他们可以不关心 bcrypt 编码的密码(事实上,一些较旧的密码只用 MD5 编码!)不幸的是,像这样的概念没有足够的努力使它们成为现实。即使是零知识网页设计在现实世界中也很少见。
这听起来像是一个愚蠢的问题,因为密码当然需要散列并且永远不会存储原始密码。
然而,对于 API 个秘密,通常我在注册时看到它们以明文形式显示。
例如,如果我转到 google api 控制台并查看我的凭据页面,我可以查看我的客户端密码,对于 Twitter 也是如此。
肯定 api 密钥和密码一样敏感?
是否仅仅是因为从提供商方面,您可以确信正在生成足够强的密码? 如果是这种情况,那么这不会提供任何保护,因为您的数据库已受到威胁。
或者可能是因为如果您使用的是基于令牌的身份验证,您要么在执行密码授予类型,这要求您发送您的凭据以及客户端 ID 和密码,要么是刷新令牌,所以用户应该已经被攻破了?
我能想到几个可能的答案:
- 在某些情况下,服务器可能需要永久存储明文 API 密钥以满足可用性要求(Google 和 Twitter 就是示例)。
- 在某些情况下,单独的 API 密钥根本不足以做很多事情——此外,还需要有一个经过身份验证的帐户——因此 API 密钥本身是有限的价值(因此价值低于密码)。
- 在许多情况下,API 密钥在客户端应用程序中被硬编码(尤其是移动应用程序,几乎总是这样做),因此在服务器上添加额外的保护没有意义当可以从客户端简单地提取相同的令牌时。
- 安全行业还没有那么成熟。也许一旦黑客开始倾销 API 密钥,像这样的想法可能会受到更认真的对待。
顺便说一句,我对最后一点很认真。事实是,很多好的想法只有在获得足够多的支持后才能成为现实。例如,我曾经写过一篇关于相关主题的博客——protecting user confidential information by hashing it in the database,但在合法用户登录时可以恢复的方式。我以 Ashley Madison 为例——在那种情况下,黑客是在电子邮件地址、phone 号码和物理地址之后比密码更多。因此,当黑客抢走数据库时,他们立即得到了他们想要的东西,他们可以不关心 bcrypt 编码的密码(事实上,一些较旧的密码只用 MD5 编码!)不幸的是,像这样的概念没有足够的努力使它们成为现实。即使是零知识网页设计在现实世界中也很少见。