佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Rails實(shí)現(xiàn)字段加密存儲(chǔ)

Rails實(shí)現(xiàn)字段加密存儲(chǔ)

熱門(mén)標(biāo)簽:百度AI接口 企業(yè)做大做強(qiáng) 語(yǔ)音系統(tǒng) 硅谷的囚徒呼叫中心 呼叫中心市場(chǎng)需求 客戶服務(wù) 電話運(yùn)營(yíng)中心 Win7旗艦版

方案

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

實(shí)現(xiàn)

ActiveSupport::MessageEncryptor 是 Rails 基于 openssl 封裝實(shí)現(xiàn)的一個(gè)類,可用于對(duì)一個(gè)對(duì)象進(jì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 里的一個(gè)類方法,可用于執(zhí)行一個(gè) column 如何存儲(chǔ)到數(shù)據(jù)庫(kù),以及從數(shù)據(jù)庫(kù)讀取出來(lái)后要如何處理,例如:

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

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

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

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

基于此,我們可以自己實(shí)現(xiàn)一個(gè) serializer,使得我們能夠進(jìn)行對(duì)字段進(jìn)行加密存儲(chǔ),同時(shí)讀取出來(lái)時(shí)能夠自行進(jìn)行解密。

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

可以改進(jìn)的點(diǎn)

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

標(biāo)簽:安康 崇左 山西 山西 喀什 長(zhǎng)沙 濟(jì)南 海南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Rails實(shí)現(xiàn)字段加密存儲(chǔ)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    乌兰浩特市| 宽城| 西峡县| 河津市| 商都县| 台东县| 大英县| 增城市| 乐陵市| 铜山县| 交城县| 泸水县| 北碚区| 仪征市| 铅山县| 贞丰县| 南部县| 区。| 大宁县| 常州市| 界首市| 灵宝市| 阜宁县| 万安县| 安福县| 浏阳市| 淮北市| 浑源县| 浙江省| 赤城县| 盐山县| 南岸区| 顺平县| 利川市| 阳信县| 南投市| 绥宁县| 沙雅县| 土默特右旗| 自贡市| 永宁县|