Linux上使用cryptsetup对磁盘、U盘等设备进行加密/解密
Linux上使用cryptsetup对磁盘、U盘等设备进行加密/解密
最近丢了一个U盘,好在里面没什么重要信息。有时候我会用U盘备份一些文件,包括ssh密钥文件。如果有一天装有自己密钥文件的U盘丢失,被人捡到的话,会非常不安全。因此简单研究了下磁盘的加密操作,在此记录一下。虽然加密、解密增加了使用U盘的复杂性,但是如果真的有一些文件,使用互联网备份怕泄漏的,还是需要一些加密手段来保护的。这里只试了在Linux下的操作,基于cryptsetup命令行工具。
前言
Linux从Linux kernel 2.6开始就已经集成了dm-crypt功能,cryptsetup是一个命令行工具,可以基于内核的dm-crypt,对磁盘进行加密。本文使用的Archlinux,其他发行版也差不多。 Linux的dm-crypt功能,支持多种加密模式:LUKS(Linux Unified Key Setup), Plain, Loop-AES, TCrypt. 本文只使用了LUKS,如需其他方式,可以参考官方文档。
本文的下述操作,需要对Linux的磁盘管理、分区有基本了解,并且会使用mkfs.ext4等分区格式化命令,且知晓该行为的影响。
安装
在大多数的发行版中,安装完一般已经有了cryptsetup这个命令,如果没有,可以使用发行版自带的包管理器安装 安装完之后,使用如下命令查看工具版本:
cryptsetup --version
使用如下命令,可以查看在本机器上的性能指标,因为使用不同的方式进行加密,对计算的要求不同
cryptsetup benchmark
要使用其他功能,参考官方文档。
日常加密/解密使用
创建加密盘
使用LUKS加密模式,新建一个加密盘,该命令会覆盖原有数据,进行格式化。需要在root/sudo下执行命令:
cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/sdax
--key-size表示密钥长度,--hash 使用sha512哈希散列算法,--iter-time 迭代时间,单位毫秒。时间越长,越难进行暴力破解。具体的原理,含义,就不在这里解释了。
会输出:
WARNING!
========
This will overwrite data on /dev/sdc1 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sdc1:
上面需要输入大写的YES,然后输入加密用的密码(非电脑密码) 完成上面命令后,就新建了一个加密盘,下面需要打开这个加密盘,并新建分区,才能进行文件的读写。
打开加密盘
使用如下命令(root):
cryptsetup open --type luks /dev/sdb1 sdb1
或者:
cryptsetup luksOpen /dev/sdb1 test
其中,/dev/sdb1替换为你的U盘对应的实际分区,test随意,是一个别名 解密需要输入你前面设置的加密密码,当执行完上面的操作后,原本的分区/dev/sdb1,会被映射到/dev/mapper/test,在这之后,把/dev/mapper/test当作你的分区,不要使用/dev/sdb1了。
创建LUKS的加密分区(格式化)
只完成前面操作的话,只是有了一个加密的磁盘,但要读写文件,还得有分区,格式化一个文件系统,像正常的U盘初始化过程。
创建文件系统
跟正常U盘一样的操作,唯一不同的就是,要使用/dev/mapper/test,忘掉/dev/sdb1 如下,创建一个exfat文件系统类型的分区(一般是fat32):
mkfs.exfat /dev/mapper/test
挂载分区
可以自行创建一个挂载点,使用如下命令进行挂载:
mount /dev/mapper/test /mnt
之后的所有操作就跟正常U盘一样了。
推出磁盘
使用完后,先按照正常步骤,进行umount:
umount /mnt
然后关闭加密盘即可
cryptsetup close /dev/sdb1
以上,实现了基于密码的加密方式,但是如果密码设置的比较简单,或者忘记密码了,还是比较麻烦的。
cryptsetup还支持使用keyfile进行加密。keyfile就是使用一个文件,作为加密解密用的“密码”,如果文件比较复杂,比如是一个图片文件、视频文件等,那么被暴力破解的可能性就很低,比单纯的密码要安全得多。
下面介绍,如果想要使用文件,作为密钥加密的方式
使用keyfile文件加密
如果已有一个复杂文件,可以跳过这步。使用以下命令新建一个大小为64KB的随机文件:
dd if=/dev/urandom of=./keyfile bs=1k count=64
Keyslot查看
使用如下命令,可以查看当前磁盘,使用的加密方式
cryptsetup luksDump /dev/sdb1
开头Keyslot的就是前面已经建立的加密手段,每个Keyslot相当于一个钥匙,可以同时有多个“钥匙”进行加密。每个Keyslot有一个编号,从0-7。
添加keyfile密钥
开始给磁盘添加一种加密手段,指定某个文件作为keyfile,并设置为LUKS加密盘的密钥
cryptsetup luksAddKey /dev/sdb1 ./keyfile
然后再使用luksDump命令看下,会看到多了一个KeySlot
使用keyfile打开LUKS加密盘
cryptsetup --key-file ./keyfile luksOpen /dev/sdb1 test
删除一个Keyslot
cryptsetup luksKillSlot /dev/sdb1 0
这里0 是指你想要删掉的那个keyslot编号