2016-10-29 160 views
2

我正在构建一个iOS应用程序,用户通过API密钥向服务器发送请求。在源代码中隐藏API密钥

NSSTRING* secretAPIkey = @"12345secretKey"; 

我读过有关逆向工程如果有人可以查看源代码,基本上是:Altough当我需要有此密钥为源代码中的静态字符串出现问题。

我的解决方案: 1.多个静态字符串,然后将它们组合成一个

nsstring *1 = @"1"; 
nsstring *2 = @"2"; 
nsstring *complete [nsstring stringwithformat:@"%@%@",1,2]; 
and so on.. 
在info.plist中
  • 保存它。
  • 由于所有用户都需要相同的API密钥,所以不能确定钥匙串是否在所有应用程序中都是全局的。
  • 任何其他解决办法?什么是最好的方法?

    +1

    首先定义您正在防御的攻击者的级别。考虑一个iOS应用程序是由Apple用Apple密钥加密的,没有人可以在休息时检查二进制文件。为了获得访问密钥,iOS设备必须越狱并安装黑客工具。使用这些工具将启动应用程序并在执行之前暂停应用程序,并且可以在此时检查二进制文件。这是您所抵御的攻击者的等级吗? – zaph

    回答

    0

    如果您的应用程序需要通过互联网连接到工作,那么你可以选择以https和认证来从一个Web服务器API密钥,并选择使用证书钉扎,防止MITM攻击。

    +0

    我也这么认为。如果我使用经过身份验证的网络服务器的问题,请说.htaccess基本身份验证,我仍需要在应用程序的URL中编写密码和suename? URL在Xcode:https://开头管理员:[email protected]/secret.php 凡PHP文件将返回从MySQL的关键。 –

    +0

    这通常需要用户帐户和登录。 – zaph

    +0

    是的,但要获得实际的钥匙可以说,一个PHP文件。我需要使用身份验证来保护PHP文件。这意味着我需要用密码和用户名将ULR硬编码到应用程序中,对吗? URL:@“user:[email protected]/getAPI。php“ 然后它会将一个值返回到一个抽象字符串中,并将该Key保存到一个字符串中,例如nsuserdefaults,所以对API的请求并不需要一直提取。 –

    0

    您可以使用AES对密钥进行加密,并将加密版本放在源代码中,然后再解密。请参阅this question。这仍然可以被逆向工程,但使其更难。

    +0

    关于加密和钥匙串的简单问题。钥匙串语法将是这个样子: KeychainItemWrapper *钥匙扣= [[KeychainItemWrapper页头] initWithIdentifier:@ “东西” accessGroup:无]; [钥匙扣的setObject:@ “superSecretAPIKey” forKey:kSecAttrPassword]; “superSecretAPIKey”仍然是keychain语法中的一个静态字符串。不是那么成问题吗? –

    +0

    @JimmieMagnusson you're r这就是为什么我建议在应用程序之外加密api密钥,并在源代码中使用已经加密的密钥,所以可以立即被劫持程序访问,劫持程序将在源代码中搜索字符串。 –

    +0

    那么,您是如何加密应用程序外部的密钥的?那么我如何才能将它加入到应用程序中? Cus用户需要钥匙才能建立账户等等。 同时加密应用程序中的密钥也是一个想法 –

    0
    1. 只需创建一个字节数组,并进行不同的操作,每个字节,例如用于第一个字节你化妆此外,第二 - 减法,第三 - 乘法等等......当你需要一个结果让你的“秘密API密钥”作为一个字符串。所以最初你只有一些字节数组,任何人都不知道如何将它转换为文本。

    2. 或者使用任何加密算法。

    注意:但是,如果您不通过https工作,任何人都可以嗅出您的请求。此外,如果您使用https,那么还有一种方法可以嗅探到您的请求......因此,您对问题的处理方法最初不正确。

    +1

    1.转移字节并不是真的对攻击者来说非常有效。 3.如果使用加密密钥,只是将问题转移到保护该密钥。 3.是的,必须使用HTTPS并使用证书管理。 – zaph