gpt4 book ai didi

ios - 如何避免对加密 key 进行硬编码( Objective-C )?

转载 作者:可可西里 更新时间:2023-11-01 06:21:23 29 4
gpt4 key购买 nike

在我的 Objective C 代码中,我有一个消费者 key 和密码硬编码在我的代码中,用于 SHA-1 加密。我想知道的是我是否可以避免硬编码以提高安全性。到目前为止,我发现了以下内容,

发现 1 https://www.owasp.org/index.php/Technical_Risks_of_Reverse_Engineering_and_Unauthorized_Code_Modification#Cryptographic_Key_Replacement解释步骤如下,

  1. 破坏源代码中声明的静态键。此类 key 应在磁盘上损坏,以防止对手分析和拦截原始 key ;

  2. 接下来,应用程序应该在需要 key 的代码使用它之前修复 key ;

  3. 在使用 key 之前,应用程序应立即执行 key 值的校验和,以验证未损坏的 key 是否与代码在构建时声明的值相匹配;和

  4. 最后,在应用程序完成对特定调用的使用后,应用程序应立即重新损坏内存中的 key 。

发现 2 https://github.com/UrbanApps/UAObfuscatedString

有人可以帮帮我吗?

示例代码:

+ (NSString *) getOauthHeaderForRequestString:(NSString *)requestString {

NSString *oauthConsumerKey = @"<consumer key which I want avoid hardcoding>";
NSString *oauthConsumerSecret = @"<consumer secret which I want to avoid hardcoding>";
NSString *oauthSignatureMethod = @"HMAC-SHA1";
NSString *oauthVersion = @"1.0";

NSString *oauthNonce = [self generateNonce];
NSString *oauthtimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];

NSArray * params = [NSArray arrayWithObjects:
[NSString stringWithFormat:@"%@%%3D%@", @"oauth_consumer_key", oauthConsumerKey],
[NSString stringWithFormat:@"%@%%3D%@", @"oauth_nonce", oauthNonce],
[NSString stringWithFormat:@"%@%%3D%@", @"oauth_signature_method", oauthSignatureMethod],
[NSString stringWithFormat:@"%@%%3D%@", @"oauth_timestamp", oauthtimestamp],
[NSString stringWithFormat:@"%@%%3D%@", @"oauth_version", oauthVersion],
[NSString stringWithFormat:@"%@%%3D%@", @"request", [requestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]],
nil];

params = [params sortedArrayUsingSelector:@selector(compare:)];
NSString *parameters = [params componentsJoinedByString:@"%26"];

NSString *postURL = @"<my post url>";

NSArray * baseComponents = [NSArray arrayWithObjects:
@"POST",
[self encodeString:postURL],
parameters,
nil];
NSString * baseString = [baseComponents componentsJoinedByString:@"&"];

NSArray *signingKeyComponents = [NSArray arrayWithObjects:oauthConsumerSecret, @"", nil];
NSString *signingKey = [signingKeyComponents componentsJoinedByString:@"&"];

NSData *signingKeyData = [signingKey dataUsingEncoding:NSUTF8StringEncoding];
NSData *baseData = [baseString dataUsingEncoding:NSUTF8StringEncoding];

uint8_t digest[20] = {0};
CCHmac(kCCHmacAlgSHA1, signingKeyData.bytes, signingKeyData.length, baseData.bytes, baseData.length, digest);

NSData *signatureData = [NSData dataWithBytes:digest length:20];

NSString *oauthSignature = [self base64forData:signatureData];

// final request build
NSString *oauthHeader = @"OAuth ";
oauthHeader = [oauthHeader stringByAppendingFormat:@"oauth_consumer_key=\"%@\"",oauthConsumerKey];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_nonce=\"%@\"",oauthNonce];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature=\"%@\"",[self encodeString:oauthSignature]];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_signature_method=\"%@\"",oauthSignatureMethod];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_timestamp=\"%@\"",oauthtimestamp];
oauthHeader = [oauthHeader stringByAppendingFormat:@",oauth_version=\"1.0\""];

return oauthHeader;
}

最佳答案

我写过 the challenges of solving this problem before ,但我想使用您的 UAObfuscatedString 想法进行一些演示,因为我认为这是大多数人正在寻找的解决方案,但总比没有好。重要的是要注意:我不是特别擅长这个。我不是经验丰富的逆向工程师,商业系统远远超出了我的技能范围。我只是一个 Hopper 的人以及五分钟的逆向工程工作(我运行了一个计时器;5:35 秒,包括升级 Hopper,因为我已经几个月没有运行它了)。

因此,我使用 UAObfuscatedString 编写了一个 iOS 程序。我使用 Swift 是因为 Swift 通常比 ObjC 更难逆向工程。 ObjC is a reverse engineer's dream.

let identifier = "c".o.m.dot.u.r.b.a.n.a.p.p.s.dot.e.x.a.m.p.l.e

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
print(identifier)
return true
}

然后我将其存档,因此它是优化代码等,就像您发送到 App Store 一样。然后我将它加载到 Hopper 并查看应用委托(delegate)的 init。这就是常量初始化的地方,基于大多数人将这些东西粘在他们的应用程序委托(delegate)中的假设。显然,如果我看到一个名为 KeyStorageSecretStuffHelper 的类,我会先看那里....

void * -[_TtC13ObfuscateTest11AppDelegate init](void * self, void * _cmd) {
*(r31 + 0xffffffffffffffe0) = r20;
*(0xfffffffffffffff0 + r31) = r19;
*(r31 + 0xfffffffffffffff0) = r29;
*(r31 + 0x0) = r30;
r0 = sub_100005e14();
return r0;
}

嗯,它调用这个匿名函数 sub_100005e14()。让我们看看它做了什么。

...
0000000100005e38 adr x0, #0x100006859 ; "c"
...
0000000100005e48 bl imp___stubs___T0SS18UAObfuscatedStringE1oSSfg
...
0000000100005e50 bl imp___stubs___T0SS18UAObfuscatedStringE1mSSfg
...
0000000100005e74 bl imp___stubs___T0SS18UAObfuscatedStringE3dotSSfg
...
0000000100005e98 bl imp___stubs___T0SS18UAObfuscatedStringE1uSSfg
...
0000000100005ebc bl imp___stubs___T0SS18UAObfuscatedStringE1rSSfg
...
0000000100005ee0 bl imp___stubs___T0SS18UAObfuscatedStringE1bSSfg
...
0000000100005f04 bl imp___stubs___T0SS18UAObfuscatedStringE1aSSfg
...
0000000100005f28 bl imp___stubs___T0SS18UAObfuscatedStringE1nSSfg
...
0000000100005f4c bl imp___stubs___T0SS18UAObfuscatedStringE1aSSfg
...
0000000100005f70 bl imp___stubs___T0SS18UAObfuscatedStringE1pSSfg
...
0000000100005f94 bl imp___stubs___T0SS18UAObfuscatedStringE1pSSfg
...
0000000100005fb8 bl imp___stubs___T0SS18UAObfuscatedStringE1sSSfg
...
0000000100005fdc bl imp___stubs___T0SS18UAObfuscatedStringE3dotSSfg
...
0000000100006000 bl imp___stubs___T0SS18UAObfuscatedStringE1eSSfg
...
0000000100006024 bl imp___stubs___T0SS18UAObfuscatedStringE1xSSfg
...
0000000100006048 bl imp___stubs___T0SS18UAObfuscatedStringE1aSSfg
...
000000010000606c bl imp___stubs___T0SS18UAObfuscatedStringE1mSSfg
...
0000000100006090 bl imp___stubs___T0SS18UAObfuscatedStringE1pSSfg
...
00000001000060b4 bl imp___stubs___T0SS18UAObfuscatedStringE1lSSfg
...
00000001000060d8 bl imp___stubs___T0SS18UAObfuscatedStringE1eSSfg

我不确定为什么 Swift demangler 在这里不起作用,但无论如何,我们可以很容易地看到模式:

_T0SS18UAObfuscatedStringE1oSSfg => o
_T0SS18UAObfuscatedStringE1mSSfg => m
_T0SS18UAObfuscatedStringE3dotSSfg => dot => .
_T0SS18UAObfuscatedStringE1uSSfg => u
...

意识到有这些 USObfuscatedString 方法,我搜索它并在应用程序中找到使用混淆字符串的任何地方。如果我愿意稍微改进一下我的游戏并花一天左右的时间玩它,我可能可以编写一个工具来自动提取每个 UAObfuscatedString,只需使用 otool 和二进制。

这是深刻的教训。您刚刚标记了所有要隐藏的字符串。一旦我意识到 UAObfuscatedString 是一个东西,您就让我更容易找到您的敏感信息。从字面上看,这比没有还糟糕。您在这里唯一的希望是攻击者不知道它的存在。这就是混淆的问题,也是混淆与安全的区别。

我还想强调一下,我花了 5 分 35 秒来攻击这个程序。是的,我基本上知道我在寻找什么样的东西,但我也没有这方面的技能。如果 UAObfuscatedString 变得流行,我向您保证,自动检测/去混淆工具将成为每个 script-kiddie 工具箱的一部分(“script-kiddie”是安全人员对攻击者的称呼不知道他们在做什么,只是使用其他人编写的自动化工具)。

这里的教训是,如果你想混淆,你最好自己编一些随机的方法。它不会有效,但它可能不会像大多数 FOSS 解决方案那样对您的目标产生积极的危害。 “免费和开源”对于安全性来说可能非常好,但对于默默无闻来说却是最糟糕的事情。

如果隐藏信息对你的商业计划真的很重要,而且你不能改变你的商业计划,那么你应该期望在这个问题上花很多钱,并聘请一个致力于不断发展你的混淆系统的团队来领先于将适应您构建的任何内容的攻击者。

关于ios - 如何避免对加密 key 进行硬编码( Objective-C )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44695274/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com