require 'crypt/rijndael' module EncryptedColumn def self.included(klass) klass.extend(ClassMethods) end def self.encrypt(value, key ) bf = Crypt::Rijndael.new( key ) bf.encrypt_string( value ) end def self.decrypt(value, key ) bf = Crypt::Rijndael.new( key ) bf.decrypt_string( value ) end module ClassMethods def encrypted_column( name, key, options={} ) define_method "decrypted_#{name}" do crypt_key = (key.is_a? Symbol) ? send(key) : key EncryptedColumn.decrypt( send(name), crypt_key ) end define_method "#{name}=" do |value| return if value.nil? or value == "" crypt_key = (key.is_a? Symbol) ? send(key) : key self[name] = EncryptedColumn.encrypt(value, crypt_key) end # before_save do |record| # crypt_key = (key.is_a? Symbol) ? record.send(key) : key # record[name] = EncryptedColumn.encrypt(record[name], crypt_key) # end end end end