aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/secrets.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/secrets.rb')
-rw-r--r--railties/lib/rails/secrets.rb31
1 files changed, 10 insertions, 21 deletions
diff --git a/railties/lib/rails/secrets.rb b/railties/lib/rails/secrets.rb
index a083914109..8b644f212c 100644
--- a/railties/lib/rails/secrets.rb
+++ b/railties/lib/rails/secrets.rb
@@ -1,4 +1,5 @@
require "yaml"
+require "active_support/message_encryptor"
module Rails
# Greatly inspired by Ara T. Howard's magnificent sekrets gem. 😘
@@ -12,12 +13,11 @@ module Rails
end
end
- @read_encrypted_secrets = false
+ @cipher = "aes-128-gcm"
@root = File # Wonky, but ensures `join` uses the current directory.
class << self
- attr_writer :root
- attr_accessor :read_encrypted_secrets
+ attr_writer :root
def parse(paths, env:)
paths.each_with_object(Hash.new) do |path, all_secrets|
@@ -30,20 +30,19 @@ module Rails
end
def generate_key
- cipher = new_cipher
- SecureRandom.hex(cipher.key_len)[0, cipher.key_len]
+ SecureRandom.hex(OpenSSL::Cipher.new(@cipher).key_len)
end
def key
ENV["RAILS_MASTER_KEY"] || read_key_file || handle_missing_key
end
- def encrypt(text)
- cipher(:encrypt, text)
+ def encrypt(data)
+ encryptor.encrypt_and_sign(data)
end
def decrypt(data)
- cipher(:decrypt, data)
+ encryptor.decrypt_and_verify(data)
end
def read
@@ -87,24 +86,14 @@ module Rails
def preprocess(path)
if path.end_with?(".enc")
- if @read_encrypted_secrets
- decrypt(IO.binread(path))
- else
- ""
- end
+ decrypt(IO.binread(path))
else
IO.read(path)
end
end
- def new_cipher
- OpenSSL::Cipher.new("aes-256-cbc")
- end
-
- def cipher(mode, data)
- cipher = new_cipher.public_send(mode)
- cipher.key = key
- cipher.update(data) << cipher.final
+ def encryptor
+ @encryptor ||= ActiveSupport::MessageEncryptor.new([ key ].pack("H*"), cipher: @cipher)
end
end
end