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

首頁 > 編程 > Ruby > 正文

Rails實現字段加密存儲

2020-10-29 19:33:51
字體:
來源:轉載
供稿:網友

方案

存儲前,加密后再存儲到數據庫
讀取后,利用 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, Hashenduser = User.newuser.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 endendclass User < ActiveRecord::Base serialize :preferences, CustomerSerializerend

基于此,我們可以自己實現一個 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 是否過于簡單?
針對現有數據,如何平滑過渡?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘洛县| 平利县| 博湖县| 云龙县| 鄂尔多斯市| 隆化县| 鄯善县| 东阿县| 广南县| 长治市| 获嘉县| 绿春县| 谷城县| 观塘区| 涟源市| 津市市| 肇庆市| 南岸区| 利川市| 沽源县| 田东县| 安吉县| 祁连县| 樟树市| 虎林市| 昭通市| 柯坪县| 日土县| 海丰县| 郁南县| 揭阳市| 平江县| 铜梁县| 双峰县| 洞头县| 繁峙县| 苍南县| 稻城县| 深州市| 龙井市| 凤凰县|