blog.kotamiyake.me

為せば成る、為さねば成らぬ何事も

給与などの機密性の高い情報を保存する際に、データを暗号化する必要があります。

そこでrailsで暗号化する方法について勉強しました。

そもそも暗号化にも2種類あり、一つは可逆暗号化、もう一つは不可逆暗号化です。

その名前が示す通り、可逆であれば暗号化、復号化ができますが、不可逆であれば復号化することができない(または難しい)暗号方式です。

今回は暗号化した給与を再度復号化して使用できる必要があるので、可逆暗号化を採用します。

Railsでデータを可逆暗号で保存する – Qiitaを参考に数値を暗号化してみました。

pry(main)> salery = 10000
=> 10000

pry(main)> secret = SecureRandom.hex(128)
=> "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4"

pry(main)> encryptor = ::ActiveSupport::MessageEncryptor.new(secret)
=> #<ActiveSupport::MessageEncryptor:0x007fa51018f198
 @cipher="aes-256-cbc",
 @secret=
  "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4",
 @serializer=Marshal,
 @sign_secret=nil,
 @verifier=
  #<ActiveSupport::MessageVerifier:0x007fa51018efe0
   @digest="SHA1",
   @secret=
    "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4",
   @serializer=ActiveSupport::MessageEncryptor::NullSerializer>>

# 暗号化
pry(main)> encrypt_salery = encryptor.encrypt_and_sign(salery)
=> "VjluWVpTWDlyZGhjSG5Qa010R3pGdz09LS03WnFtaldELzJ0bmRDYXU0Y3Z2bTBBPT0=--7a581d06340ff60294a66f47db4bfaa75c480482"

# 復号化
pry(main)> encryptor.decrypt_and_verify(encrypt_salery)
=> 10000

無事暗号化できました。