class AttrCipher::Cipher

Constants

ALGORITHM

Public Class Methods

decrypt(secret, value, serialize = false) click to toggle source
# 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) click to toggle source
# File lib/attr_cipher/cipher.rb, line 46
def self.encrypt(secret, value, serialize = false)
  new(secret, serialize).encrypt(value)
end
new(secret = nil, serialize = false) click to toggle source
# File lib/attr_cipher/cipher.rb, line 9
def initialize(secret = nil, serialize = false)
  @secret = secret
  @serialize = serialize
end

Public Instance Methods

cipher(mode, value) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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