Class: AttrCipher::Cipher

Inherits:
Object
  • Object
show all
Defined in:
lib/attr_cipher/cipher.rb

Constant Summary collapse

ALGORITHM =
"AES-256-CBC".freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(secret = nil, serialize = false) ⇒ Cipher

Returns a new instance of Cipher.



9
10
11
12
# File 'lib/attr_cipher/cipher.rb', line 9

def initialize(secret = nil, serialize = false)
  @secret = secret
  @serialize = serialize
end

Class Method Details

.decrypt(secret, value, serialize = false) ⇒ Object



42
43
44
# File 'lib/attr_cipher/cipher.rb', line 42

def self.decrypt(secret, value, serialize = false)
  new(secret, serialize).decrypt(value)
end

.encrypt(secret, value, serialize = false) ⇒ Object



46
47
48
# File 'lib/attr_cipher/cipher.rb', line 46

def self.encrypt(secret, value, serialize = false)
  new(secret, serialize).encrypt(value)
end

Instance Method Details

#cipher(mode, value) ⇒ Object



14
15
16
17
18
19
20
# File 'lib/attr_cipher/cipher.rb', line 14

def cipher(mode, value)
  cipher = OpenSSL::Cipher.new(ALGORITHM).public_send(mode)
  digest = Digest::SHA256.digest(@secret)
  cipher.key = digest
  cipher.iv = digest[0...cipher.iv_len]
  cipher.update(value) + cipher.final
end

#decrypt(value) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'lib/attr_cipher/cipher.rb', line 22

def decrypt(value)
  if @secret.nil? || (@secret.respond_to?(:size) && @secret.size < 100)
    raise SecretException.new("Secret not set or must have at least 100 characters.")
  else
    decoded = Base64.decode64(value)
    decrypted = cipher(:decrypt, decoded)
    @serialize ? Marshal.load(decrypted) : decrypted
  end
end

#encrypt(value) ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/attr_cipher/cipher.rb', line 32

def encrypt(value)
  if @secret.nil? || (@secret.respond_to?(:size) && @secret.size < 100)
    raise SecretException.new("Secret not set or must have at least 100 characters.")
  else
    data = @serialize ? Marshal.dump(value) : value.to_s
    encrypted = cipher(:encrypt, data)
    Base64.encode64(encrypted).chomp
  end
end