使用 OpenSSL 或 GnuPG 加密檔案與目錄,用密碼上鎖保護機密資料

這裡介紹如何在 Mac OS X 或 Linux 中使用 OpenSSL 或 GnuPG 加密檔案與目錄,保護機敏性資料。

在 Mac OS X 或 Linux 系統上,若想要對特定的檔案或目錄加密,保護機密性或敏感性的資料避免外洩,最常用的方式就是 OpenSSL 或 GnuPG 這兩個工具,以下是這兩個工具的用法教學與範例。

使用 OpenSSL 加密

加密單一檔案

假設我們有一個檔案 test.cpp,若要使用 AES256 加密演算法對其加密,可以使用:

openssl enc -e -aes256 -in test.cpp -out test.cpp.enc

openssl 這個指令的功能相當多,這裡我們只會使用到加解密相關的功能,以下是參數的說明:

  • enc:以指定的 cipher 進行資料的編碼,不管加密或解密都是使用這一個指令(command)。
  • -e:進行加密動作。
  • -aes256:指定 AES256 這一個 cipher。
  • -in:指定輸入的檔案。
  • -out:指定輸出的檔案。

執行之後,會要求使用者輸入密碼,最後就會產生 test.cpp.enc 這個加密的檔案,如果把它用 cat 輸出,就會出現一堆亂碼:

how-to-encrypt-data-in-linux-using-gpg-and-open-ssl-1

以 OpenSSL 加密檔案

加密過的檔案若沒有使用原密碼解密,就會完全無法閱讀,這樣就達到保護檔案的作用。這種加密方式適用於任何的檔案類型,包含文字檔、照片、影片等,只要將輸入與輸出的檔名替換即可。

解密單一檔案

單一檔案的解密方式與加密相當類似,只是將參數中的 -e 改為 -d,並指定一下輸入與輸出檔案而已:

openssl enc -d -aes256 -in test.cpp.enc -out test.cpp

這樣就可以將 test.cpp.enc 這個加密的檔案解密後,輸出至 test.cpp 中。

加密與解密目錄

若要對整個目錄進行加密,可以將目錄用 tar 壓縮之後,再進行加密:

tar czf - my_folder | openssl enc -e -aes256 -out secured.tgz.enc

這樣就會將 my_folder 整個目錄以 gzip 壓縮之後再加密,儲存成一個 secured.tgz.enc 加密檔。若要解密的話,則執行:

openssl enc -d -aes256 -in secured.tgz.enc | tar xz

加密與解密多個檔案

如果把目前路徑下所有的檔案與目錄一次加密起來,可以使用:

tar czf - * | openssl enc -e -aes256 -out secured.tgz.enc

若要解密的話,可以使用:

mkdir output_folder
openssl enc -d -aes256 -in secured.tgz.enc | tar xz -C output_folder

這裡我們建立一個新的 output_folder 目錄來放置所有的檔案,這樣可以避免解開的檔案與目前路徑中的檔案混在一起。

非對稱式加密

非對稱式加密又稱為公開金鑰加密,加密之前必須產生一組私鑰與公鑰,使用公鑰對資料進行加密,加密之後的資料只有擁有私鑰的人才能解密。

首先產生一支私鑰:

openssl genrsa -out private_key.pem 1024
Generating RSA private key, 1024 bit long modulus
...............++++++
............++++++
e is 65537 (0x10001)

這裡我們將私鑰儲存於 private_key.pem 這個檔案中,接著以這支私鑰產生對應的公鑰:

openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout
writing RSA key

產生的公鑰儲存於 public_key.pem

若要使用公鑰進行加密,則執行:

openssl rsautl -encrypt -inkey public_key.pem -pubin -in test.txt -out test.txt.enc

解密則執行:

openssl rsautl -decrypt -inkey private_key.pem -in test.txt.enc -out test.txt

由於這種公開金鑰加密的方式無法對任意大小的檔案加密,所以如果檔案稍微大一點,可能就會出現這樣的錯誤:

RSA operation error
140735276269648:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:

遇到大檔案的狀況可以產生一個亂數密碼,將資料以這組密碼進行對稱式加密,然後再將密碼使用非對稱式加密的方式加密。首先產生亂數密碼:

openssl rand -base64 64 > key.bin

使用亂數密碼配合對稱式加密演算法將資料加密:

openssl enc -aes-256-cbc -salt -in test.txt -out test.txt.enc -pass file:key.bin

再將這組亂數密碼以非對稱式的方式加密:

openssl rsautl -encrypt -inkey public_key.pem -pubin -in key.bin -out key.bin.enc

解密時首先使用私鑰將亂數密碼解密:

openssl rsautl -decrypt -inkey private_key.pem -in key.bin.enc -out key.bin

接著再用這組亂數密碼爸資料解密:

openssl enc -d -aes-256-cbc -in test.txt.enc -out test.txt -pass file:key.bin

其他關於使用 OpenSSL 加密檔案的做法,可以參考 stackoverflow 上面的討論。

Linux

3 留言

  1. Dave

    介紹的非常易懂~

  2. Chao

    加密應該用private_key.pem。

    • lu

      非对称加密是用公钥的,签名才是使用私钥

Comments are Closed