有时,从二进制(可执行)文件中隐藏字符串很有用.例如,从二进制文件中隐藏加密密钥是有意义的.
当我说"隐藏"时,我的意思是在编译的二进制文件中更难找到字符串.
例如,这段代码:
const char* encryptionKey = "My strong encryption key";
// Using the key
Run Code Online (Sandbox Code Playgroud)
编译后生成一个可执行文件,其数据部分中包含以下内容:
4D 79 20 73 74 72 6F 6E-67 20 65 6E 63 72 79 70 |My strong encryp|
74 69 6F 6E 20 6B 65 79 |tion key |
Run Code Online (Sandbox Code Playgroud)
您可以看到我们的秘密字符串可以轻松找到和/或修改.
我可以隐藏字符串......
char encryptionKey[30];
int n = 0;
encryptionKey[n++] = 'M';
encryptionKey[n++] = 'y';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 's';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = …Run Code Online (Sandbox Code Playgroud) 假设我需要从iPhone应用程序访问Web服务.此Web服务要求客户端对HTTP请求进行数字签名,以证明应用程序"知道"共享密钥; 客户端密钥.请求签名存储在HTTP头中,请求只是通过HTTP(而不是HTTPS)发送.
这个密钥必须始终保密,但需要iPhone应用程序使用.
那么,鉴于您始终被告知永远不会在客户端存储任何敏感内容,您将如何安全地存储此密钥?
普通用户(99%的用户)很乐意使用该应用程序.会有某个人(一个敌人?)想要这个秘密客户密钥,以便通过冒充来对服务或客户密钥所有者造成伤害.这样的人可能越狱他们的手机,访问二进制文件,运行"字符串"或十六进制编辑器并四处寻找.因此,仅将密钥存储在源代码中是一个糟糕的主意.
另一个想法是将密钥存储在代码中而不是字符串文字中,而是存储在从字节文字创建的NSMutableArray中.
可以使用钥匙串,但由于iPhone应用程序永远不必提供密码来存储钥匙串中的东西,我担心有权访问应用程序沙箱的人可以并且能够简单地查看或轻松解码其中的项目.
编辑 - 所以我读到了关于钥匙串的信息:"在iPhone OS中,应用程序总是可以访问自己的钥匙串项目,并且无法访问任何其他应用程序的项目.系统会为钥匙串生成自己的密码,并存储密钥在设备上以任何应用程序都无法访问它."
所以也许这是存放密钥的最佳位置....如果是这样,我如何使用预先输入到应用程序钥匙串中的密钥?那可能吗?否则,如果没有密钥在源代码中,你怎么能在第一次启动时添加密钥?嗯..
编辑 - 提交的错误报告#6584858在http://bugreport.apple.com
谢谢.
当我们谈论保护iOS应用程序时,我们经常忘记保护最关键的敏感信息,如secret,key,token,encryptionKey.此信息存储在iOS二进制文件中.因此,您的服务器端安全协议都不会对您有所帮助.
有很多建议我们不应该将这些信息存储在应用程序中,而是存储在服务器中并通过SSL安全的Web服务调用获取.但这对所有应用都不可能.例如,如果我的应用程序根本不需要Web服务.
在iOS应用程序中,我们有以下选项来存储信息.
请发送一些很好的解决方案来解决这个问题.