Vim is able to write files encrypted, and read them back. The encrypted text cannot be read without the right key.
Vim 作為世界知名的編輯器,實在多才多藝,就連加密都有支援,這麼方便的功能,不免引起我的注意,因此特別花了一些時間查看如何透過 Vim 加密檔案以及用 Vim 加密檔案有什麼限制。
本文環境
- Vim 9.0
Vim 加密的功能需要在編譯時有設定 +cryptv
選項,如果想檢查你正在使用的 Vim 是否支援加密功能,可以使用以下指令:
$ vim --version | grep "+crypt"
如果有支援的話,將會出現 +cryptv
在輸出結果:
+cryptv +listcmds
用 Vim 加密檔案
如果想用 Vim 加密檔案,可以在開啟新檔案時,加上 -x
的選項:
$ vim -x new_file.txt
Vim 會要求先設定一組加密金鑰(encryption key)用來加密該檔案,日後如果要用 Vim 開啟該檔案,就需要輸入該組金鑰(密碼),只有輸入正確金鑰,文字內容才會正確顯示:
如果金鑰輸入不正確, Vim 依然會使用該金鑰進行解密,但解密出來的內容會與當初的內容不ㄧ致,例如當初內容是 abcdef
的話,輸入錯誤的金鑰之後,內容可能會變成 *^@<86>ªo<8d>é
這類亂碼,如果此時又輸入 :w
進行存檔,檔案內容就會被破壞,這是由於 Vim 的加密方式並沒有所謂的完整性檢查(integrity checks),所以只要有人有權限存取該檔案,就有可能有檔案內容被破壞的風險。
值得注意的是,當使用 Vim 編輯有加密的檔案時,其 swap file, undo file 也會一併被加密,畢竟如果不加密 swap file 與 undo file 的話,其他人就能夠透過 swap file 與 undo file 得知檔案內容,不過 swap file 與 undo file 的加密是 block-by-block 的方式,也就是說 swap file 與 undo file 中會有多個區塊存在,每個區塊都是用同一把 key 進行加密,有心人可以透過這些區塊所提供的加密結果,加速推算出你所使用的密碼 ,如果你害怕有心人透過 swap file 與 undo file 反推密碼,你也可以在 Vim 裡輸入以下指令關閉 undo file 與 swap file:
:set noundofile
:noswapfile edit secrets
不過關閉 swap file 有可能導致 Vim 當掉(crash)時,沒有機會透過 swap file 救回該檔案,可能會犧牲一些使用體驗。
Note: The text in memory is not encrypted. A system administrator may be able to see your text while you are editing it.
雖然檔案是加密的,不過在編輯時,完整的檔案內容仍可以在記憶體中被找到,這代表有心人仍可以透過記憶體鑑識(forensic)工具直接取得完整的檔案內容。
此外, viminfo 檔案也不會被加密,所以有心人士也可以透過 viminfo 檔案得知部分的檔案內容,因為 viminfo 存有:
- 搜尋字串紀錄
- Register 的內容
- 全域變數(Global variables)
- 其他(command line 紀錄、 pattern 搜尋/取代紀錄等等)
這些紀錄也可能洩露部分檔案內容,這也是使用 Vim 加密檔案需要注意的地方,不過 viminfo 也可以透過 Vim 指令關閉:
:set viminfo=
所以使用 Vim 加密檔案時,最好關掉 swap file, undo file 以及 vnminfo:
:set noundofile viminfo=
:noswapfile edit secrets.txt
除了開啟新檔案時,加上 -x
的選項使用加密功能之外,也能在編輯一般檔案時使用下列 Vim 指令將檔案加密:
:X
當輸入 :X
時, Vim 就會請你設定一組金鑰進行加密。
Vim 支援哪些加密方法
Vim 支援以下加密方法:
- zip
- blowfish
- blowfish2 (推薦使用 / 預設)
- xchacha20
其中 blowfish2 是官方推薦使用的方法, zip 則是最不推薦的加密方法。
如果要設定加密方法,可以使用以下 Vim 指令:
:set cm=<加密方法>
例如:
:set cm=blowfish2
總結
看了 Vim 的文件,才知道 Vim 的加密有諸多限制,所以使用上必須注意前文提及的限制才能用得安心。
There is never 100% safety. The encryption in Vim has not been tested for robustness.
另外,官方文件也明確指出使用 Vim 加密檔案並不保證 100% 安全,所以並不適合用 Vim 加密極度機敏的資料,譬如你的帳號密碼、 API key 等等。
Vim 的加密功能只適合用在不想給人簡單看到的資料,或者用來阻止 macOS Finder 這種能搜尋文字檔內容的功能搜到檔案內容。