パスワードをファイルに直接書いちゃだめ
パスワードをファイルに書いちゃダメ、といわれてもそうも行かないよねぇ。
ファイルシステムのバージョンニング
ファイルシステムにジャーナル機能があって自動バックアップだったりするので、OSXのバックアップをLinuxに取得してたら丸見えだったりするじゃん。それはいざという時に時間コスト削減でいいんだけど、ファイルが見えちゃうのは嫌。
うっかりgithub に投げちゃった問題
平文でパスワード書いたファイルをうっかりgit commit して、いつもの流れで git push してた、慣れって怖い。
ウッカリ、git push しても補足されない方法が必要だった。
ruby の opensslを利用して変換。
ということで、暗号化・復号化で暗号文と平文に変換する。
Ruby スクリプトでデータを暗号化する方法 - WebOS Goodies を参考に。ファイルを処理してみた。
def encrypt_data(data,pass) cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC") salt = OpenSSL::Random.random_bytes(8) cipher.encrypt cipher.pkcs5_keyivgen(pass, salt) data = cipher.update(data) + cipher.final ## salted data = "Salted__" + salt + data end
def decrypt_data(data,pass) data = data.force_encoding("ASCII-8BIT") salt = data[8,8] data = data[16, data.size] cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC") cipher.decrypt cipher.pkcs5_keyivgen(pass, salt) cipher.update(data) +cipher.final
暗号化のキーはなにしたらいいの?
なんでもいいんだけど、手元の端末にいつもあるファイルをキーに暗号したら楽だよ。
つまり、id_rsa だとか、ログインアカウントの写真とかですね。
ファイルではくパスフレーズ(String)を使うなら
文字列をOSX Keychains に入れておけば、紛失することないでしょうね。
Chrome なんかはOSX Keychains にマスター鍵入れてますね。
パスワードを保存する奴。作った
つまり、マスターキー( ~/.ssh/id_rsa )で平文パスワードファイルを暗号化して保存しておくってことですね。
むかしはpit とか使えばよかった
pit でも良いんだけど、pit だと編集面倒くさいから CSV/TSV で一行に書きたかった。
pit は暗号化されないし、作っても手間じゃないしね。
ここで ruby 1.9 から注意
Stringのinternal encoding があります。ホントruby の何処が嫌いってここが嫌い。文字列エンコーディングなんて出力時でいいじゃんと思うわ・・・
ファイルからStringに読み込んだデータなどを扱うので、 8-octet つまり 8BIT にしておく。
data = data.force_encoding("ASCII-8BIT")
まぁもっともSaltを一緒に保存しなければいいだろ言われりゃそうなんですけど。
参考資料
本の虫: GNU/Linuxでお手軽に使えるCLIのファイル暗号化ツール