濮阳杆衣贸易有限公司

主頁 > 知識庫 > Rails實現(xiàn)字段加密存儲

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

熱門標(biāo)簽:開封百應(yīng)電銷機器人聯(lián)系方式 樂昌電話機器人 邯鄲外呼調(diào)研線路 武漢呼叫中心外呼系統(tǒng)線路商 買了外呼系統(tǒng)不想用了怎么辦 真人語音電銷機器人系統(tǒng) 電話機器人電話卡封號怎么辦 北京語音電銷機器人價格 浦東上海400開頭的電話申請

方案

存儲前,加密后再存儲到數(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, Hash
end

user = User.new
user.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
 end
end

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

基于此,我們可以自己實現(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)
 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 是否過于簡單?
針對現(xiàn)有數(shù)據(jù),如何平滑過渡?

標(biāo)簽:自貢 鄂州 河北 淄博 石嘴山 宜春 六安 松原

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Rails實現(xiàn)字段加密存儲》,本文關(guān)鍵詞  Rails,實現(xiàn),字段,加密,存儲,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Rails實現(xiàn)字段加密存儲》相關(guān)的同類信息!
  • 本頁收集關(guān)于Rails實現(xiàn)字段加密存儲的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    汕头市| 洪江市| 铜鼓县| 阿瓦提县| 台东市| 宁蒗| 江油市| 温宿县| 乡城县| 安乡县| 阳高县| 同江市| 清涧县| 宜阳县| 镇宁| 广丰县| 电白县| 奇台县| 汪清县| 泰安市| 正安县| 呼图壁县| 保德县| 德化县| 大田县| 青阳县| 东乡县| 昭平县| 漳州市| 芮城县| 昌都县| 益阳市| 昌黎县| 静宁县| 南部县| 河南省| 阿合奇县| 丹棱县| 比如县| 延庆县| 左云县|