gpt4 book ai didi

c++ - 使用 C++ 加密存储到磁盘的对象(面向 Java 开发人员)

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:36 25 4
gpt4 key购买 nike

这是两个合而为一的问题,但希望对 C++ 开发人员来说是微不足道的。

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

    const vector &encryption_key

这是一个概念验证,因此加密的强度或无误性不如代码简单易懂重要。

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

谢谢,

加夫

最佳答案

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

std::ofstream ofs("my_file.dat");
boost::archive::binary_oarchive oarch(ofs);

任何要序列化的类都必须有一个成员函数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
}
};

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

然后将类的对象保存到二进制存档非常容易:

Foo foo;
oarch << foo; // Serializes "foo"

Boost.Serialization 最酷的一点是使用相同的成员函数来反序列化对象。唯一的区别是现在您使用输入存档:

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

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

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

    std::ostringstream oss;
    boost::archive::binary_oarchive oarch(oss);

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

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

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

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

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

    c) 创建一个适合你需要的编码器

    d) 按照 encode(source, sink);

  4. 调用编码函数

编辑:将加密建议从 OpenSSL 更改为 Botan。

关于c++ - 使用 C++ 加密存储到磁盘的对象(面向 Java 开发人员),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com