时间久远,我都忘了原理是什么了。 Linux 太过稳定, 有的事情做过一遍,很难有机会再做第二遍。 我只记录了操作。
首先安装 cryptsetup 包, 我用的是Debian, 因此用
apt-get install cryptsetup
安装。 我猜想RPM系统的Linux,应该也有类似包吧。
然后做一个加密的块设备,名为testfile,大小为10M:
dd if=/dev/urandom of=testfile bs=1M count=10
sudo losetup /dev/loop/0 testfile
sudo cryptsetup luksFormat /dev/loop/0
(enter the passphrase)
cryptsetup luksOpen /dev/loop/0 testfs
请牢记你输入的passphrase, 以后就靠它解密该设备了。 然后在块设备上创建文件系统:
mke2fs /dev/mapper/testfs
接下来就可以挂载设备了:
mount /dev/mapper/testfs /mnt/test
cp ~/my_secret.txt /mnt/test
挂载点是 /mnt/test , 然后你就可以往该目录写文件了。 文件其实上会写到 testfile 这个文件上去。 卸载之后, testfile 是加密的。
这是第一次操作,比较复杂些。 以后有了这个testfile文件, 无非就是写文件前mount 设备:
sudo modprobe dm_crypt
sudo losetup /dev/loop/0 testfile
sudo cryptsetup luksOpen /dev/loop/0 testfs
sudo mount /dev/mapper/testfs ~/aaa
编辑文件或复制文件:
vi ~aaa/my_secret.txt
cp certificate ~/aaa
操作完后, umount 设备:
sudo umount ~/aaa
sudo cryptsetup luksClose /dev/mapper/testfs
sudo losetup -d /dev/loop/0
testfile 看上去就是一个10M大小的文件,内容是看不出来的。
file testfile
testfile: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: 12815c58-43ee-4b65-b0db-c1387c9
为了方便使用, 我写了一个脚本, 用法是 encrypt.sh on 就是挂载,输入创建设备时的passphrase; encrypt.sh off 就是卸载。 请根据需要修改其中的FILE, DEVICE, MOUNT变量。
#! /bin/sh
#
# convenient script to (un)mount an encrypted file
# Dai Yuwen, June 16, 2007
#
FILE=~/secret
DEVICE=secret
MOUNT=~/mnt
LOOP=/dev/loop0
usage ()
{
echo "Usage: `basename $0` <on>|<off>"
}
if [ $# -lt 1 ]; then
usage
exit 1
fi
case $1 in
on)
sudo losetup $LOOP $FILE && \
sudo cryptsetup luksOpen $LOOP $DEVICE && \
if sudo mount /dev/mapper/$DEVICE $MOUNT; then echo $FILE mounted on $MOUNT ; fi
;;
off)
sudo umount $MOUNT && \
sudo cryptsetup luksClose /dev/mapper/$DEVICE && \
sudo losetup -d $LOOP
;;
*)
usage
exit 1
;;
esac
注意, 在加密设备挂载期间, 它的内容是可见的。 因此要注意挂载点的权限,如果此时系统里有另外一个用户,如果挂载点有被他可读的权限, 他可以看到文件的内容! 要把挂载点设成只对本人可读、可写、可执行。