ruby-on-rails 如何在Ruby on Rails中生成API Key和Secret?

wljmcqd8  于 2023-07-01  发布在  Ruby
关注(0)|答案(3)|浏览(96)

例如API_key:4faa86aa5848207502000002和API_secret 7375d7d1e89d3d602b184432fbcf3c09c7cb30676f19af9ac57d228be401
我应该使用SecureRandom吗?

goucqfw6

goucqfw61#

我试过authlogic_api。这是相当容易实现的。

vbopmzt1

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是什么?

结构化秘密有三个部分:

  • 前缀(2-10个字符,由您定义)
  • 30个随机字符
  • 6个字符的校验和

就是这样!
格式如下:
[prefix]_[randomness][checksum]
一个例子Sssecret,一个orgt和一个typek,看起来像这样:
tk_GNrRoBa1p9nuwm7XrWkrhYUNQ7edOw4GUp8I

前缀

令牌前缀是使令牌可识别的简单而有效的方法。SlackStripe、GitHub和其他人都采用了这种方法,效果很好。
Sssecrets允许您提供两个缩写字符串orgtype,它们共同构成令牌前缀。一般来说,org将用于指定一个总体标识符(如您的公司或应用程序),而type旨在以某种方式识别令牌类型(即OAuth令牌,刷新令牌等)。为了保持Sssecret令牌的紧凑和一致的格式,orgtype的长度不应超过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

  • 查看GitHub博客。*

校验和

令牌的随机分量用于计算CRC 32校验和。该校验和以Base 62编码,并使用前导零进行填充,以确保其长度始终为6个字符。
令牌校验和可用作第一遍有效性检查。使用这些校验和,当针对秘密扫描代码库时,可以或多或少地消除误报,因为可以忽略假令牌而不需要查询后端或数据库。

  • 请注意,此库只能检查给定令牌的形式是否正确以及是否具有有效的校验和。要完全确定给定的令牌是否处于活动状态,您仍然需要实现自己的逻辑来检查您发布的令牌的有效性。
  • 另一个注解:由于Sssecrets使用与GitHub令牌相同的格式,因此您还可以使用SimpleStructuredSecrets#validate对GitHub发布的秘密进行离线验证。

延伸阅读

您可以在GitHub blog上了解更多关于GitHub的设计过程和此API令牌格式的属性。

kiayqfof

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看起来很不错。

相关问题