方法一:cryptoloop
下載並編譯util-linux
http://www.paranoiacs.org/~sluskyb/hacks/util-linux/losetup-combined.patch
http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12.tar.gz
http://hydra.azilian.net/util-linux-2.12-kernel-2.6.patch
tar zxvf util-linux-2.12.tar.gz
cd util-linux-2.12
patch -p1 < ../losetup-combined.patch
patch -p1 < ../util-linux-2.12-kernel-2.6.patch
(如果有_syscall5之類編譯錯誤,將它換成新的調用方式syscall)
make;make install
編譯內核(已經支持cryptoloop則跳過此步)
make menuconfig
Device Drivers >Block Devices>Loopback device support
BLK_DEV_CRYPTOLOOP
加載模塊
modprobe cryptoloop
(以及加密模塊)
創建loop設備
dd if=/dev/zero of=~/cryptoloop.image bs=1M count=10
losetup -e aes-256 /dev/loop0 ~/cryptoloop.image
(提示輸入密碼)
創建文件系統並加載
mkfs.ext3 /dev/loop0
mkdir /mnt/crypto
mount -t ext3 ~/cryptoloop.image /mnt/crypto/ -oencryption=aes-256
(提示輸入密碼)
卸載
umount /mnt/crypto
losetup -d /dev/loop0
重新加載
losetup -e aes-256 /dev/loop0 ~/cryptoloop.image
mount -t ext3 ~/cryptoloop.image /mnt/crypto/ -oencryption=aes-256
cryptoloop的實現比較簡單,可以看看drivers/block/cryptoloop.c中的代碼。loop設備在讀寫之前會調用lo_do_transfer函數,該函數再調用所安裝的transfer插件。cryptoloop就是一種transfer的實現。至於使用哪種transfer及transfer的參數(如密碼),這可以通過LOOP_SET_STATUS64的ioctrl系統調用來完成(mount命令就是這樣實現的)。
cryptoloop的缺點是只能針對loop設備,而且對日志型文件系統無效。
方法二:device-mapper crypto
下載並編譯cryptsetup(已經有了就跳過)
wget http://www.saout.de/misc/dm-crypt/cryptsetup-0.1.tar.bz2
cd cryptsetup-0.1
./configure;make;make install
編譯內核(已經支持則跳過此步)
make menuconfig
Device Drivers > Multi-device support (RAID and LVM)
CONFIG_BLK_DEV_DM
CONFIG_DM_CRYPT
加載模塊
modprobe dm-crypt
(以及加密模塊)
創建loop設備
dd if=/dev/zero of=~/dm-crypt.image bs=1M count=10
losetup /dev/loop0 ~/dm-crypt.image
建立device-mapper
cryptsetup -y create dm-crypt /dev/loop0
(提示輸入密碼)
創建文件系統並加載
mkfs.ext3 /dev/mapper/dm-crypt
mount /dev/mapper/dm-crypt /mnt/crypto
卸載
umount /mnt/crypto/
cryptsetup remove dm-crypt
losetup -d /dev/loop0
重新加載
cryptsetup -y create dm-crypt /dev/loop0
mount /dev/mapper/dm-crypt /mnt/crypto
device-mapper crypto 的實現在drivers/md目錄下,相對來說要復雜得多,沒有來得及仔細閱讀。
方法三:ecryptfs
下載並編譯
http://people.redhat.com/~dhowells/keyutils/keyutils-1.2.tar.bz2
tar jxf keyutils-1.2.tar.bz2
cd keyutils-1.2
make;make install
tar jxf ecryptfs-20070306.tar.bz2
cd ecryptfs-20070306/ecryptfs-util
./configure;make;make install
編譯內核
make menuconfig
File systems>Miscellaneous filesystems
CONFIG_ECRYPT_FS
加載模塊
modprobe ecryptfs
(以及加密模塊)
加載
mkdir /root/crypt
mkdir /mnt/crypt
mount -t ecryptfs /root/crypt /mnt/crypt
(提示輸入密碼和算法)
卸載
umount /mnt/crypt
重新加載
mount -t ecryptfs /root/crypt /mnt/crypt
(提示輸入密碼和算法)
看來ecryptfs的特點是能夠對目錄進行加密,而不必加密整個磁盤。直接讀取原始目錄中的文件,只能讀到加密後的數據,要正確讀取數據,只有先把該目錄用ecryptfs文件系統格式加載到另外一個目錄,之後才能讀取。而在加載時要指定密碼和加密算法,這就起到保密作用。如果加載時指定錯誤的密碼或加密算法,仍然可以加載而不會出錯,但讀出的數據是無效的。
ecryptfs的代碼在fs/ecryptfs目錄下,只有比較新的kernel版本才有,我用的是linux-2.6.21。它的實現與前面兩種方法不同,它完全是按文件系統的方式來實現的。
以上幾種加密方法,在加載時都要輸入密碼,為了使用上的方便,可以與PAM+libpam-mount插件集成起來,用當前用戶的密碼作為加密的密碼,這樣就只需要在登錄時輸入一次就夠了。