我在启动 Debian Linux 服务器时遇到问题。系统更新后,GRUB 加载 initrd 并且系统应该要求输入密码,但它没有。相反,我被放到了 BusyBox。尝试使用 手动挂载加密卷后cryptsetup luksOpen,出现此错误:
device-mapper: table: 254:0: crypt: Error allocating crypto tfm
device-mapper: reload ioctl failed: Invalid argument
Failed to setup dm-crypt key mapping for device /dev/sda3
Check that the kernel supports aes-cbc-essiv:sha256 cipher (check syslog for more info).
Run Code Online (Sandbox Code Playgroud)
我想使用 cryptsetup 对具有 ext4 文件系统的容器中的目录内容进行加密。容器的大小应该尽可能小,必要时尽可能大,因为我只想写一次然后备份。
首先尝试:将容器的大小设置为内容的大小。
dirsize=$(du -s -B512 "$dir" | cut -f 1)
dd if=/dev/zero of=$container count=$dirsize
losetup /dev/loop0 $container
fdisk /dev/loop0 # 1 Partition with max possible size
cryptsetup luksFormat --key-file $keyFile /dev/loop0
cryptsetup luksOpen --key-file $keyFile /dev/loop0 container
mkfs.ext4 -j /dev/mapper/container
mkdir /mnt/container
mount /dev/mapper/container /mnt/container
rsync -r "$dir" /mnt/container
Run Code Online (Sandbox Code Playgroud)
Rsync 返回没有足够的空间来容纳数据。看起来很合理,因为加密和文件系统必须有一些开销。
我尝试使用相对偏移量:
dirsize=$(($dirsize + ($dirsize + 8)/9))
Run Code Online (Sandbox Code Playgroud)
这可以解决大于 100 MB 的目录的问题,但不能解决小于 50 MB 的目录的问题。
如何确定容器必须比目录大的相应字节数?
我正在使用cryptsetup分离的标头。为此,我使用--header 参数来指定头文件。我可以使用以下方式打开我的设备:
cryptsetup luksOpen /dev/sdb1 sdb1 --header LUKS-HEADER
Run Code Online (Sandbox Code Playgroud)
但我需要提供标头,而不是作为文件,而是作为另一个命令的输出(我cat在这里使用命令进行说明)
cryptsetup luksOpen /dev/sdb1 sdb1 --header <(cat LUKS-HEADER)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我收到以下错误:
Attaching loopback device failed (loop device with autoclear flag is required).
Run Code Online (Sandbox Code Playgroud)
这很令人困惑,因为类似的方法适用于提供密钥,即
cryptsetup luksOpen /dev/sdb1 sdb1 --header LUKS-HEADER --key-file <(printf asdf)
Run Code Online (Sandbox Code Playgroud)
上面的命令工作正常(我使用“asdf”作为示例密码)。
如何--header从管道/另一个进程向选项提供参数?
赏金更新:
接受的答案有效,即我可以使用:
cat LUKS-HEADER > /dev/ram0
cryptsetup luksDump /dev/ram0
Run Code Online (Sandbox Code Playgroud)
但是,我需要一个如何使用进程替换的解决方案,即。目前,进程替换不起作用:
cryptsetup luksDump <(cat LUKS-HEADER)
Run Code Online (Sandbox Code Playgroud)
它给出了错误:
Attaching loopback device failed (loop device with autoclear flag is required).
Run Code Online (Sandbox Code Playgroud) 总结:我可以cryptsetup benchmark对结果进行运行和排序,但在解释时寻求指导。例如,我应该更重视加密速度还是解密速度?密钥派生速度是否应该覆盖?我的用例应该如何影响我如何衡量/解释结果?
感谢指向文档的指针:我已经进行了网络搜索,但没有看到任何明确的外观。特别是,这似乎不是
cryptsetup常见问题解答细节:
我准备在 2007 年左右的笔记本电脑上重新安装操作系统(因此大概没有处理器支持 AES),这次是使用 LUKS+LVM2。(这是我剩下的一个盒子Plain Old Partitions。)我没有时间运行序列的几个循环[安装 LUKS+LVM2+OS,运行一个真正的磁盘基准测试,测量结果],尽管这显然会提供更多的经验指导。相反,我试图选择一个合理的(甚至是最佳的 :-) LUKS 密码规范字符串“cryptsetup benchmark预先”使用,尽管我知道“无法直接预测真实的存储加密速度”[2]。
当此框运行时,sudo cryptsetup benchmark它会输出(在调整以标记和分离问题并按速度降低排序后):
# key derivation:
PBKDF2-sha1 557753 iterations per second
PBKDF2-sha256 356173 iterations per second
PBKDF2-ripemd160 336082 iterations per second
PBKDF2-sha512 256000 iterations per second
PBKDF2-whirlpool 112219 iterations per second
# encryption:
# Algorithm | Key | Encryption
serpent-xts 512b 144.7 MiB/s
serpent-xts 256b 144.0 MiB/s
twofish-xts 256b …Run Code Online (Sandbox Code Playgroud) 我目前正在为一位朋友从笔记本电脑中取出的内部硬盘恢复一些数据,并使用 LUKS 进行加密。他们无法告诉我更多其他信息,因为其他人为他们加密了它,但他们确实知道密码,而且它运行的是 Linux 操作系统。我希望解密数据,然后将其恢复到第二个 USB 设备上。
我使用以下命令来解密它:-
losetup /dev/loop1 /mnt/hdd #hdd being the encrypted disk
mmls /mnt/hdd #just to check it has mounted
Run Code Online (Sandbox Code Playgroud)
退货:-
DOS Partition table
Offset Sector: 0
000 .... Primary Table
001 .... Unallocated
002 .... Linux
003 .... Linux
004 .... Unallocated
kpartx -a /dev/loop1
kpartx -l /dev/loop1
Run Code Online (Sandbox Code Playgroud)
返回:
loop1p1: 0 1024000 /dev/loop1 2048
loop1p2: 0 624115712 /dev/loop1 1026048
Run Code Online (Sandbox Code Playgroud)
然后我输入命令:
cryptsetup luksOpen /dev/mapper/loop1ps decrypted-directory --verbose
Run Code Online (Sandbox Code Playgroud)
我输入密码
Key slot 1 unlocked
Run Code Online (Sandbox Code Playgroud)
然后它挂起,没有进一步的输出。根据我的阅读,它应该在控制台上打印“命令成功”,但这似乎没有发生。我也将其放置了 12 个多小时,以防这是解密过程。
我认为这不是解密过程,因为我认为会有一些详细的日志记录到终端?
有一天,当我打开计算机时,我的 home 部分 /dev/sda7 的密码不起作用(我 147% 绝对确定,我写的是正确的密码)!经过三次尝试,我通过强制关机重新启动计算机并尝试输入相同的密码。那没有用。然后,我选择了“Boot arch with Linux linux”,而不是默认引导“Boot arch”。这对我有帮助。我关掉电脑后工作了一整天。但在下次启动时,这个技巧对我没有帮助。甚至选择“Boot arch with Linux linux (initramfs Fallback)”(我只有 3 个启动选项)。然后我决定从 Ubuntu LiveUSB 启动。sudo cryptsetup luksOpen /dev/sda7 home说:No key available with this passphrase.
我已经尝试执行了sudo cryptsetup --verbose repair /dev/sda7,上面说的No known problems detected for LUKS header.。我已经编译并执行了官方 cryptsetup 工具https://gitlab.com/cryptsetup/cryptsetup/tree/master/misc/keyslot_checker用于检查密钥槽。它说了有关键槽的相同信息,即 luksDump。
$ sudo cryptsetup
LUKS header information for /dev/sda7
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 256 …Run Code Online (Sandbox Code Playgroud) 我希望cryptsetup提示我输入密码,但它只是尝试打开密钥文件但失败:
sudo cryptsetup luksFormat test.img cryptsetup-test
WARNING!
========
This will overwrite data on test.img irrevocably.
Are you sure? (Type uppercase yes): YES
Failed to open key file.
Run Code Online (Sandbox Code Playgroud) 我正在使用带有加密 luks 根分区(未加密启动)的 arch linux,还带有密码。现在我有一个密钥文件(3072 字节),它以这种方式写入 USB 棒:
sudo dd if=tempKeyFile.bin of=/dev/sdd bs=512 seek=1 count=6
并设置为附加通行证
sudo cryptsetup luksAddKey /dev/sdb6 tempKeyFile.bin
当我手动打开磁盘分区:
sudo cryptsetup --key-file tempKeyFile.bin open /dev/sdb6 luks_root
一切正常,分区已映射并可挂载。现在我的内核参数行grub.cfg看起来像这样:
linux /vmlinuz-linux root=UUID=$UUID_OF_luks_root$ rw cryptdevice=UUID=$UUID_OF_sdb6$:luks_root cryptkey=/dev/sdd:1:6
但启动时,我得到这个错误:
No key available with this passphrase.
Invalid Keyfile. Reverting to passphrase.
我已经尝试过偏移 2 而不是 1,但结果相同。我注意到它没有说无法找到/读取密钥文件,但不正确。
关于这种存储 luks 密钥文件的方式似乎很少有文档。Arch-wiki 提到了它,但非常简短,我似乎很符合,所以我认为应该是可能的。
在我的mkinitcpio.conf模块中,二进制文件和文件是空的,我设置:
HOOKS=(base udev autodetect keyboard modconf block encrypt filesystems fsck)
所以块加密之前。
这里有什么问题?
我使用的是最新的 OpenSUSE Tumbleweed,但本指南对我不起作用。
除了我没有生成新的随机密钥并将其添加到硬盘中,而是使用了我一直使用的密码并将其写入/.root.key.
但是我仍然被要求输入密码,但它似乎是 cryptsetup 或任何足够聪明的东西,可以自动为我所有其他也使用与 SSD 相同密码的 HDD 尝试它。所以我必须为 Grub 输入它,然后我再次被要求在启动过程中再次解锁 SSD。
如何查看是否/.root.key已添加到 initramfs 中?
根据cryptsetup(8) 手册页,LUKS2 卷的扇区大小可以配置为--sector-size:
设置用于磁盘加密的扇区大小。它必须是 2 的幂并且范围在 512 - 4096 字节内。默认为 512 字节扇区。此选项仅在 LUKS2 模式下可用...将扇区大小从 512 字节增加到 4096 字节可以在大多数现代存储设备以及某些硬件加密加速器上提供更好的性能。
出于兼容性原因,保留了 512 字节的默认扇区大小。根据cryptsetup 2.0.0 的发行说明,扇区大小存储在元数据中,以后无法更改。因此,将我现有的 LUKS2 卷迁移到 4K 扇区将非常耗时。
4K 扇区对 SSD 存储的 LUKS2 性能提高了多少?哪种加密硬件最能利用 4K 扇区?
cryptsetup ×10
luks ×5
dm-crypt ×3
encryption ×3
linux ×2
arch-linux ×1
benchmark ×1
block-device ×1
boot ×1
ext4 ×1
grub2 ×1
initramfs ×1
kernel ×1
loop-device ×1
opensuse ×1
pipe ×1