Skip to main content
Background Image
  1. Teches/

Gocryptfs: A File-based Encryption Tool Written in Go

··1267 words·6 mins· ·
Wildan
Author
Wildan
An Ordinary Human Being
Table of Contents

Preambul
#

Beberapa saat lalu, saya membayangkan untuk punya alat digital yang dapat mengenkripsi file dan folder saya di komputer. Kemudian, saya coba cari di Google untuk memenuhi rasa penasaran tersebut. Ternyata, terdapat beberapa tools yang dapat saya gunakan untuk keperluan tersebut, salah satunya adalah gocryptfs.

gocryptfs adalah tool enkripsi berbasis file yang ditulis dengan bahasa pemrograman Go1. Berbeda dengan cryptsetup yang digunakan untuk mengenkripsi drive atau partisi, gocryptfs adalah tool yang dapat digunakan untuk mengenkripsi filesystem biasa di userspace (FUSE) yang juga dapat di-mount (mountable). Artinya, tool ini sangat cocok digunakan untuk mengenkripsi file-file yang ada di dalam folder manapun, baik di hardisk/SSD, di USB stick (flashdrive/flashdisk), bahkan remote filesystem seperti Dropbox.

Saya sempat menulis cara menggunakan cryptsetup untuk meng-enkripsi drive atau partisi:

Enrypting Disk in Linux using LUKS
··949 words·5 mins
A tutorial on how to encrypt disk/drive/partition in linux with cryptsetup.

gocryptfs vs Other Tools
#

Berikut adalah perbedaan utama antara cryptsetup dengan gocryptfs2:

Fiturcryptsetup/LUKSgocryptfs
LevelBlock deviceFile/folder
Encrypt seluruh diskYaTidak
Encrypt folder tertentuKurang cocokSangat cocok
Cocok untuk cloud syncTidakYa
Metadata tersembunyiSangat baikSebagian
Bisa boot OSYaTidak
PerformaLebih cepatSedikit lebih lambat
Teknologidm-crypt kernelFUSE userspace
Untuk perbandingan lebih lanjut, bisa merujuk ke tautan berikut:
https://wiki.archlinux.org/title/Data-at-rest_encryption#Comparison_table

Selain itu, gocryptfs sendiri sudah membuat perbandingan dengan beberapa tools enkripsi lainnya:3

Categorygocryptfs v1.7encfs v1.9.5ecryptfs v4.19.0cryptomator v1.4.6securefs v0.8.3CryFS v0.10.0
First release201520032006201420152015
LanguageGoC++CJavaC++C++
LicenseMITLGPLv3 / GPLv3GPLv2GPLv3MITLGPLv3
Development hotspotAustriaUSAUSA (RedHat)GermanyChinaGermany
LifecycleActiveMaintenanceActiveActiveActiveActive
File interfaceFUSEFUSEIn-kernel filesystemFUSE/WebDAVFUSEFUSE
PlatformsLinux, MacOS, 3rd-party Windows port cppcryptfs, 3rd-party Android port DroidFSLinux, MacOS, 3rd-party Windows portLinuxLinux, MacOS, WindowsLinux, MacOS, WindowsLinux, MacOS, Windows (experimental)
User interfaceCLI, 3rd-party GUI (SiriKali)CLI, 3rd-party GUIIntegrated in login processGUI, 3rd-party CLICLI, 3rd-party GUICLI, 3rd-party GUI (SiriKali)
Reverse ModeYes (since v1.1, read-only)Yes (limited write support)NoNoNoNo
Documentation availableYesYesNoYesYesYes
Password hashingscryptPBKDF2(none, implemented in external tool)scryptPBKDF2scrypt

How It Works
#

Kira-kira, beginilah diagram kerja gocryptfs dari sudut pandang penggunanya:

ss1
gocryptfs workflow diagram

Bentuk nyatanya di komputer saya:

ss2
gocryptfs workflow diagram on Archlinux

Kira-kira, beginilah cara kerjanya:4

  1. Ketika pertama kali menginisialisasi encrypted directory (direktori terenkripsi), kita akan diminta memasukkan password.
  2. Setelah berhasil meng-input-kan password, kita akan mendapatkan master key (berisi 64 digit karakter angka dan huruf random) alias KEK (Key Encryption Key).
  3. gocryptfs akan men-generate 2 file penting di dalam encrypted directory yang barusan kita inisialisasi:
  • gocryptfs.conf: berisi encrypted master key, salt (untuk password hashing), parameter scrypt, dan beberapa hal lain.
  • gocryptfs.diriv: file binary yang digunakan untuk mendekripsi nama file di satu direktori. Oleh karena itu, file ini akan ada di setiap sub-direktori di dalam encrypted directory.

Oleh karena itu, ke-empat hal tersebut (password, master key/KEK, gocryptfs.conf, dan gocryptfs.diriv) sangat penting sehingga harus dipastikan tidak hilang atau lupa.

Jika kita lupa password, file dan direktori masih dapat dideskripsi dengan master key/KEK, tapi jika master key juga hilang, maka file dan direktori tidak dapat didekripsi. File gocryptfs.conf juga penting karena menyimpan informasi mengenai metadata utama filesystem. Jika itu hilang, secara praktis, sudah hampir mustahil untuk recovery-nya, meskipun kita ingat password dan master key. gocryptfs.diriv diperlukan untuk mendekripsi nama file, jadi, kehilangan file tersebut berarti kita tidak dapat mendekripsi nama file yang ada di direktori tersebut.

Installation
#

Berikut adalah cara instalasinya di beberapa distro linux:5

DistroCommand
Debian/Ubuntusudo apt install -y gocryptfs
Arch Linuxsudo pacman -Sy gocryptfs
Fedorasudo dnf install gocryptfs
Opensusesudo zypper install gocryptfs

NixOS:
Masukkan baris berikut di file konfigurasi (/etc/nixos/configuration.nix):

  environment.systemPackages = [
    pkgs.gocryptfs
  ];

Atau jika menggunakan nix-shell:

nix-shell -p gocryptfs

Untuk memastikan gocryptfs sudah ter-install, kita bisa cek versinya dengan perintah:

gocryptfs --version

ss5
Checking gocryptfs version

Usage
#

Berikut adalah cara menggunakannya:

1. Create dirs
#

Buat 2 direktori utama:

  1. Direktori untuk menyimpan file normal
  2. Direktori untuk menyimpan file yang terenkripsi
mkdir encrypted open

2. Initialize dir
#

Inisialisasi direktori yang sudah ditentukan untuk menyimpan file yang terenkripsi.

gocryptfs -init encrypted

ss3
Creating and initializing gocryptfs filesystem & encrypted dir

Reminder!

Setelah selesai menginisialisasi direktori, kita akan diminta untuk meng-input-kan password. Setelah itu, gocryptfs juga akan men-generate master key (seperti “private key” dalam konsep asymmetric encryption). Pastikan kita menyimpan master key tersebut, karena master key tersebut tidak akan dapat didapatkan lagi dan akan berguna untuk membuka file dan direktori terenkripsi kita, terutama jika kita lupa password.

Perhatikan bahwa, di dalam direktori yang sudah kita inisialisasi (encrypted/), ter-generate 2 file:

  • gocrptfs.conf
  • goctypfs.diriv

Berikut adalah isi file gocryptfs.conf:

{
    "Creator": "gocryptfs v2.6.1",
    "EncryptedKey": "9ajKdvNPrr6+mqCxzGSWgGAF3zYT5Yn4FIJ/pmvprkMt3crLrKeG3Ktsk0FwMJRLjEtjjaH694l4nGObtUWh6Q==",
    "ScryptObject": {
        "Salt": "TFhGHlNzjrH1xvn82VsxuAzlGh20AZDFYb20EA4dvHw=",
        "N": 65536,
        "R": 8,
        "P": 1,
        "KeyLen": 32
    },
    "Version": 2,
    "FeatureFlags": [
        "HKDF",
        "GCMIV128",
        "DirIV",
        "EMENames",
        "LongNames",
        "Raw64"
    ]
}

Adapun file gocryptfs.diriv sendiri adalah file binary:

ss4
gocryptfs.diriv

3. Mounting
#

Berikutnya, kita perlu me-mounting direktori yang sudah diinisialisasi tadi (encrypted/) ke direktori filesystem (open/):

gocryptfs encrypted/ open/

Nanti kita akan diminta memasukkan password yang sudah kita buat sebelumnya, tinggal di-input-kan saja.

ss6
Mounting

4. Adding files
#

Sekarang, kita sudah bisa menambahkan file dan direktori di dalam direktori open/.

Perhatikan!

Direktori yang kita isi dengan file atau sub-direktori yang ingin dienkripsi adalah direktori yang tidak kita inisialisasi ya. Intinya, direktori yang di dalamnya ada 2 file “spesial” tadi, tidak perlu kita apa-apakan. Jadi, yang diisi/dihapus/diubah adalah direktori yang bebas kedua file “spesial” tersebut (dalam hal ini adalah direktori open/).

Berikut demonstrasi menambahkan dan menghapus file dan direktori/folder.

Perhatikan!

File dan direktori/folder yang kita tambahkan ke direktori open/ akan otomatis terenkripsi di file encrypted/, tidak hanya isi filenya saja yang dienkripsi, tetapi juga nama filenya. Selain itu, ketika kita menambahkan sub-direktori/sub-folder di direktori open/, maka direktori encrypted/ juga akan otomatis men-generate file .diriv di dalamnya.

5. Umounting
#

Jika sudah selesai, kita bisa meng-umount direktori filesystem tersebut (open/) dengan perintah:

fusermount -u open

ss7
Umounting

Karena direktori open/ hanya digunakan sebagai “mount point” untuk encrypted/, maka ketika sudah di-umount, direktori tersebut akan kembali seperti semula (kosong). Bahkan, kita dapat menghapusnya juga.

Yang tersisa hanyalah direktori encrypted/ yang semua file dan sub-direktorinya sudah terenkripsi, baik isinya maupun namanya. Tidak ada orang yang bisa mengetahui isi file-file tersebut (bahkan nama asli file-file-nya juga), kecuali mereka tau password-nya.

6. Re-mounting
#

Sama seperti proses mounting sebelumnya, kita hanya perlu sebuah direktori kosong sebagai “mount point”. Kemudian, untuk me-mounting, kita gunakan perintah yang sama.

mkdir newdir
gocryptfs encrypted/ newdir/

ss8
Re-mounting

7. Master Key
#

Jika kita lupa password, maka selagi masih memiliki master key, masih ada jalan untuk mendekripsi direktori dan file-file tersebut. Oleh karena itu, master key perlu dijaga dengan baik, sebab, jika kita lupa password dan master key-nya juga hilang, maka tamatlah riwayat kita, karena file-file dan direktori terenkripsi itu sudah tidak ada harapan lagi untuk bisa didekripsi.

Berikut adalah cara membuka (mendekripsi) menggunakan master key:

gocryptfs encrypted <mountpoint_dir> -masterkey=<64 digit master key> 

ss10
Decrypting with master key

Tapi, jika kita langsung meng-input-kan master key-nya langsung seperti itu, maka master key tersebut bisa saja dibaca via ps ax dan tersimpan di history shell. Oleh karena itu, ada cara yang lebih aman dan private untuk meng-input-kan master key, yaitu via stdin sebagai berikut:

gocryptfs encrypted <mountpoint_dir> -masterkey=stdin

Kemudian, nanti akan ada prompt yang meminta input master key, tinggal di-input-kan.

ss9
Decrypting with master key via stdin

Demikian.
Terima kasih sudah mampir.
Boleh tinggalkan komentar jika ada saran dan kritik ya!

Related

A Standard Unix Password Manager: Pass
Password management should be simple and follow Unix philosophy. With pass, each password lives inside of a gpg encrypted file.
Enrypting Disk in Linux using LUKS
··949 words·5 mins
A tutorial on how to encrypt disk/drive/partition in linux with cryptsetup.
Android Wireless Debugging: The Most Convenient Way to Connect to Your Android Device
··644 words·4 mins
Connecting your Android device through a USB is pretty mainstream. I will show you that you are actually able to connect it directly through wireless connection here.