這裡介紹如何在 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
輸出,就會出現一堆亂碼:
加密過的檔案若沒有使用原密碼解密,就會完全無法閱讀,這樣就達到保護檔案的作用。這種加密方式適用於任何的檔案類型,包含文字檔、照片、影片等,只要將輸入與輸出的檔名替換即可。
解密單一檔案
單一檔案的解密方式與加密相當類似,只是將參數中的 -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 上面的討論。
繼續閱讀: 12
Dave
介紹的非常易懂~
Chao
加密應該用private_key.pem。
lu
非对称加密是用公钥的,签名才是使用私钥