国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Rails實現(xiàn)字段加密存儲

2019-10-26 19:30:05
字體:
供稿:網(wǎng)友

方案

存儲前,加密后再存儲到數(shù)據(jù)庫
讀取后,利用 KEY 進行解密

實現(xiàn)

ActiveSupport::MessageEncryptor 是 Rails 基于 openssl 封裝實現(xiàn)的一個類,可用于對一個對象進行加密、解密操作。例如:

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 里的一個類方法,可用于執(zhí)行一個 column 如何存儲到數(shù)據(jù)庫,以及從數(shù)據(jù)庫讀取出來后要如何處理,例如:

class User < ActiveRecord::Base serialize :preferences, Hashenduser = User.newuser.preferences = { gender: 'male', age: 18}user.save!

另外,Rails 還允許自定義 Serizlizer,使得開發(fā)者能夠自行決定如何做進行序列化和反序列化。例如:

class CustomerSerializer def self.load(value)  value.to_s.blank? ? "" : JSON.parse(value) end def self.dump(value)  (value || {}).to_json endendclass User < ActiveRecord::Base serialize :preferences, CustomerSerializerend

基于此,我們可以自己實現(xiàn)一個 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) endendclass 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, EncryptedStringSerializerend

可以改進的點

加解密用的 KEY 是否過于簡單?
針對現(xiàn)有數(shù)據(jù),如何平滑過渡?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳东县| 文化| 东兴市| 永新县| 清流县| 罗城| 施秉县| 永安市| 和静县| SHOW| 吉安市| 大冶市| 洱源县| 台安县| 剑川县| 会理县| 红原县| 中方县| 周宁县| 民县| 通许县| 加查县| 平江县| 呼伦贝尔市| 大兴区| 保靖县| 长春市| 伊春市| 包头市| 吴堡县| 长葛市| 屏南县| 鄢陵县| 方城县| 邵阳县| 安新县| 县级市| 溧阳市| 吴旗县| 翼城县| 高邮市|