基本上我正在实现一个字典,我不希望任何用户访问我的字典.txt文件。我需要从我的程序中访问该文件。 txt文件太大,加密方法需要花费大量时间来解密它们。还有哪些其他方法?
答案 0 :(得分:2)
你为自己设定了几乎不可能完成的任务。
通过“read”的某些定义,程序的任何用户都可以“读取”该文件,只需要求程序进行查找。
如果您想通过除程序之外的其他方式阻止对文件的读取访问,那么您唯一有效的选择就是拒绝对文件的物理访问(通过将其托管在服务器上并在其前面设置API,允许查询)。任何能够访问程序和数据文件的知识渊博且确定的用户都能够解密它。 加密数据文件可能会使某些人更加困难,但只有当密钥没有内置到程序中时,用户才必须手动输入密钥。然后只有拥有密钥的人才有合理的机会解密数据文件。
答案 1 :(得分:1)
根据字典实际执行的操作,您可以使用Bloom过滤器或其他概率哈希数据结构来避免以任何直接方式存储其内容。但是在那种情况下你将无法访问这些单词,只能检查单词是否存在。
通过向程序查询所有可能的单词,这样的字典仍然容易受到攻击。这可能是否可行;目前还不清楚你在做什么。
答案 2 :(得分:0)
如果您确实采用了严密的安全措施,那么您应该使用正确的长密钥加密。 [但请参阅有关“您在哪里存储钥匙”的评论 - 您无法安全地执行此操作]。
但是,如果您只是希望文件在文本编辑器中难以阅读,则可以使用某种形式的简单压缩[以及占用更少空间的额外好处]。 Bytepair编码很容易实现。霍夫曼编码需要更多的努力。 Obviouslky使用现有的编码技术,例如gzip,bzip2,xz或其他一些技术,对于有人破解来说会有点困难,因此不具备相同的保护属性。
如果目的是让REGULAR用户(例如那些不熟悉破解密码并闯入软件的人)变得困难,那么将密钥存储起来只需要一点点“笨拙” - 例如,顶部和底部字符的4位并反转它们:char ch = (orig_ch >> 4) | ((orig_ch & (1<<4)-1) << 4);
会使普通用户的内容几乎无法读取。
答案 3 :(得分:0)
与许多人已经观察到的一样,它无法在100%的时间内保护用户的数据。如果有足够的时间,任何充分确定的用户都会得到它。
但是,有一种“简单”的方法可以确保用户不会“乱搞”字典文件中的数据:您可以使用二进制文件I / O:
ofstream out("dictionary.dat",ios::binary);
out.write((char*) &your_data, sizeof(your_data));
阅读时,你会做类似的事情:
ifstream in("dictionary.dat",ios::binary);
in.read((char*) &your_data, sizeof(your_data));
这不是真正意义上的“加密”,它只是一种替代表示,使人们更难以“弄乱”你的数据。
此外,不要担心如果用户会弄乱你的数据文件,那么实现检测文件是否被篡改的方法会更有意义(例如:校验和,文件哈希等)。并拒绝加载它。