通常,我们会遇到项目中的一些数据、模型、资源文件保护问题,以防被人挪用,或者泄露流重要、敏感信息。本文即讨论这种外部资源文件的保护,以Windows环境下的模型文件的保护为例:(如果是linux,方法一不可行,只能将方法一用字节数组加载,参考https://blog.csdn.net/flyingleo1981/article/details/8193964)
主要考虑两种方法,一种是将外部资源文件嵌入二进制文件中(exe、dll、lib),然后将二进制文件加壳保护,这种方法开发量小,仅需要将资源文件嵌入并在运行时加载。
二是将外部文件加密,加密方法可以自定义,在加载模型文件前解密,考虑到安全性,防止解密后的模型文件暴露于内存被轻易dump,考虑使用流式加密的方法进行加解密,由此相对安全一点。
由于项目加载模型文件采用的是c++的文件流进行,而加载模型文件的方法封装成了库,所以这两种问题中都涉及一个问题是继承实现一个输入流,无论是从内存中加载还是解密后加载。其中嵌入资源文件的方法有个简单但安全性不高效率略低的做法可以避开继承输入流,即直接将嵌入资源重新加载到内存后将内存中的数据先写入某个流再从中读取。
继承iostream实现自定义都流输入输出,重点在于实现自定义的streambuf管理用于输入输出的缓冲区,因为根据继承关系,fstream、stringstream都是从源(file、string)处读取/写入至streambuf中,当streambuf已全部读取/写满溢出,则完成缓冲区的更新/序列化,因而关键是实现streambuf中的buf管理。有几篇博文讲的比较清楚,这里不再复述:
最全面的资料当然是官方流的说明文档: