如何存储加密数据?

时间:2018-11-16 09:38:30

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

我刚接触ruby,我正在开发一个应用程序,该应用程序将具有非常敏感的数据(来自其他网站的api密钥),并且我需要将其加密存储在db中,但并不随时知道它们。

让我自己解释一下:

  1. 该表单向用户询问其api键
  2. 加密它们
  3. 将其存储在数据库中

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

很抱歉,这个问题很愚蠢,但我找不到解决办法,谢谢。

2 个答案:

答案 0 :(得分: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

,但它在静止状态下(在数据库中)已加密,没有密钥就无法检索。

答案 1 :(得分:0)

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方法,并将返回的加密值存储在DB中。 然后解密,将加密的密钥传递给decrypt方法。

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

答案的原始来源是here