スキップしてメイン コンテンツに移動

[ruby] 複合可能な暗号化をやってみる

DBは大抵外部から直接アクセスできないように、厳重に守られていると思いますが、それでも格納するのに躊躇するような大切なデータの場合は、もう一歩踏み込んで保護したいところです。
そんな場合に役に立つ、複合可能な暗号アルゴリズムを使って、データの暗号化をやってみたいと思います。




事前準備

opensslを使用するので予めgem installしておく
gem install openssl

簡単に、暗号化 → 復号化 をやってみます。
require "openssl"

# 暗号化するデータ
data = "*secret data*"

# パスワード
pass = "**secret password**"

# salt
salt = OpenSSL::Random.random_bytes(8)

# 暗号化器を作成する
enc = OpenSSL::Cipher.new("AES-256-CBC")
enc.encrypt

# 鍵とIV(Initialize Vector)を PKCS#5 に従ってパスワードと salt から生成する
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 12345, enc.key_len + enc.iv_len)
key = key_iv[0, enc.key_len]
iv = key_iv[enc.key_len, enc.iv_len]

# 鍵とIVを設定する
enc.key = key
enc.iv = iv

# 暗号化する
encrypted_data = ""
encrypted_data << enc.update(data)
encrypted_data << enc.final

p encrypted_data

# 復号化器を作成する
dec = OpenSSL::Cipher.new("AES-256-CBC")
dec.decrypt

# 鍵とIVを設定する
dec.key = key
dec.iv = iv

# 復号化する
decrypted_data = ""
decrypted_data << dec.update(encrypted_data)
decrypted_data << dec.final

p decrypted_data

ややこしいのは、「password、salt」とkey「key、iv」の関係性。
  • passwordは、大抵システムに対して1つ設定しておく感じになるが、saltは毎回ランダム生成になる。
  • keyとivを生成するアルゴリズム(暗号アルゴリズム、ハッシュする回数)は固定なので、「key、iv」を一意な存在にするのはsaltという事になる。
  • なので、saltを失うとほぼ復号化は不可能。
  • このサンプルプログラムでは、暗号化と復号化を同時にやっているので「key、iv」は使い回しているが、本来は都度生成することになる。
上記の手順をやるためには、暗号化済みのデータとsaltはセットで保存することになる。

saltを暗号データとセットで保存しても大丈夫なのか?という疑問は尤もなところですが、opensslコマンドをCUIから実行して作成した暗号データを見てみると、データの先頭の16バイト(くらいだったと思う)にはsaltがばっちり保存されております。
こちらも別々に保存してある方が安全なのだと思いますが、要は復号化に必要な4つの要素がすべて揃わないと復号化には時間がかかるという事なんだということなのかなと思います:-)

取得した暗号化済みデータはバイナリなので、base64に変換すると文字列になり、DBに投入しやすい形に変更されるので何かと便利です。


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。