Memperkenalkan Enkrip
- Last modified atEnkrip adalah ruby gem untuk memudahkan enkripsi dan dekripsi atribut dari model Active Record.
Dibalik layar, sebenarnya hanya menggunakan callback dari Active Record dan ActiveSupport::MessageEncryptor untuk operasi enkripsi dan dekripsi.
Untuk demo bisa dilihat melalui repositori Enkrip Example dimana aplikasi tersebut menggunakan Ruby on Rails.
Tujuan
- Mudah melakukan enkripsi dan dekripsi baik atribut string atau angka
- Kompatibel dengan validasi Active Model
- Otomatis melakukan konversi format untuk
numeric_attributes
Batasan
- Seluruh atribut yang didefinisikan pada
numeric_attributes
akan dipaksa menggunakan format UTF-8 encoding - Enkrip hanya dapat berjalan pada Active Record 5.2 atau lebih baru
- Tidak kompatibel dengan activerecord-import
Instalasi
Tambahkan enkrip
pada Gemfile dan jalankan bundle install
.
gem 'enkrip'
Konfigurasi
Setelah instalasi, perlu isi enviroment variables ENKRIP_LENGTH
, ENKRIP_SALT
, dan ENKRIP_SECRET
.
# example
export ENKRIP_LENGTH=32 # 32 adalah default value dari ActiveSupport::MessageEncryptor.key_len
export ENKRIP_SALT=random_salt_with_length_32 # dapat di-generate menggunakan SecureRandom.random_bytes(YOUR_ENKRIP_LENGTH)
export ENKRIP_SECRET=random_secret_with_length_32
Cara Penggunaan
Agar enkripsi dapat digunakan, maka perlu menggunakan tipe data text
.
# migration
class CreatePosts < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.text :my_string
t.text :my_numeric
t.timestamps
end
end
end
Setelah migration selesai dijalankan, baru konfigurasi Enkrip
pada Model.
# Active Record model
class Post < ActiveRecord::Base
include Enkrip::Model
enkrip_configure do |config|
config.string_attributes << :my_string
config.numeric_attributes << :my_numeric
config.purpose = :example # opsional, default: nil
config.convert_method_for_numeric_attribute = :to_f # opsional, default: to_i
config.default_value_if_numeric_attribute_blank = 0.0 # opsional, default: 0
end
validates :my_numeric, numericality: { greater_than: 0 }
validates :my_string, presence: true
end
Untuk mengecek enkripsi dapat menggunakan raw query.
# Rails 5.2 console
post = Post.new => #<Post id: nil, my_string: nil, my_numeric: nil, created_at: nil, updated_at: nil>
post.valid? # => false
post.errors.full_messages # => ["My numeric must be greater than 0", "My string can't be blank"]
post.my_string = "aloha" # => "aloha"
post.my_numeric = 5 # => 5
post.save # => true
raw = ActiveRecord::Base.connection.exec_query 'SELECT my_string, my_numeric FROM posts limit 1'
raw.rows.first[raw.columns.find_index('my_string')]
# => "TUVQcnRBck5oYzMvRlRZUWR3Mzlzdz09LS1tZ09xNGNYbnkzdFc2d1duMEIrdUdBPT0=--ffae1f04753ca5c636915746a4c6fccf81897138"
raw.rows.first[raw.columns.find_index('my_numeric')]
# => "TkdSbURRNzVMbUF6MjF0bjI2ZEtmQT09LS1rRHhqQ2xpWGhYaHBoRlhCRnVZSmh3PT0=--74e45e6c96df78258a1731994a71a74c5047d655"
post.reload
post.my_string # => "aloha"
post.my_numeric # => 5
Jika ingin menggunakan enkripsi dan dekripsi tanpa model Active Record, dapat menggunakan Enkrip::Engine.encrypt
dan Enkrip::Engine.decrypt
.
my_string = 'hello world'
encrypted_my_string = Enkrip::Engine.encrypt my_string
# => "MzZ1M0RDSWdQQ0VaRVJXT3NBYlVTWExWVnVSbXNBeXRMSC9wYWdoeW5Ddz0tLVNVT2l6NDJCd1ZxbW1lYnl2eC9PakE9PQ==--c7436c403595c18fef802a51be29f73d5bb73f19"
Enkrip::Engine.decrypt encrypted_my_string
# => "hello world"
License
Enkrip dirilis dengan Lisensi MIT.