【问题标题】:How to store encrypted data?如何存储加密数据?
【发布时间】:2018-11-16 09:38:30
【问题描述】:

我是 ruby​​ on rails 的新手,我正在开发一个应用程序,该应用程序将包含非常敏感的数据(来自其他网站的 api 密钥),我需要将其加密存储在数据库中,但在任何时候都不知道它们。

让我解释一下自己:

  1. 表单要求用户提供他的 api 密钥
  2. 加密它们
  3. 将其存储在数据库中

主要问题是,我如何加密它们以便我以后可以使用它们(仍然不知道它们)?

对不起,如果这个问题很愚蠢,但我找不到解决方法,谢谢。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems


【解决方案1】:

我为此使用了attr_encrypted。效果很好。

  class User
    attr_encrypted :ssn, key: 'This is a key that is 256 bits!!'
  end

然后您可以像使用普通字段一样使用 ssn

 user = User.find(1)
 puts user.ssn

但它是静态加密的(在数据库中),没有密钥就无法检索。

【讨论】:

    【解决方案2】:
    def encrypt text
      text = text.to_s unless text.is_a? String
    
      len   = ActiveSupport::MessageEncryptor.key_len
      salt  = SecureRandom.hex len
      key   = ActiveSupport::KeyGenerator.new(Rails.application.secrets.secret_key_base).generate_key salt, len
      crypt = ActiveSupport::MessageEncryptor.new key
      encrypted_data = crypt.encrypt_and_sign text
      "#{salt}$$#{encrypted_data}"
    end
    
    def decrypt text
      salt, data = text.split "$$"
    
      len   = ActiveSupport::MessageEncryptor.key_len
      key   = ActiveSupport::KeyGenerator.new(Rails.application.secrets.secret_key_base).generate_key salt, len
      crypt = ActiveSupport::MessageEncryptor.new key
      crypt.decrypt_and_verify data
    end
    

    将密钥传递给encrypt 方法并将返回的加密值存储在数据库中。 然后解密将加密的密钥传递给decrypt 方法。

    这是假设您的密钥库位于 Rails.application.secrets.secret_key_base

    答案的原始来源是here

    【讨论】:

    • 也就是说,我感觉 MessageEncryptor 将在我当前的任务中派上用场:)
    • 是的,如果您想保存密码,那么 attr_encrypted 会很方便。但是如果你想保存 API 密钥 MessageEncryptor 将完成这项工作。两者都有自己的用例。
    • 嗯?两者之间实际上没有区别(当应用于将数据保存到数据库时)。除了一个抽象持久性和加密而另一个没有。如果他们的目标是保存加密数据,为什么他们会更喜欢 MessageEncryptor?这只是更多的工作,没有任何好处。
    • 对不起,我在想别的东西!你是对的,两者都做类似的工作!
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2015-11-05
    • 2012-04-07
    • 2016-12-25
    • 2011-07-15
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多