假设我有一个文件"hello.txt",其中包含文本"hello,world!"我有一个应用程序"textreader",它读取文件hello.txt并将其放入stdout。接下来,我对文件"hello.txt"进行了加密。可以通过一个特殊的库对其进行解密,该库可以逐字节读取文件。
如何使用应用程序"textreader"将加密文件作为普通文件读取,使用我的库(或应用程序)?根据这个问题的条件,我不能写一些临时文件。
可以使用命名管道(mkfifo),但前提条件是寻求支持。文件必须随机读取。
如果我没有"文本阅读器"的源代码,有人知道我该怎么做吗?
编写一个替换标准Linux I/O例程的共享库,并用LD_PRELOAD加载它。
如果应用程序动态链接到C库,这将起作用——如果"textreader"直接进行系统调用,那么拦截将不起作用。
另请参阅:
- http://www.linuxjournal.com/article/7795
- http://lca2009.linux.org.au/slides/172.pdf
通常这是使用文件系统过滤器驱动程序来完成的,该驱动程序将动态执行解密。为了支持随机搜索,你必须在独立的块(64-256Kb大)中加密数据,并以解密的形式将这些块缓存在内存中。这不是一项琐碎的任务,但可以完成。我不知道如何在Linux上实现过滤器驱动程序(我们为Windows提供了类似的产品)。
简单地使用stdin怎么样?
如果textreader应用程序将hello.txt
转换为stdout,只需将textreader的输出通过管道传输到您自己的应用程序/脚本即可。例如:
$ ./textreader | ./myapp
根据您决定在应用程序中使用的语言,您可以像处理大多数流一样处理stdin。
以下SO答案应该会为您提供更多关于如何用不同语言从stdin读取的信息:
- Python:如何在Python中读取stdin
- C++:如何从C中的cin读取EOF++
- PHP:使用php://stdinI/O流
维基百科还提供了一些关于stdin的有用信息。
编辑:正如您最初询问的那样,大多数流都是可查找的。我用C++写了一个小例子,展示了如何查找stdin
。
#include <iostream>
int main(void) {
int i = 0;
std::string buffer;
while (not std::cin.eof()) {
std::getline(std::cin, buffer);
if (buffer.find("while") != std::string::npos)
if (i < 10)
std::cin.seekg(0, std::ios::beg);
else
std::cin.seekg(0, std::ios::end);
std::cout << "Line " << i++ << ": " << buffer << std::endl;
}
return 0;
}
您可以使用g++ test.cpp -o test
编译代码,然后使用./test < test.cpp
运行它。代码将两次输出文件的开头,直到while循环的开头。除了一次从stdin
读取一行之外,不进行任何缓冲。
在内存中加载加密文件并从内存缓冲区解密如何?一些脚本语言,如perl、python等,可以读取整个文件并将其分配给变量