macOSでファイルを暗号化する

クラウドストレージの検閲&BANを防ぐ

AmazonDriveの容量無制限プラン(Unlimited)を使用していたのですが、残念ながら容量制限が入ることになってしまったため、ひとまず退避場所としてOneDriveが1Tbyteまるまる空いていたのを思い出し移動することにしたのですが…。

OneDriveと言えば検閲に始まり誤判定からのBAN祭りが一時期話題になりました。現在は改善されているかもしれないですし、不正利用をチェックするのは当然といえば当然なんですがあまりにこの噂が広まりすぎてて怖くて利用できないw it.srad.jp

精神的な安寧を得るべく、仕方なしにファイルは暗号化した上でアップしようと思ったというわけです。

2つの暗号化方法

パスワード付きZip

古来から伝わる手法としてzipコマンドに -e オプションをつけることで気軽に暗号化できます。以下の例だと「memo.txt」を「memo.zip」に圧縮しつつパスワードをかけています。ネット上だとパスワード付きZIPはネタにされがちですが、何だかんだで便利なんですよねw 仕事相手に送りつける場合など互換性とか気にしなくて良いので。

暗号化

### ファイル
$ zip -e memo.zip memo.txt
Enter password: 
Verify password: 
  adding: memo.txt (deflated 48%)

### ディレクトリをまるごと
$ zip -e -r memo.zip memo/
Enter password: 
Verify password: 
  adding: memo/ (stored 0%)
  adding: memo/.DS_Store (deflated 96%)
  adding: memo/foo/ (stored 0%)
  adding: memo/foo/memo.txt (deflated 48%)

復号化

復号化(解凍)のする場合はunzipコマンドで。もちろんGUIでダブルクリックしても大丈夫w

$ unzip memo.zip
Archive:  memo.zip
[memo.zip] memo.txt password: 
  inflating: memo.txt

OpenSSLを使用したAES形式の暗号化

本来の用途であればここまでで十分な気もするのですが、Zipでの暗号化は最近のPCのスペックだと総当りで挑まれるとやはり辛い、面倒なことはしたくないがもう少し強固に…という場合に使うのがこの方法。

OpenSSLのインストール

HomeBrewで一発で入ります。

### 存在するか確認しておく
$ brew search openssl
==> Searching local taps...
openssl                      openssl@1.1                  glib-openssl

### インストール
$ brew install openssl

HomeBrew自体はデフォルトでMacには含まれませんので、導入していない方は以下を先に実行してbrewを入れておいてください。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

https://brew.sh/index_ja.htmlbrew.sh

暗号化

コマンドは以下の通り。

$ openssl enc -e -aes-256-cbc -salt -k 【パスワード】 -in 【対象ファイル】 -out 【出力したいファイル名orパス】

実際に暗号化してみます。odコマンドは対象のバイナリをTerminalに表示する時に使用する物です。別のデータに変換されているのが確認できます。

### 暗号化
$ openssl enc -e -aes-256-cbc -salt -k password -in memo.txt -out memo.txt.aes

$ cat memo.txt 
Hello!                                                       

### ファイルの中身を確認
$ od -h memo.txt    
0000000      6548    6c6c    216f                                        
0000006
$ od -h memo.txt.aes 
0000000      6153    746c    6465    5f5f    d497    c1db    ec99    a058
0000020      3372    3c93    b0ef    a6ed    69dc    8a3c    a507    5308
0000040

復号化

先ほどのデータを複合化してみます。コマンドは以下の通り。暗号化時との違いは「-e」オプションが「-d」に変わったところだけですね。

$ openssl enc -d -aes-256-cbc -salt -k 【パスワード】 -in 【対象ファイル】 -out 【出力したいファイル名orパス】

試してみます。バイナリレベルでも元に戻ったことが確認できると思います。

### 復号化
$ openssl enc -d -aes-256-cbc -salt -k password -in memo.txt.aes -out memo.txt   

### 確認します。
$ cat memo.txt
Hello!
$ od -h memo.txt
0000000      6548    6c6c    216f                                        
0000006

今回の目的を果たすにはここまでやっていれば十分でしょう。 ここまでの内容で今回はOneDriveに保存することにしました。

履歴(history)から削除する

最後にhistoryから削除しておきます。 ここに書いた方法だとhistoryコマンドを打たれるとパスワードがバレてしまいます。

Terminalはデフォルトではbashになっていますので ~/.bash_historyを直接編集してしまうか、以下のコマンドを打ちます。

history -d [削除したい行番行]

zshの場合は ~/.zsh_historyです。 あとは背後から覗き込まれると丸見えなので、ショルダーハックなどにも気をつけたいところですねぇ。

巨大なファイルでどれくらい膨れあげるのか?

一つ不安な点があるとすれば、わずか数バイトのファイルでこれくらいでかくなるということは、巨大なファイルだと一体どうなっちゃうのか心配になりますが、そこらへんはうまいこと出来ています。

以下は大量の画像ファイルをZipで圧縮し、AES方式で暗号化したファイル一覧です。

$ ls -l
total 52890560
-rw-r--r--  1 katsube  staff     1972888  1 24 05:25 2006.zip
-rw-r--r--  1 katsube  staff     1972912  1 24 05:38 2006.zip.aes
-rw-r--r--  1 katsube  staff     3577796  1 24 05:25 2010.zip
-rw-r--r--  1 katsube  staff     3577824  1 24 05:41 2010.zip.aes
-rw-r--r--  1 katsube  staff   768549864  1 24 05:26 2011.zip
-rw-r--r--  1 katsube  staff   768549888  1 24 05:41 2011.zip.aes
-rw-r--r--  1 katsube  staff   891087945  1 24 05:27 2012.zip
-rw-r--r--  1 katsube  staff   891087968  1 24 05:43 2012.zip.aes
-rw-r--r--  1 katsube  staff   970920182  1 24 05:28 2013.zip
-rw-r--r--  1 katsube  staff   970920208  1 24 05:44 2013.zip.aes
-rw-r--r--  1 katsube  staff   349654854  1 24 05:29 2014.zip
-rw-r--r--  1 katsube  staff   349654880  1 24 05:44 2014.zip.aes
-rw-r--r--  1 katsube  staff  1465334619  1 24 05:32 2015.zip
-rw-r--r--  1 katsube  staff  1465334640  1 24 05:46 2015.zip.aes
-rw-r--r--  1 katsube  staff  4483621338  1 24 05:39 2016.zip
-rw-r--r--  1 katsube  staff  4483621360  1 24 05:50 2016.zip.aes

ファイルサイズ的にはほとんど変わっていませんね。

クラウドストレージ向けの自動暗号化ツール

Boxcrypt、Cryptomator、airDriveなどクラウドストレージに保存するファイルを自動的に暗号化してくれるツールも色々あるようです。これらを使えば暗号化や復号化といった面倒な作業を一切気にしなくて良いので楽ちんですね。

https://www.boxcryptor.com/en/ https://cryptomator.org/ https://airdrive.jp/details.html

ただし突然サポートが終了した場合に対処できるか…という点と、いずれも有償ですのでコストメリットがどれくらいあるかは検討した方が良いかもです。また独自の暗号化方式を採用しているソフトは注意が必要です。AESは暗号化の仕様が定められていますので、仮にOpenSSLのプロジェクトが解散したとしても何とかなる可能性が高いですが、独自形式の場合はそう簡単にはいきません。

私の場合は完全にバックアップ用のファイルのみであったので、これらのツールは見送りました。

利用者の負担と不安が大きすぎる

そもそも利用者にこのような負担を強いることが間違ってる気もするんですけどね…。特にOneDriveはOffice365Soloを契約した上で使用してるというのに。

「OneDrive for Business」であれば検閲はしないとMSが公約しているので、暗号化とか面倒なことしたくないが、1TbyteのOneDrive使いたいといった場合にはBusiness番のOffice365の契約を検討した方が良さそうですね。個人でも購入できる上になぜかSoloよりBuisinessの方が安いという謎価格設定だったりもするので。

無課金の方は諦めてください(;´∀`)