例如API_key:4faa86aa5848207502000002和API_secret 7375d7d1e89d3d602b184432fbcf3c09c7cb30676f19af9ac57d228be401。我应该使用SecureRandom吗?
4faa86aa5848207502000002
7375d7d1e89d3d602b184432fbcf3c09c7cb30676f19af9ac57d228be401
SecureRandom
goucqfw61#
我试过authlogic_api。这是相当容易实现的。
vbopmzt12#
我最近发布了一个名为sssecrets(Simple Structured Secrets)的gem来解决这个问题。Sssecrets是GitHub的API token format(也被NPM使用)的可重用实现,它旨在使开发人员能够轻松发布安全的秘密令牌,这些令牌在泄露时易于检测。Simple Structured Secrets提供了一种紧凑的格式,其属性针对静态分析工具的检测进行了优化。这使得可以使用GitHub Secret Scanning或GitLab Secret Detection等功能自动检测代码库中的机密何时泄露。
出于安全原因,使用结构化的机密格式非常重要。如果你是一个开发人员,你的应用程序发布了某种访问令牌(API密钥、PAT等),你应该尝试以一种既能将字符串标识为秘密令牌又能提供对其权限的洞察的方式来格式化这些令牌。对于奖励积分,您还应该在文档中提供示例(虚拟)令牌和正则表达式。这里有一个坏秘密的例子。在撰写本文时,HashiCorp Vault的API访问令牌如下所示(参考):f3b09679-3001-009d-2b80-9c306ab81aa6你可能认为这是一个很容易搜索的模式,但问题是:它只是一个UUID字符串。虽然是随机的,但这种格式的字符串在许多地方用于非敏感目的。这意味着,给定一个随机的UUID格式的字符串,不可能知道它是一个敏感的API凭证还是一个普通的标识符。在这种情况下,秘密扫描帮不了什么忙。
f3b09679-3001-009d-2b80-9c306ab81aa6
结构化秘密有三个部分:
就是这样!格式如下:[prefix]_[randomness][checksum]一个例子Sssecret,一个org的t和一个type的k,看起来像这样:tk_GNrRoBa1p9nuwm7XrWkrhYUNQ7edOw4GUp8I
[prefix]_[randomness][checksum]
org
t
type
k
tk_GNrRoBa1p9nuwm7XrWkrhYUNQ7edOw4GUp8I
令牌前缀是使令牌可识别的简单而有效的方法。Slack、Stripe、GitHub和其他人都采用了这种方法,效果很好。Sssecrets允许您提供两个缩写字符串org和type,它们共同构成令牌前缀。一般来说,org将用于指定一个总体标识符(如您的公司或应用程序),而type旨在以某种方式识别令牌类型(即OAuth令牌,刷新令牌等)。为了保持Sssecret令牌的紧凑和一致的格式,org和type的长度不应超过10个字符。
Simple Structured Secret令牌的熵为178:Math.log(((“a”..“z”).to_a + (“A”..“Z”).to_a + (0..9).to_a).length)/Math.log(2) * 30 = 178
Math.log(((“a”..“z”).to_a + (“A”..“Z”).to_a + (0..9).to_a).length)/Math.log(2) * 30 = 178
令牌的随机分量用于计算CRC 32校验和。该校验和以Base 62编码,并使用前导零进行填充,以确保其长度始终为6个字符。令牌校验和可用作第一遍有效性检查。使用这些校验和,当针对秘密扫描代码库时,可以或多或少地消除误报,因为可以忽略假令牌而不需要查询后端或数据库。
SimpleStructuredSecrets#validate
您可以在GitHub blog上了解更多关于GitHub的设计过程和此API令牌格式的属性。
kiayqfof3#
ActiveSupport::SecureRandom将适用于实际生成,但您还应考虑在不同事件上使令牌无效和重置令牌的方法。**由于您使用的是Devise,请查看Token Auth Strategy。您可以使用两个令牌(分别为API Key和API Secret)编写类似的策略。**您需要编写策略和模型,但在这两种情况下,Token Auth示例都可以让您走得很远。
作为起点(从Token Auth示例开始),您的模型应该声明两个必需的参数。
module Devise module Models module APIKeyAuthenticatable ... def self.required_fields(klass) [:api_key, :api_secret] end def reset_keys self.api_key = self.class.api_key self.api_secret = self.class.api_secret end
您可能还想阅读Custom authentication strategy for devise。如果你想在devise devise_oauth2_providable上提供一个功能更全的API认证解决方案,那么devise devise_oauth2_providable看起来很不错。
3条答案
按热度按时间goucqfw61#
我试过authlogic_api。这是相当容易实现的。
vbopmzt12#
我最近发布了一个名为sssecrets(Simple Structured Secrets)的gem来解决这个问题。
Sssecrets是GitHub的API token format(也被NPM使用)的可重用实现,它旨在使开发人员能够轻松发布安全的秘密令牌,这些令牌在泄露时易于检测。
Simple Structured Secrets提供了一种紧凑的格式,其属性针对静态分析工具的检测进行了优化。这使得可以使用GitHub Secret Scanning或GitLab Secret Detection等功能自动检测代码库中的机密何时泄露。
为什么要使用结构化密钥?
出于安全原因,使用结构化的机密格式非常重要。如果你是一个开发人员,你的应用程序发布了某种访问令牌(API密钥、PAT等),你应该尝试以一种既能将字符串标识为秘密令牌又能提供对其权限的洞察的方式来格式化这些令牌。对于奖励积分,您还应该在文档中提供示例(虚拟)令牌和正则表达式。
这里有一个坏秘密的例子。在撰写本文时,HashiCorp Vault的API访问令牌如下所示(参考):
f3b09679-3001-009d-2b80-9c306ab81aa6
你可能认为这是一个很容易搜索的模式,但问题是:它只是一个UUID字符串。
虽然是随机的,但这种格式的字符串在许多地方用于非敏感目的。这意味着,给定一个随机的UUID格式的字符串,不可能知道它是一个敏感的API凭证还是一个普通的标识符。在这种情况下,秘密扫描帮不了什么忙。
Structured Secret是什么?
结构化秘密有三个部分:
就是这样!
格式如下:
[prefix]_[randomness][checksum]
一个例子Sssecret,一个
org
的t
和一个type
的k
,看起来像这样:tk_GNrRoBa1p9nuwm7XrWkrhYUNQ7edOw4GUp8I
前缀
令牌前缀是使令牌可识别的简单而有效的方法。Slack、Stripe、GitHub和其他人都采用了这种方法,效果很好。
Sssecrets允许您提供两个缩写字符串
org
和type
,它们共同构成令牌前缀。一般来说,org
将用于指定一个总体标识符(如您的公司或应用程序),而type
旨在以某种方式识别令牌类型(即OAuth令牌,刷新令牌等)。为了保持Sssecret令牌的紧凑和一致的格式,org
和type
的长度不应超过10个字符。熵
Simple Structured Secret令牌的熵为178:
Math.log(((“a”..“z”).to_a + (“A”..“Z”).to_a + (0..9).to_a).length)/Math.log(2) * 30 = 178
校验和
令牌的随机分量用于计算CRC 32校验和。该校验和以Base 62编码,并使用前导零进行填充,以确保其长度始终为6个字符。
令牌校验和可用作第一遍有效性检查。使用这些校验和,当针对秘密扫描代码库时,可以或多或少地消除误报,因为可以忽略假令牌而不需要查询后端或数据库。
SimpleStructuredSecrets#validate
对GitHub发布的秘密进行离线验证。延伸阅读
您可以在GitHub blog上了解更多关于GitHub的设计过程和此API令牌格式的属性。
kiayqfof3#
ActiveSupport::SecureRandom将适用于实际生成,但您还应考虑在不同事件上使令牌无效和重置令牌的方法。
**由于您使用的是Devise,请查看Token Auth Strategy。您可以使用两个令牌(分别为API Key和API Secret)编写类似的策略。**您需要编写策略和模型,但在这两种情况下,Token Auth示例都可以让您走得很远。
作为起点(从Token Auth示例开始),您的模型应该声明两个必需的参数。
您可能还想阅读Custom authentication strategy for devise。如果你想在devise devise_oauth2_providable上提供一个功能更全的API认证解决方案,那么devise devise_oauth2_providable看起来很不错。