Rails实现字段加密存储

转载  更新时间:2017年11月27日 08:56:42   作者:JustQyx   我要评论

这篇文章主要介绍了Rails实现字段加密存储的方法以及具体的示例代码,非常实用,需要的朋友可以参考下

方案

存储前,加密后再存储到数据库
读取后,利用 KEY 进行解密

实现

ActiveSupport::MessageEncryptor 是 Rails 基于 openssl 封装实现的一个类,可用于对一个对象进行加密、解密操作。例如:

salt = SecureRandom.random_bytes(64)
key  = ActiveSupport::KeyGenerator.new('password').generate_key(salt) # => "\x89\xE0\x156\xAC..."
crypt = ActiveSupport::MessageEncryptor.new(key)            # => #<ActiveSupport::MessageEncryptor ...>
encrypted_data = crypt.encrypt_and_sign('my secret data')       # => "NlFBTTMwOUV5UlA1QlNEN2xkY2d6eThYWWh..."
crypt.decrypt_and_verify(encrypted_data)                # => "my secret data"

serialize 是 Rails ActiveRecord 里的一个类方法,可用于执行一个 column 如何存储到数据库,以及从数据库读取出来后要如何处理,例如:

class User < ActiveRecord::Base
 serialize :preferences, Hash
end

user = User.new
user.preferences = {
 gender: 'male',
 age: 18
}
user.save!

另外,Rails 还允许自定义 Serizlizer,使得开发者能够自行决定如何做进行序列化和反序列化。例如:

class CustomerSerializer
 def self.load(value)
  value.to_s.blank? ? "" : JSON.parse(value)
 end

 def self.dump(value)
  (value || {}).to_json
 end
end

class User < ActiveRecord::Base
 serialize :preferences, CustomerSerializer
end

基于此,我们可以自己实现一个 serializer,使得我们能够进行对字段进行加密存储,同时读取出来时能够自行进行解密。

class EncryptedStringSerializer
 def self.load(value)
  value.to_s.blank? ? '' : decrypt(value)
 end

 def self.dump(value)
  encrypt(value || '')
 end

 private

 def self.encrypt(value)
  encryptor.encrypt_and_sign(value)
 end

 def self.decrypt(value)
  encryptor.decrypt_and_verify(value)
 end

 def self.encryptor
  @encryptor ||= ActiveSupport::MessageEncryptor.new(Settings.message_encryptor_key)
 end
end

class UserAddress < ActiveRecord::Base
 serialize :phone, EncryptedStringSerializer
 serialize :first_name, EncryptedStringSerializer
 serialize :last_name, EncryptedStringSerializer
 serialize :country, EncryptedStringSerializer
 serialize :state, EncryptedStringSerializer
 serialize :city, EncryptedStringSerializer
 serialize :address1, EncryptedStringSerializer
 serialize :address2, EncryptedStringSerializer
 serialize :zipcode, EncryptedStringSerializer
end

可以改进的点

加解密用的 KEY 是否过于简单?
针对现有数据,如何平滑过渡?

相关文章

  • 在Ruby on Rails中使用Rails Active Resource的教程

    在Ruby on Rails中使用Rails Active Resource的教程

    这篇文章主要介绍了在Ruby on Rails中使用Rails Active Resource的教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • Ruby中require、load、include、extend的区别介绍

    Ruby中require、load、include、extend的区别介绍

    这篇文章主要介绍了Ruby中require、load、include、extend的区别介绍,require、load用于文件,如.rb等等结尾的文件,include、load则用于包含一个文件中的模块,需要的朋友可以参考下
    2015-05-05
  • Ruby中检测Gem是否安装的方法

    Ruby中检测Gem是否安装的方法

    这篇文章主要介绍了Ruby中检测Gem是否安装的方法,本文直接给出实现代码以及使用方法,需要的朋友可以参考下
    2015-01-01
  • 使用Ruby来处理JSON的简单教程

    使用Ruby来处理JSON的简单教程

    这篇文章主要介绍了使用Ruby来处理JSON的简单教程,用到了Ruby gem,需要的朋友可以参考下
    2015-04-04
  • Ruby面向对象编程详解

    Ruby面向对象编程详解

    这篇文章主要介绍了Ruby面向对象编程详解,本文讲解了类的定义、定义对象、initialize方法、实例变量、类变量、类常量、类的继承等内容,需要的朋友可以参考下
    2014-10-10
  • Ruby编程中的赋值相关操作

    Ruby编程中的赋值相关操作

    这篇文章主要介绍了Ruby编程中的赋值相关操作,是Ruby入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07
  • RVM安装和使用总结笔记

    RVM安装和使用总结笔记

    这篇文章主要介绍了RVM安装和使用总结笔记,本文讲解了RVM安装和配置命令,同时讲解了ruby的安装和配置,需要的朋友可以参考下
    2015-04-04
  • ruby 异常处理:rescue

    ruby 异常处理:rescue

    ruby 异常处理:rescue...
    2007-11-11
  • Ruby中实现把字符串转换为类的2种方法

    Ruby中实现把字符串转换为类的2种方法

    这篇文章主要介绍了Ruby中实现把字符串转换为类的2种方法,其中一种是rails提供的方法,需要的朋友可以参考下
    2014-10-10
  • 如何利用Ruby简单模拟Lambda演算详解

    如何利用Ruby简单模拟Lambda演算详解

    最近在学习lambda演算的相关内容,由于资料不全,学习的过程很是痛苦,下面这篇文章主要给大家介绍了关于如何利用Ruby简单模拟Lambda演算的相关资料,需要的朋友可以参考借鉴,下面来随着小编一起学习学习吧。
    2017-08-08

最新评论