使用C++挂载功能挂载加密
Mounting ecryptfs using C++ mount function
我正在尝试从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 匹配的方式执行此操作
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- AES加密到解密未正确输出
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 使用C++挂载功能挂载加密
- 在加密加密功能期间崩溃
- 简单的C++字符数组加密功能 - 段故障
- 解密 AES 加密文件,导致崩溃的功能
- C++中的加密功能
- 基于InDev位的加密程序中的可视化未知c++堆损坏,c++编程的新功能