介紹如何在 Linux 系統中使用 Cryptsetup 與 LUKS2 格式加密 USB 隨身碟,保護機密資料不外洩。
確認 USB 隨身碟設備檔
將 USB 隨身碟插入 Linux 系統的電腦中。

使用 lsblk 指令確認 USB 隨身碟在 Linux 系統中的設備路徑:
# 查看所有 block device
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 1 0B 0 disk sdb 8:16 1 0B 0 disk sdc 8:32 1 28.9G 0 disk nvme0n1 259:0 0 476.9G 0 disk ├─nvme0n1p1 259:1 0 260M 0 part /boot/efi ├─nvme0n1p2 259:2 0 16M 0 part ├─nvme0n1p3 259:3 0 195.3G 0 part ├─nvme0n1p4 259:4 0 1.1G 0 part ├─nvme0n1p5 259:5 0 200M 0 part ├─nvme0n1p6 259:6 0 279.1G 0 part / └─nvme0n1p7 259:7 0 977M 0 part [SWAP]
通常從磁碟的大小就可以判別 USB 隨身碟的設備是那一個,以這裡的例子來說,我們的 USB 隨身碟容量是 32GB,所以對應的設備是 /dev/sdc。
另外也可以查看 dmesg 的訊息來判斷 USB 隨身碟的設備:
# 查看 dmesg 訊息
dmesg
[ 2751.533819] usb 4-2: new SuperSpeed USB device number 18 using xhci_hcd [ 2751.555333] usb 4-2: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.10 [ 2751.555343] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2751.555347] usb 4-2: Product: DataTraveler 3.0 [ 2751.555349] usb 4-2: Manufacturer: Kingston [ 2751.555351] usb 4-2: SerialNumber: AC220B280C83E2A1D93291BF [ 2751.558337] usb-storage 4-2:1.0: USB Mass Storage device detected [ 2751.558610] scsi host2: usb-storage 4-2:1.0 [ 2752.582880] scsi 2:0:0:0: Direct-Access Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6 [ 2752.583478] sd 2:0:0:0: Attached scsi generic sg2 type 0 [ 2752.583721] sd 2:0:0:0: [sdc] 60604416 512-byte logical blocks: (31.0 GB/28.9 GiB) [ 2752.584052] sd 2:0:0:0: [sdc] Write Protect is off [ 2752.584058] sd 2:0:0:0: [sdc] Mode Sense: 45 00 00 00 [ 2752.584321] sd 2:0:0:0: [sdc] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 2752.749311] sd 2:0:0:0: [sdc] Attached SCSI removable disk
格式化 USB 隨身碟
確認 USB 隨身碟的設備檔之後,以 Cryptsetup 在 USB 隨身碟中建立一個 LUKS2 container,若系統上沒有 cryptsetup 指令,可以先使用 apt 安裝:
# 安裝 cryptsetup 套件
sudo apt install cryptsetup
使用 cryptsetup 的 luksFormat 指令建立 LUKS2 container,這個動作會抹除 USB 隨身碟中所有的資料,所以要先確認 USB 隨身碟中沒有重要資料,確認沒問題後,輸入大寫的 YES 執行:
# 在 /dev/sdc 磁碟中建立 LUKS2 container sudo cryptsetup -v -y --type luks2 luksFormat /dev/sdc
WARNING! ======== This will overwrite data on /dev/sdc irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sdc: Verify passphrase: Key slot 0 created. Command successful.
建立好 LUKS2 加密磁碟之後,我們可以使用 cryptsetup 的 luksDump 指令查看磁碟內的 LUKS 標頭資訊:
# 查看 /dev/sdc 磁碟中的 LUKS 標頭資訊
sudo cryptsetup luksDump /dev/sdc
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: e1e5d761-5dc7-4c5e-b2c4-4117a950adba
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: 16777216 [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2id
Time cost: 5
Memory: 1048576
Threads: 4
Salt: ad e2 72 02 eb 9f 43 70 5d b0 fd 5a b8 d0 67 35
77 58 5c 8b bd 54 1b ab 58 5c 6c 3b f7 89 40 d7
AF stripes: 4000
AF hash: sha256
Area offset:32768 [bytes]
Area length:258048 [bytes]
Digest ID: 0
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 230760
Salt: a6 22 af 15 92 d6 04 ab c3 c0 29 7a 0a 86 db 64
40 bb eb 7d 3e 66 a8 fc 49 30 c0 15 c2 84 73 63
Digest: 52 da a7 da 32 fc 18 bd bc cd f5 59 75 60 d8 d9
19 64 e8 cc 73 88 d4 75 85 7c 5c 00 5c 9a 65 8e
接著使用 cryptsetup 的 open 指令開啟加密磁碟,並且建立一個映射檔:
# 開啟加密磁碟,建立映射檔 sudo cryptsetup open --type luks /dev/sdc encUSBDisk
Enter passphrase for /dev/sdc:
開啟機磁碟時,要輸入密碼,密碼正確才能開啟加密磁碟。
接著以 dd 指令進行 USB 隨身碟的完整格式化(若不在意被外界偷看磁碟的使用狀況,也可以省略這一步驟):
# 完整磁碟格式化 sudo dd if=/dev/zero of=/dev/mapper/encUSBDisk bs=128M status=progress
使用 mkfs.ext4 指令在 USB 加密磁碟建立 Ext4 檔案系統:
# 在加密磁碟上建立 Ext4 檔案系統
sudo mkfs.ext4 /dev/mapper/encUSBDisk
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 7571456 4k blocks and 1893120 inodes
Filesystem UUID: 67420f69-1688-4f6e-a628-6447b323c7c2
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
最後建立掛載目錄,掛載加密的 USB 隨身碟:
# 建立掛載目錄 sudo mkdir /mnt/encUSBDisk # 掛載加密 USB 隨身碟 sudo mount /dev/mapper/encUSBDisk /mnt/encUSBDisk
透過 df 指令確認機的隨身碟是否有正常掛載:
# 檢查磁碟掛載狀況 df -h
檔案系統 容量 已用 可用 已用% 掛載點 udev 3.7G 0 3.7G 0% /dev tmpfs 764M 1.9M 762M 1% /run /dev/nvme0n1p6 274G 26G 235G 10% / tmpfs 3.8G 123M 3.7G 4% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/nvme0n1p1 256M 52M 205M 21% /boot/efi tmpfs 764M 92K 764M 1% /run/user/1000 /dev/mapper/encUSBDisk 29G 24K 27G 1% /mnt/encUSBDisk
由於 Ext4 檔案系統有支援使用者與群組權限,我們可以將其擁有者更改為自己平常用的使用者與群組,使用上會比較方便:
# 更改 USB 加密磁碟擁有者
sudo chown myuser:mygroup /mnt/encUSBDisk
確認加密的隨身碟可以正常使用後,可以使用以下指令卸載:
# 卸載加密磁碟 sudo umount /mnt/encUSBDisk # 關閉加密磁碟 sudo cryptsetup close encUSBDisk
桌面環境使用加密 USB 隨身碟
以 LUKS2 加密的 USB 隨身碟在一般的 Linux 桌面環境中通常都會被自動偵測出來,在掛載時只要輸入密碼,就可以像一般的 USB 隨身碟一樣掛載使用,相當方便。

檢查碼
在加密檔案系統中,複製或搬移重要的資料時,建議都以 MD5 或 SHA1 檢查碼進行檢查,避免資料因為硬體問題而損毀。
# 計算所有目錄與子目錄下每個檔案的 MD5 檢查碼(複製檔案前) find . -type f -exec md5sum \{\} \; > md5sum.txt # 驗證 MD5 檢查碼(複製檔案後) md5sum -c md5sum.txt

