= encrypted_attributes
+encrypted_attributes+ adds support for automatically encrypting ActiveRecord
attributes.
== Resources
API
* http://api.pluginaweek.org/encrypted_attributes
Bugs
* http://pluginaweek.lighthouseapp.com/projects/13269-encrypted_attributes
Development
* http://github.com/pluginaweek/encrypted_attributes
Source
* git://github.com/pluginaweek/encrypted_attributes.git
== Description
Encrypting attributes can be repetitive especially when doing so throughout
various models and various projects. encrypted_attributes, in association
with the encrypted_strings library, helps make encrypting ActiveRecord
attributes easier by automating the process.
The options that +encrypts+ takes includes all of the encryption options for
the specific type of cipher being used from the encrypted_strings library.
Therefore, if setting the key for asymmetric encryption, this would be passed
into the +encrypts+ method. Examples of this are show in the Usage section.
== Usage
=== Encryption Modes
SHA, symmetric, and asymmetric encryption modes are supported (default is SHA):
class User < ActiveRecord::Base
encrypts :password, :salt => 'secret'
# encrypts :password, :mode => :symmetric, :password => 'secret'
# encrypts :password, :mode => :asymmetric, :public_key_file => '/keys/public', :private_key_file => '/keys/private'
end
=== Dynamic Configuration
The encryption configuration can be dynamically set like so:
class User < ActiveRecord::Base
encrypts :password, :mode => :sha do |user|
{:salt => "#{user.login}-#{Time.now}", :embed_salt => true}
end
end
In this case, the salt and password values are combined and stored in the
attribute being encrypted. Therefore, there's no need to add a second column
for storing the salt value.
To store the dynamic salt in a separate column:
class User < ActiveRecord::Base
encrypts :password, :mode => :sha, :before => :create_salt do |user|
{:salt => user.salt}
end
def create_salt
self.salt = "#{login}-#{Time.now}"
end
end
=== Targeted Encryption
If you want to store the encrypted value in a different attribute than the
attribute being encrypted:
class User < ActiveRecord::Base
encrypts :password, :to => :crypted_password
end
=== Conditional Encryption
Like ActiveRecord validations, +encrypts+ can take :if and :unless
parameters that determine whether the encryption should occur. For example,
class User < ActiveRecord::Base
encrypts :password, :if => lambda {Rails.env != 'development'}
end
=== Additional information
For more examples of actual migrations and models that encrypt attributes,
see the actual API and unit tests. Also, see encrypted_strings for more
information about the various options that can be passed in.
== Testing
Before you can run any tests, the following gem must be installed:
* plugin_test_helper[http://github.com/pluginaweek/plugin_test_helper]
To run against a specific version of Rails:
rake test RAILS_FRAMEWORK_ROOT=/path/to/rails
== Dependencies
* Rails 2.1 or later
* encrypted_strings[http://github.com/pluginaweek/encrypted_strings]