使用C++加密存储到磁盘的对象(适用于Java开发人员)

gav*_*gav 1 c++ encryption serialization caching

这是两个问题,但对C++开发人员来说无疑是微不足道的.

  1. 如何对一个对象进行seralize以便我可以将它写入磁盘并稍后在C++中检索它,或者如果这是错误的关键字,我如何将对象写为二进制流并在以后重新创建它?我可以使用继承来创建可序列化的类的层次结构吗?
  2. 考虑到我有加密密钥,加密/解密二进制数据流的最简单方法是什么?

    const vector&encryption_key

这是一个概念证明,因此加密的强度或可靠性不如简单易懂的代码重要.

我可以根据需要扩展问题的任何一部分,因为您可能已经猜到我需要将一些数据保存到文件中的硬盘中,然后在另一次运行的应用程序中检索它,文件很大,这是我的方式缓存通过网络检索的数据.

谢谢,

GAV

Man*_*uel 8

Boost.Serialization可能是在C++中执行此操作的最佳选择.如果要保存二进制数据,则需要创建boost::archive::binary_oarchive并将其与文件关联:

std::ofstream ofs("my_file.dat");
boost::archive::binary_oarchive oarch(ofs);
Run Code Online (Sandbox Code Playgroud)

您要序列化的任何类都必须具有成员函数serialize,该函数具有库可以理解的特殊签名.例如:

class Foo
{
   int i;
   Baz baz;

   template<class Archive>
   void serialize(Archive &ar, unsigned int version) {
       ar & i;
       ar & baz; // Baz must be serializable
   }
};
Run Code Online (Sandbox Code Playgroud)

请注意,内置支持版本控制,但这是一个更高级的主题.

将类的对象保存到二进制存档非常简单:

Foo foo;
oarch << foo;  // Serializes "foo"
Run Code Online (Sandbox Code Playgroud)

关于Boost.Serialization的一个很酷的事情是,使用相同的成员函数来反序列化对象.唯一的区别是现在您使用输入存档:

std::ifstream ifs("my_file.dat");
boost::archive::binary_iarchive iarch(ofs);
Foo foo;  
iarch >> foo; // Deserializes "foo"
Run Code Online (Sandbox Code Playgroud)

至于加密部分,Botan库似乎相当成熟,它的C++与OpenSSL不同,它是C,所以使用起来有点痛苦.这就是我认为您可以在同一工作流程中进行序列化+加密的方式(反序列化将类似):

  1. 您将归档关联到内存中的字符串而不是文件:

    std::ostringstream oss;
    boost::archive::binary_oarchive oarch(oss);
    
    Run Code Online (Sandbox Code Playgroud)

    您写入存档的所有内容都将存储在字符串中.

  2. 您像以前一样序列化对象:

    Foo foo;
    oarch << foo;  // Serializes "foo" (data goes to the string)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您使用Botan库来加密您的字符串.不要太过于字面意思,但它应该是这样的:

    a)创建与您的字符串(oss对象)相关联的Botan内存数据源.

    b)创建与您要写入的文件关联的Botan数据接收器("myfile.dat").

    c)创建一个适合您需求的编码器

    d)调用编码函数,如 encode(source, sink);

编辑:改变了从OpenSSL到Botan的加密建议.