OpenSSLを使用した暗号化・復号化ツールの作成
ちょっと自前で暗号化、復号化出来るgemライブラリが欲しかったので、OpenSSLを利用し、暗号化したデータをYAML or JSONで保存できるような形式で作ったので、簡単に仕様をまとめておきます。
confidential_info_manager | RubyGems.org | your community gem host
経緯
現在アサインしているプロジェクトでRailsを使用しているのだが、いくらGithubのプライベートリポジトリを使用しているとはいえ、パスワードやAPIKeyなどの管理があまりにも雑すぎるので、それを何とかしようと思い、数十ある物を全て環境変数に入れるのもいいのだが、何でもかんでも環境変数頼りだと、また管理が雑になりそうな気がしたので、暗号機器のパスフレーズのみを環境変数で管理して、それ以外を暗号化し、YAMLへ保存、YAMLデータを復号化して使用できればという流れで作った感じです。
インストール
$ gem install confidential_info_manager
使い方
文字列
require "confidential_info_manager" raw_data = "string" manager = ConfidentialInfoManager::Core.new("password") # encrypt encrypt_data = manager.encrypt(raw_data) # decrypt decrypt_data = manager.decrypt(encrypt_data, String)
Array
require "confidential_info_manager" raw_data = ["ruby", "java", "python", "scala", "php"] manager = ConfidentialInfoManager::Core.new("password") # encrypt encrypt_data = manager.encrypt(raw_data) # decrypt decrypt_data = manager.decrypt(encrypt_data, Array)
Hash
require "confidential_info_manager" raw_data = { key: "val" } manager = ConfidentialInfoManager::Core.new("password") # encrypt encrypt_data = manager.encrypt(raw_data) # decrypt decrypt_data = manager.decrypt(encrypt_data, Hash)
YAML
YAMLとJSONデータに保存する場合は、valueのみ暗号化します
require "confidential_info_manager" raw_data = { API_KEY: "aaaaa", API_SECRET_KEY: "bbbbb" } file_path = "./config/secret.yml" manager = ConfidentialInfoManager::YAML.new("password") # YAML形式で保存 encrypt_data = manager.save(secret_data, file_path) # 復号化して読み込み decrypt_data = manager.load(file_path)
JSON
require "confidential_info_manager" raw_data = { API_KEY: "aaaaa", API_SECRET_KEY: "bbbbb" } file_path = "./config/secret.json" manager = ConfidentialInfoManager::JSON.new("password") # JSON形式で保存 encrypt_data = manager.save(secret_data, file_path) # 復号化して読み込み decrypt_data = manager.load(file_path)
コマンドラインでやり取り
コマンドラインで暗号化
$ echo "Hello World" | openssl enc -e -aes-256-cbc -base64 -pass pass:hoge
ライブラリで復号化
require "confidential_info_manager" # コマンドラインで指定したアルゴリズムを使用する. # iteration countは1で固定になる(opensslコマンドでiteration countの指定やり方が見つからない...) manager = ConfidentialInfoManager::Core.new("hoge", "AES-256-CBC", 1) manager.decrypt(cli_encrypt_str)
ライブラリで暗号化
require "confidential_info_manager" raw_data = "Hello, World" # Iterator is 1 fixed manager = ConfidentialInfoManager::Core.new("hoge", "AES-256-CBC", 1) manager.encrypt(raw_data)
コマンドラインで復号化
# アルゴリズムは暗号化で用いたものと同じ物を使用 $ echo <encrypted_data> | openssl enc -d -aes-256-cbc -base64 -pass pass:hoge