1

我正在制作一个宝石来包装一个 API。该服务需要一些登录参数,因此我创建了一个 Connection 类,通过传入所有登录值进行初始化,并使用实例变量进行存储。@secret_access_key显然,这些价值观之一是秘密的。它在应用程序中不可读。但是在 irb 中测试 gem 时,我看到在返回对象时密钥与所有其他实例变量一起显示。

mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
 => #<MWS::Connection:0x007fbd22acef40 @access_key="1", @merchant_id="3", @marketplace_id="4", @secret_access_key="SECRET!!!">

我很担心密钥会出现在 Heroku 日志、应用程序错误消息或其他任何内容中。

我应该担心吗?如果是这样,存储或隐藏此信息的最佳方式是什么?

另外,我正在使用 httparty gem 来管理这个,我可以用那个 gem 做些更好的事情吗?

4

2 回答 2

5

您可以使用此解决方法:

class MWS::Connection
  def inspect
    "#<MWS::Connection:#{object_id}>"
  end
end

当然,密钥仍然可以访问,但它现在不应该出现在任何日志中:

mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
# => #<MWS::Connection:0x007fbd22acef40>
mws.instance_variable_get(:@secret_access_key) # => 'SECRET!!!'
于 2012-01-08T16:23:12.677 回答
2
class MWS::Connection
  def initalize(opts)
    ...
    @secret_access_key = Cypher.encypher(opts[:secret_access_key]) if opts[:secret_access_key]
  end

  def secret_access_key
    Cypher.decypher @secret_access_key
  end
end

class Cypher
  def self.encypher(str)
    str + 'fancy_encryption_protocol'
  end

  def self.decypher(str)
    str.sub 'fancy_encryption_protocol$', ''
  end
end
于 2012-01-08T16:23:00.533 回答