【问题标题】:Initializing large arrays efficiently in Xcode在 Xcode 中有效地初始化大型数组
【发布时间】:2013-01-25 17:26:04
【问题描述】:

我需要在我的项目中存储大量不同类型的机密数据。 数据可以表示为编码的 NSStrings。我更喜欢在代码中初始化它而不是从文件中读取,因为这样更安全。

所以我需要大约 100k 行这样的:

[myData addObject: @"String"];

或者像这样

myData[n++] = @"String";

将这些行放在 Xcode 中会导致编译时间大幅增加长达几个小时(顺便说一下,在 Eclipse 中编译这样的 100k 行需要几分之一秒)

什么是可行的安全替代方案?

(请不要建议从文件中读取,因为这会使数据更容易被破解)

【问题讨论】:

    标签: xcode large-data-volumes


    【解决方案1】:

    可以使用strings 等工具轻松转储代码中的字符串。

    无论如何,如果您想将数据文件直接合并到可执行文件中,您可以使用-sectcreate 链接器选项来实现。将 -Wl,-sectcreate,MYSEG,MYSECT,path 之类的内容添加到 Other Linker Commands 构建设置。在您的代码中,您可以使用 getsectdata() 访问该数据部分。

    但是,您不得将您实际交付给最终用户的任何数据(无论是在代码文件中还是在资源文件中)视为“机密”。它不是,也永远不可能。

    【讨论】:

    • +1 正如您所建议的,每一种使加密文件可破解的技术都将等效地使嵌入的数据同样可破解。由于安全性方面几乎没有实际改进,因此您应该选择更容易实施且对合法用户造成的麻烦最少的一种。
    【解决方案2】:

    我会将字符串放在 plist 文件中,并在运行时将其读入NSArray。为安全起见,请加密文件。

    【讨论】:

    • 谢谢,我宁愿避免将数据放入文件中,因为人们很容易知道要立即解密什么 - 在代码中使用数组会使这一点不那么明显......
    • 如果攻击者不知道密钥,知道要解密的内容如何帮助他们?
    • 我认为在代码中找到唯一的密钥比解密在代码中某处的类中加密的完整数据要容易得多...
    • 确实,处理密钥是最困难的部分。隐藏 16 或 32 字节的非 ascii 密钥要容易得多。密钥可以是一个计算值,比如将几个整数与一些数学运算结合起来,但这不是一个安全的解决方案,因为它依赖于方法的模糊性。根据您的需要,有更好的方法来处理密钥
    • 没有充分的理由相信找到解密密钥比在类中找到数据更容易或更难。在任何一种情况下,攻击者都会在你的程序上放置一个调试器,让它为他解密数据。
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2015-01-06
    • 2021-09-01
    相关资源
    最近更新 更多