読者です 読者をやめる 読者になる 読者になる

のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

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

YAMLJSONデータに保存する場合は、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

参考

OpenSSLの暗号文をJava/Perl/Rubyで開く - mixi Engineers' Blog

上記を参考にすれば、JavaPHPでの相互暗号化、復号化も難しくは無いだろう