热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何避免硬编码加密密钥(目标C)?

如何解决《如何避免硬编码加密密钥(目标C)?》经验,为你挑选了1个好方法。

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

查找1 https://www.owasp.org/index.php/Technical_Risks_of_Reverse_Engineering_and_Unauthorized_Code_Modification#Cryptographic_Key_Replacement 步骤说明如下,

    损坏在源代码中声明的静态键.在磁盘上应该损坏这些密钥,以防止对手分析和拦截原始密钥;

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

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

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

寻找2 https://github.com/UrbanApps/UAObfuscatedString

有人可以帮帮我吗?

示例代码:

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

NSString *oauthCOnsumerKey= @"";
NSString *oauthCOnsumerSecret= @"";
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 = @"";

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;
}

Rob Napier.. 10

我之前已经写过关于解决这个问题的挑战,但是我想用你的UAObfuscatedString想法来展示一点,因为我认为这是大多数人都在寻找的解决方案,但是比什么都没有.值得注意的是:我不是特别擅长这一点.我不是一个经验丰富的逆向工程师,商业系统超出了我的技能.我只是一个有Hopper的人和五分钟的逆向工程工作(我跑了一个计时器; 5:35s,包括升级Hopper,因为我几个月没有运行它).

所以,我写了一个iOS程序UAObfuscatedString.我使用Swift是因为Swift通常比ObjC更难逆向工程.ObjC是逆向工程师的梦想.

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并查看应用程序代表init.这是常量初始化的地方,基于大多数人将这些东西粘贴在他们的app委托中的假设.显然,如果我看到一个名为KeyStorageor 的类SecretStuffHelper,我会先看一下......

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"是安全人员称之为不知道他们在做什么的攻击者,并且只使用其他人编写的自动化工具.

这里的教训是,如果你想混淆,你最好自己制定一些随机的方法.它不会有效,但它可能不会像大多数FOSS解决方案那样对你的目标产生积极的伤害."免费和开源"对安全性非常有利,但对于默默无闻而言是最糟糕的事情.

如果隐藏信息对您的业务计划非常重要并且您无法更改您的业务计划,那么您应该花费大量资金解决此问题,并雇用一个致力于不断改进您的混淆系统的人员队伍,以保持领先攻击者将适应你建立的任何东西.



1> Rob Napier..:

我之前已经写过关于解决这个问题的挑战,但是我想用你的UAObfuscatedString想法来展示一点,因为我认为这是大多数人都在寻找的解决方案,但是比什么都没有.值得注意的是:我不是特别擅长这一点.我不是一个经验丰富的逆向工程师,商业系统超出了我的技能.我只是一个有Hopper的人和五分钟的逆向工程工作(我跑了一个计时器; 5:35s,包括升级Hopper,因为我几个月没有运行它).

所以,我写了一个iOS程序UAObfuscatedString.我使用Swift是因为Swift通常比ObjC更难逆向工程.ObjC是逆向工程师的梦想.

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并查看应用程序代表init.这是常量初始化的地方,基于大多数人将这些东西粘贴在他们的app委托中的假设.显然,如果我看到一个名为KeyStorageor 的类SecretStuffHelper,我会先看一下......

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"是安全人员称之为不知道他们在做什么的攻击者,并且只使用其他人编写的自动化工具.

这里的教训是,如果你想混淆,你最好自己制定一些随机的方法.它不会有效,但它可能不会像大多数FOSS解决方案那样对你的目标产生积极的伤害."免费和开源"对安全性非常有利,但对于默默无闻而言是最糟糕的事情.

如果隐藏信息对您的业务计划非常重要并且您无法更改您的业务计划,那么您应该花费大量资金解决此问题,并雇用一个致力于不断改进您的混淆系统的人员队伍,以保持领先攻击者将适应你建立的任何东西.


@virumax Swift具有广泛的静态分派功能,可以内联函数,然后根据这些功能执行优化.这使得生成的Swift与原始代码的关联性远远低于Objective-C,后者无法跨消息传递进行优化(objc_msgSend).整个编译后的objc_msgSend调用Objc必然会告诉你方法的名称.这在优化的Swift代码中通常不可用.虽然Swift*可以*使用ObjC运行时,但它没有,而且很多Swift都没有.在这方面,Swift更接近C++.
推荐阅读
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • Redis通用指令及数据库操作详解
    本文详细介绍了Redis中的通用指令,包括key的基本操作、扩展操作和查询模式,以及数据库的基本操作和相关操作。同时还解决了key重复问题,并提供了解决方案。文章内容参考了黑马Redis教程。 ... [详细]
  • Hbase中Insert和Update操作没有明显的差别。如果误操作,是否可以恢复数据?方法:通过timeStamp找回数据。但是&#x ... [详细]
  • nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一 ... [详细]
author-avatar
到几百元_309
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有