你知道 Vim 也能加密文字檔(text file)嗎?

Posted on  Dec 18, 2022  in  Vim  by  Amo Chen  ‐ 3 min read

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 這種能搜尋文字檔內容的功能搜到檔案內容。

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!