= 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 plugin, 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 encryptor being used from the encrypted_strings plugin.
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
=== SHA Encryption
For SHA encryption, you can either use the default salt, a custom salt, or
generate one based on the attributes of the model.
With the default salt:
class User < ActiveRecord::Base
encrypts :password
end
With a custom salt based on the record's values:
class User < ActiveRecord::Base
encrypts :password, :salt => :create_salt
private
def create_salt
"#{login}_salt"
end
end
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.
=== Symmetric Encryption
With the default key:
class User < ActiveRecord::Base
encrypts :password, :mode => :symmetric
end
With a custom key:
class User < ActiveRecord::Base
encrypts :password, :mode => :symmetric, :key => 'custom'
end
=== Asymmetric Encryption
With default key files:
class User < ActiveRecord::Base
encrypts :password, :mode => :asymmetric
end
With custom key files:
class User < ActiveRecord::Base
encrypts :password, :mode => :asymmetric, :public_key_file => '/keys/public', :private_key_file => '/keys/private'
end
=== Targeted Encryption
If you want to store the encrypted value in a different attribute than the
attribute being encrypted, you can do so like so:
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 => Proc.new {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]