我尝试使用以下命令删除主目录上的 LUKS 加密:
cryptsetup luksRemoveKey /dev/mapper/luks-3fd5-235-26-2625-2456f-4353fgdgd
但它给了我一个错误:
设备 /dev/mapper/luks-3fd5-235-26-2625-2456f-4353fgdgd 不是有效的 LUKS 设备。
很困惑,我尝试了以下方法:
cryptsetup status luks-3fd5-235-26-2625-2456f-4353fgdgd
它说:
/dev/mapper/luks-3fd5-235-26-2625-2456f-4353fgdgd is active and is in use.
type: LUKS1
cipher: ...
加密设备似乎处于活动状态,但无效。这里可能出了什么问题?
答案1
2013 年的答案 - 查看其他答案,了解快乐时光
- 备份
- 重新格式化
- 恢复
cryptsetup luksRemoveKey
仅当您有多个加密密钥时才会删除该加密密钥。加密仍然存在。
软呢帽安装指南C.5.3 节解释了如何luksRemoveKey
工作。
在保留内容的同时删除加密是“不可能的”,这只是一个有根据的猜测。我基于两件事:
- 因为 LUKS 容器有文件系统或 LVM 或任何最重要的是,仅仅删除加密层就需要了解意义存储在其上的数据的数据,这是根本不可用的。另外,一个要求是用解密后的副本覆盖 LUKS 卷的一部分,不会破坏 LUKS 内容的其余部分,我不确定是否可以做到这一点。
- 实现它会解决一个与 LUKS 的目的相去甚远的问题,而且我发现不太可能有人会花时间去做这件事,而不是做一些更“有意义”的事情。
答案2
删除键槽就像忘记密码一样,与通过其中的文件系统移动替换 LUKS 设备无关。
您可以非破坏性地从设备中删除 LUKS 加密,而无需备份、重新格式化和恢复。 cryptsetup
自 2012 年发布的 1.5.0 版本起就支持此功能。
成功解密 LUKS 设备后,其中的文件系统可供操作系统使用,您可以直接挂载它。
警告:这很危险,请先备份所有数据。
对于 LUKS1:
- 从 USB 闪存盘启动
- 使用
cryptsetup-reencrypt --decrypt <device_path>
对于 LUKS2:
- 从 USB 闪存盘启动
- 转换所有键槽以使用 LUKS1 兼容参数
cryptsetup luksChangeKey --pbkdf pbkdf2 <device_path>
- 使用以下命令将 LUKS2 设备转换为 LUKS1 设备
cryptsetup convert --type luks1 <device_path>
- 使用执行解密
cryptsetup-reencrypt --decrypt <device_path>
我已经测试了这两个并且它们有效。
当前版本声称cryptsetup
支持 LUKS2 设备的直接解密。命令是
cryptsetup --reencrypt --decrypt --header HEADER_FILE <device_path>
该--header
参数是必需的,因为这些命令假定您的设备使用分离的标头。如果你这样做了,它就可以工作,甚至可以在线解密。如果您不使用分离的标头(很常见),并且您尝试提供标头转储,或者将块设备本身作为值传递--header
,cryptsetup
则会安静地继续,当它完成时,您最终会得到没有键槽的 LUKS2 设备,您的数据将会消失。
这是从版本 2.3.3 (2020) 开始的,在未来的版本中可能会发生变化。
我的建议是使用更安全的 LUKS2->LUKS1->Decrypt 路径,我可以确认该路径可以完成工作。
答案3
首先,当从 LUKS 分区中删除密码时,您需要指定它所在的磁盘分区,例如:
cryptsetup luksRemoveKey /dev/sda2
当您需要 LUKS 加密设备的状态时,您需要像您一样引用 LUKS 名称。
但 luksRemoveKey 仅删除其中一个密码(而不是最后一个)。如果你想永久解密,你必须使用 cryptsetup-reencrypt:
cryptsetup-reencrypt --decrypt /dev/sda2
答案4
添加到陈涉的回答,Ubuntu18.04 的默认cryptsetup
软件包是 2.0.2,有一个错误,如果 Luks 格式设备的第一个活动密钥槽不为零,则退出解密命令并返回代码 1(参考这里)但它已经被修补,正如所附论坛链接中的下一条评论所提到的。
因此,您可能需要从来源来自gitlab为了使其能够与您的加密系统一起使用。请注意,从 2.6.0 版本开始,解密设备的命令已更改为cryptsetup reencrypt <device-name> --decrypt