encrypted_attributes
adds support for automatically encrypting ActiveRecord
attributes.
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 shown in the Usage section.
Add it to your Gemfile
gem 'encrypted_attributes', :git => 'git://github.com/kwiest/encrypted_attributes'
For Rails < 3.0 you should use the Rails 2.3 branch
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
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
salt = "#{login}-#{Time.now}"
end
end
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
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
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.
- Rails 3.0 or later
- encrypted_strings