我有一个加密文件,要解密它,我使用以下命令:
openssl aes-256-cbc -d -in encrypted_file -out unencrypted_file
但是当我这样做时,会创建一个未加密的文件,我必须在完成后删除它。这意味着如果有人拿到我的电脑并使用某种数据恢复工具,他们就可以获得未加密的文件。有没有办法在不创建另一个文件的情况下访问加密文件中的数据?
答案1
我假设您正在使用 Linux,并且有一些想法......
提取至 RAM
一种简单的方法是仍然创建解密文件,但不要将其写入磁盘。将其放入 RAM 中,例如内存文件系统或者临时文件文件系统。但是,问题可能是:
- 该文件可能不适合内存
- ramfs 的大小可能会增加,直到所有 RAM 都用完(随后可能会崩溃)
- 临时文件可能会写入磁盘交换(另请参阅该链接了解 tmpfs 和 ramfs 之间的区别)。
您的/tmp
或其他文件夹(如/run
,,/run/shm
)/run/user
可能已被挂载为 tmpfs,您可以使用 进行检查mount|grep tmpfs
。
创建新的临时文件您可以这样做(如果您愿意,可以选择以字节为单位的大小,类似于-o size=16384
,我认为它默认为 RAM 的一半):
sudo mount -v -t tmpfs tmpfs /mountpoint
要使用较旧的内存文件系统,不会被写入交换,但没有大小限制,这应该可以工作:
sudo mount -v -t ramfs ramfs /mountpoint
虽然链接在上面警告:
ramfs 文件系统的大小不能像基于磁盘的文件系统那样受到容量限制。ramfs 将继续使用内存存储,直到系统耗尽 RAM 并可能崩溃或无响应
还,内核文档在这里还警告说:
ramfs 的一个缺点是,您可以不断向其中写入数据,直到填满所有内存,而 VM 无法释放它,因为 VM 认为文件应该写入后备存储(而不是交换空间),但 ramfs 没有任何后备存储。因此,只有 root(或受信任的用户)才应被允许对 ramfs 挂载进行写访问。
A内存文件系统衍生品称为临时文件创建的目的是增加大小限制,以及将数据写入交换空间的能力。普通用户可以被允许对 tmpfs 挂载进行写访问。有关更多信息,请参阅 Documentation/filesystems/tmpfs.txt。
提取至加密设备或文件夹
如果上述 RAM 问题严重,你可以使用其他程序来加密磁盘上的文件再次,但可以“即时”读取和使用未加密的文件(例如,解密后的版本看起来和使用起来都像普通文件,但在磁盘上保持加密状态)。您可以使用 dm 创建加密分区或容器文件-crypt/LUKS/truecrypt 与 cryptsetup或加密文件夹加密文件系统或者加密文件系统,然后在那里解密您的文件。
例如,要创建一个 1GB 的 ext4 LUKS 容器文件,并将其挂载到文件夹
mountpoint-folder
,请执行以下操作:head -c 1G /dev/zero > 1G sudo cryptsetup -v luksFormat 1G sudo cryptsetup -v luksOpen 1G container sudo mkfs.ext4 -v /dev/mapper/container sudo mount -v /dev/mapper/container <mountpoint-folder>
然后将文件解密到
mountpont-folder
可读的位置,即使它再次以加密形式写入磁盘。eCryptFS 已经安装在 Linux Mint、Ubuntu 和许多其他发行版中,您可能只需要运行
ecryptfs-setup-private
然后使用创建的~/Private
文件夹。可能需要安装 EncFS(类似于
apt-get install encfs
),然后查看它的手册页在这里或者这里,像这样的命令encfs ~/.secret ~/decrypted
应该可以工作。此外,EncFS 还有一个巧妙的
--reverse
功能,即“将源纯文本数据作为源并根据需要生成加密数据。这对于创建远程加密备份非常有用,因为您不希望本地文件保持未加密状态。“
答案2
如果数据可以由接受来自 stdin 输入的程序处理,那么您也可以使用管道。例如:
openssl aes-256-cbc -d -in encrypted_plain_text_file | less