国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 商城县| 长治市| 柯坪县| 岱山县| 清原| 和政县| 会泽县| 湘阴县| 玉环县| 杂多县| 镇巴县| 顺昌县| 祁阳县| 个旧市| 航空| 婺源县| 台安县| 磴口县| 玉环县| 德令哈市| 盐津县| 宁南县| 临朐县| 卢湾区| 大新县| 肃北| 富阳市| 香河县| 恩平市| 出国| 桓台县| 商河县| 河池市| 北海市| 邻水| 清徐县| 德令哈市| 遂川县| 通州区| 大悟县| 榆中县|