使用C++挂载功能挂载加密

Mounting ecryptfs using C++ mount function

本文关键字:加密 功能 C++ 使用      更新时间:2023-10-16

我正在尝试从C++程序中挂载ecryptfs。我绝对可以通过在提示符下发出以下命令来安装它而不会提出问题:

sudo mount -t ecryptfs -o "rw,key=passphrase:passphrase_passwd=geoff,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=n,no_sig_cache" ~/source/ ~/target/

请注意,实际上,我正在传递一个完整的规范路径,以防万一。

但是从程序内部,我在尝试使用具有相同参数的mount()函数后errno=EINVAL失败:

mount("~/source/", "~/target/", "ecryptfs", MS_NODEV, "rw,key=passphrase:passphrase_passwd=geoff,ecryptfs_cipher=aes,ecryptfs_key_bytes=32,ecryptfs_passthrough=n,ecryptfs_enable_filename_crypto=n,no_sig_cache")

该程序确实以root权限启动,我已经检查了我是否CAP_SYS_ADMIN。

mount()函数返回-1并将errno设置为EINVAL

我的论点正确吗?这可能是特权问题吗?

编辑:我通过system()外部执行挂载来使其工作,但由于原因仍然想使用该功能。

我相信这是因为mount -t ecryptfs实际上是在调用辅助程序可执行文件mount.ecryptfs,并且它正在处理一些选项(特别是key=(本身。实际传递给内核的内容是不同的(您可以通过稍后查看/proc/mounts 来查看这一点(。

如果您仔细查看 https://manpages.ubuntu.com/manpages/kinetic/en/man7/ecryptfs.7.html,key=ecryptfs_enable_filename_crypto=列在"挂载帮助程序选项"下 - 实际内核模块的选项是ecryptfs_sig=(fekek_sig)ecryptfs_fnek_sig=(fnek_sig)

因此,如果您想绕过帮助程序并直接执行挂载,则需要使用 https://man7.org/linux/man-pages/man2/keyctl.2.html 将令牌加载到内核的密钥环中,并将 key= 替换为生成的令牌签名,就像 mount.ecryptfs 所做的那样。

看起来确实有一个 libecrytpfs 在 ecryptfs.h 中具有像ecryptfs_add_passphrase_key_to_keyring这样的功能,您可以(大概没有测试(使用它以与 mount.ecryptfs 匹配的方式执行此操作