Vimでテキストファイルの一部を部分的に暗号化する(partial-cipher)
2018/03/10
IT vim

概要

作業マシンが使えなくなるなどのリスクに備え、gitやクラウド上にファイルをアップロードしておきたい。

但し、パスワードの情報なども含まれたメモ書きなどをそのままアップロードするのはセキュリティ上よろしくない。

機密情報が含まれたファイルを暗号化してアップロードすることも考えられるけど、暗号化したファイルは復号してからでないと中身が何かが分からない。

テキストファイルの場合grepも出来なくなり非常に不便である。

そんなことからテキストファイルの一部分だけ部分的に暗号化・復号が出来る環境をvimで構築した。セキュリティを担保した上で、grepも出来るので非常に便利だ。

例えば、以下のような見た目のテキストファイルの中で、

1
2
3
4
5
6
テキストファイルの中身1
テキストファイルの中身2

<decrypt>何かのパスワード</decrypt>

テキストファイルの中身3

「何かのパスワード」となっている箇所を、

ということを、意識することなく自動的にvimにやってもらう。

Vim script

この機能を実現するためのvim scriptを公開した。

partial-cipher

本プラグインを利用する場合には、パスが通ったところにopensslコマンドが必要である。

.vimrc には以下のような設定が出来る。

1
2
3
4
5
6
7
8
9
10
11
12
let partial_cipher_crypter_enc = 'aes-256-ctr' " opensslが使用可能な暗号名
let partial_cipher_passwd_file_path = '${HOME}/.vim_partial_cipher_pass' " パスワードが記載されたファイル
let partial_cipher_target_encrypt_tag = 'decrypt' " 暗号化対象となるタグ名
let partial_cipher_target_decrypt_tag = 'encrypt' " 復号対象となるタグ名
let partial_cipher_target_files = '*.crypt.md,memo.md' " ファイル保存時、ファイルオープン時に、自動で暗号化 or 復号するファイル名
let partial_crypt_decrypt_hightlight_name = 'SpellBad' " 暗号化対象文字列のハイライト名
let partial_crypt_encrypt_hightlight_name = 'SpellRare' " 復号対象文字列のハイライト名
let partial_cipher_always_highlight = 1 " partial_cipher_target_filesの対象ファイル以外でも、ハイライトを有効にする(0にすればpartial_cipher_target_filesのときにのみハイライトする)

nnoremap <C-W><C-P><C-E> :<C-U>call partial_cipher#tag_encrypter()<CR> " 手動で暗号化するときのキーマップ定義
nnoremap <C-W><C-P><C-D> :<C-U>call partial_cipher#tag_decrypter()<CR> " 手動で復号するときのキーマップ定義
exe 'vmap <C-W><C-P><C-T> S<' . g:partial_cipher_target_encrypt_tag . '>' " Visual modeで選択した文字列を暗号化対象のタグで囲むためのキーマップ定義

暗号化のパスフレーズは、以下のように g:partial_cipher_passwd_file_path のファイルに保存しておけばOK。

1
himitsuNoPassword

上記設定例では、 *.crypt.mdmemo.md というファイル名であれば、自動的に暗号化・復号ができるようになる。

より便利にするために

上記 .vimrc の例でも記載したが、私は、以下のキーバインドを割り当てている。

1
2
3
nnoremap <C-W><C-P><C-E> :<C-U>call partial_cipher#tag_encrypter()<CR> " 手動で暗号化するときのキーマップ定義
nnoremap <C-W><C-P><C-D> :<C-U>call partial_cipher#tag_decrypter()<CR> " 手動で復号するときのキーマップ定義
exe 'vmap <C-W><C-P><C-T> S<' . g:partial_cipher_target_encrypt_tag . '>' " Visual modeで選択した文字列を暗号化対象のタグで囲むためのキーマップ定義

名前無しバッファでの作業時にも暗号化などを利用したかったのと、 Visual Modeで選択している文字列を簡単にタグで囲めるようにしたかったので。

感想

実際に動作を確認するまでは、 <decrypt>...</decrypt> のようにタグで囲まれた文字列の選択が面倒臭くなりそうだと心配していたが、 <decrypt>...</decrypt> の中のどこかにカーソルがある状態であれば vit で簡単に文字列部分のみを選択可能なので何も問題はなかった。テキストオブジェクトすごい。