首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS安全:敏感逻辑保护方案(敏感信息安全设计)

前言 应用场景:签名函数,把函数名隐藏在结构体里,以函数指针成员形式存储来进行敏感逻辑保护。 为了提高代码安全性,可以采用把把函数名隐藏在结构体里,以函数指针成员形式存储。...static __attribute__((always_inline)) void anti_debug() //一般函数调用都会通过call方式来调用,hacker很容易对一个函数做手脚,如果是以...mainWindow.safeAreaInsets.bottom > 0.0) { return YES; } } return NO; } 1.2 把函数名隐藏在结构体里,以函数指针成员形式存储...,以函数指针成员形式存储。...,防止产生参数遍历获取信息风险 iOS敏感逻辑保护方案:【把函数名隐藏在结构体里,以函数指针成员形式存储】 敏感信息需要展示在web页面上时,应在后台进行敏感字段脱敏处理 身份证、银行卡号 姓名 预留手机号

1K10

请说下redis命令时间复杂度??(实际问是redis底层结构)

redis本身是开源C语言编写k-v存储系统,他支持String、List、Set、ZSet、hash五种数据结构,每种数据结构底层是如何实现?其数据结构为什么? 1....String 1.1 结论 底层结构:指针+字符数组 时间复杂度:O(1) 1.2 表格 1.3 底层原理 Redis是C语言开发,但在C语言中并没有字符串类型,只能使用指针和字符数组形式来保存一个字符串...char buf[]; } 获取字符串长度时间复杂为O(1),因为len保存是当前字符串长度。...一个普通双向链表,链表中每一项都占用独立一块内存,各项之间用地址指针(或引用)连接起来,但是这种方式会造成大量内存碎片,而且地址指针也会占用额外内存。...ziplist却是将表中每一项存放在前后连续地址空间内,一个ziplist整体占用一块内存。

79040
您找到你想要的搜索结果了吗?
是的
没有找到

我从未见过牛逼解说方式!Redis五种数据结构,看一遍就懂了

,因此「每次获取字符串长度都会遍历得到,时间复杂度是O(n)」,而Redis中获取字符串只要读取len值就可,时间复杂度变为O(1)。...(2)「c语言」中两个字符串拼接,若是没有分配足够长度内存空间就「会出现缓冲区溢出情况」;而「SDS」会先根据len属性判断空间是否满足要求,若是空间不够,就会进行相应空间扩展,所以「不会出现缓冲区溢出情况...Hash类型 Hash对象实现方式有两种分别是ziplist、hashtable,其中hashtable存储方式key是String类型,value也是以key value形式进行存储。...渐进式rehash 假如在rehash过程中数据量非常,Redis不是一次性把全部数据rehash成功,这样会导致Redis对外服务停止,Redis内部为了处理这种情况采用「渐进式rehash」。...压缩列表是列表键和哈希键底层实现原理之一,「压缩列表并不是以某种压缩算法进行压缩存储数据,而是它表示一组连续内存空间使用,节省空间」,压缩列表内存结构图如下: ?

64510

防止站点数据被採集——成佩涛黑客「建议收藏」

PS:事实上以上方法都有各自优点,可是详细操作还是得依据实际情况而定。...大家都知道移动互联网如今非常红火,那么在这个移动当头年代。移动安全也是一个非常问题。 当中就包括移动端接口数据安全问题。...适合传输数据採用json/xml形式接口。...原理和web 端一样 方法二: 假如是移动端的话: 1、你随便定义一个特定密匙(比方:成佩涛黑客),移动端这边採用加密算法加密该字符串并作为參数传递到后台接口去...2、后台採取相同算法进行解密或加密之后进行匹配字符串,如果匹配成功则进行查询 PS:事实上以上方法仅仅是參考方案:原理主要是通过密匙传递,是否能被破解

21310

万字长文Redis五种数据结构详解(理论+实战),建议收藏。

,因此「每次获取字符串长度都会遍历得到,时间复杂度是O(n)」,而Redis中获取字符串只要读取len值就可,时间复杂度变为O(1)。...(2)「c语言」中两个字符串拼接,若是没有分配足够长度内存空间就「会出现缓冲区溢出情况」;而「SDS」会先根据len属性判断空间是否满足要求,若是空间不够,就会进行相应空间扩展,所以「不会出现缓冲区溢出情况...Hash类型 Hash对象实现方式有两种分别是ziplist、hashtable,其中hashtable存储方式key是String类型,value也是以key value形式进行存储。...渐进式rehash 假如在rehash过程中数据量非常,Redis不是一次性把全部数据rehash成功,这样会导致Redis对外服务停止,Redis内部为了处理这种情况采用「渐进式rehash」。...压缩列表是列表键和哈希键底层实现原理之一,「压缩列表并不是以某种压缩算法进行压缩存储数据,而是它表示一组连续内存空间使用,节省空间」,压缩列表内存结构图如下: ?

2.6K20

Windows内核开发-3-内核编程基础

但是在内核下忽略返回值是一个非常危险情况,应该避免这样情况出现,所以内核编程中有一点千万记住,就是 始终检查内核API返回值 1.4 IRQL 中断请求级别 IRQL在内核开发中是一个非常重要概念...在内核中C++用得比较少,但是有一些使用资源用法较弱( Resource Acquisition Is Initialization 资源获取即初始化)RALL用法很常用,可以防止资源泄露。...大部分情况下内核采用unicode指针形式来使用字符串(wchar_t* 或者WCHAR)但是很多函数期待用UNICODE_STRING。...PCUNICODE_STRING; UNICODE_STRING是以字节而不是字符为单位,并且不包括UNICODE-NULL终结符,如果终结符存在,则MaximumLength是字符串可以增长到最大字节数...而符号对象在内核模式下是以 \??\或者是\DosDevices\开头比如前面例子里:\Device\test。在User模式下就是以 \.\开头比如说 ”\.\C: “。

1.6K30

面试题丨android面试问题合集

Xposed是一个使用root权限安卓框架,它是以模块形式对系统或应用程序核心组件进行替换,从而达到修改系统行为目的。...54.inline hook和got hook原理如何检测?inline hook跳板设计,多次跳转情况?...67.设备指纹生成会遇到问题,异常情况如何解决?1.如果在获取设备指纹过程中出现网络问题,可以采用重试机制,即在设定时间内重复尝试获取设备指纹。...如何进行防护?如何进行对抗?还有哪些抓包方式?非root环境可以抓包嘛?说说方案?现有的一些最难抓包情况是怎么样?...2、采用混淆算法抓包:采用混淆算法可以把客户端与服务端之间数据流量进行混淆,使中间人抓包无从下手,这种抓包情况也是比较难。86.flutter有了解么?遇到这种情况怎么进行抓包?

1.9K54

5.1 缓冲区溢出与攻防博弈

堆溢出攻击:攻击者利用程序中堆分配方式中存在漏洞,向堆中写入恶意代码,从而控制程序执行流程。格式化字符串攻击:利用程序对格式化字符串处理不当,向内存中写入恶意代码。...为了防止这种攻击,可以在堆上实施堆随机化(heap randomization)和地址空间随机化(ASLR)等技术。堆随机化可以使恶意代码难以找到并利用堆中内存地址,从而增加攻击者难度。...如何绕过该保护为了绕过SEHOP保护机制,突破方法就是进一步伪造SEH链,该方法核心是能够找到合适跳板指令,且伪造最终异常处理函数指针应该与真实相同,伪造最终异常处理函数指针前4字节(SEH链指针...该技术通常通过在操作系统内核中实现,对每个进程都使用不同随机偏移量来布局内存空间,防止攻击者利用事先获取内存地址来进行攻击。...这种保护机制可以有效地防止攻击者利用缓冲区溢出等漏洞来执行恶意代码,从而提高系统安全性。

23620

面试爱问之const关键字

const修饰字符串常量:字符串常量位于文字常量区(也有文章归类于代码区),本身就不允许被修改,如果没有const修饰,我们可能会在后面有意无意修改字符串常量,这样会导致对只读内存区域赋值,然后程序会立刻异常终止...//第三种 const int* const p4; //p本身是const,而p指向变量也是const 是以上两种结合,指针指向位置不能改变并且也不能通过这个指针改变变量值,...因此,有三种情况可讨论: 1、函数参数为值传递: 值传递(pass-by-value)是传递一份参数拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为...根据上面对指针常量、常量指针等讨论,同样分为三种情况: 2.1 防止修改指针指向内容 典型C库函数:char *strcpy(char *dest, const char *src); 2.2 防止修改指针指向地址...2.3 防止修改指针指向内容和地址 4.修饰函数返回值 1、如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时存储单元中,加const 修饰没有任何价值。

21220

5.1 缓冲区溢出与攻防博弈

堆溢出攻击:攻击者利用程序中堆分配方式中存在漏洞,向堆中写入恶意代码,从而控制程序执行流程。 格式化字符串攻击:利用程序对格式化字符串处理不当,向内存中写入恶意代码。...为了防止这种攻击,可以在堆上实施堆随机化(heap randomization)和地址空间随机化(ASLR)等技术。堆随机化可以使恶意代码难以找到并利用堆中内存地址,从而增加攻击者难度。...如何绕过该保护 为了绕过SEHOP保护机制,突破方法就是进一步伪造SEH链,该方法核心是能够找到合适跳板指令,且伪造最终异常处理函数指针应该与真实相同,伪造最终异常处理函数指针前4字节(SEH链指针...该技术通常通过在操作系统内核中实现,对每个进程都使用不同随机偏移量来布局内存空间,防止攻击者利用事先获取内存地址来进行攻击。...这种保护机制可以有效地防止攻击者利用缓冲区溢出等漏洞来执行恶意代码,从而提高系统安全性。

33840

Python后端技术栈(六)--数据库

1.6.2.1 MySQL 索引重点 1.索引原理、类型和结构 2.创建索引注意事项,使用原则 3.如何排查和消除慢查询 1.6.2.2什么是索引 索引就是数据表中一个或者多个列进行排序数据结构。...第一是只在叶子节点带有指向记录指针(为什么?因为可以增加树度)。第二就是叶子节点通过指针相连,为什么?因为可以实现范围查询。...如果大家对搜索引擎搜索原理比较了解的话,会明白全文索引一般是通过倒排索引形式实现。 1.6.2.6什么时候创建索引 我们在建表时候需要根据查询需求来创建索引。...尤其是枚举,一共才几个值,创建什么索引,完全没有必要~ 3.索引长度不要太长(比较耗费时间) 作为索引在 B + Tree 中是以 key 形式存在,为什么主键索引要使用自增 int 值呢?...(这种情况无法用到联合索引) 注意:总结为一句话就是当 B + Tree key 没有办法直接比较情况下,索引会失效。

80220

CC++ 实现动态资源文件释放

当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。...在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立文件。在这篇博客文章中,我们将讨论如何使用C++和WinAPI实现这个目标。...如果为 NULL,则返回调用线程可执行模块句柄。 在许多情况下,GetModuleHandle 主要用于获取当前进程模块句柄,以便在后续操作中使用该句柄。...LockResource 用于获取指定资源数据指针。它接受一个全局内存块句柄,该内存块通常由 LoadResource 函数返回,然后返回一个指向资源数据指针。...这种技术在一些特殊情况下可能会很有用,例如需要动态加载或替换资源情况。希望这篇博客对你理解如何使用 C++ 和 Windows API 进行资源操作有所帮助。

29110

CC++ 实现动态资源文件释放

当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。...在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立文件。在这篇博客文章中,我们将讨论如何使用C++和WinAPI实现这个目标。...如果为 NULL,则返回调用线程可执行模块句柄。在许多情况下,GetModuleHandle 主要用于获取当前进程模块句柄,以便在后续操作中使用该句柄。...LockResource用于获取指定资源数据指针。它接受一个全局内存块句柄,该内存块通常由 LoadResource 函数返回,然后返回一个指向资源数据指针。...这种技术在一些特殊情况下可能会很有用,例如需要动态加载或替换资源情况。希望这篇博客对你理解如何使用 C++ 和 Windows API 进行资源操作有所帮助。

41810

一份热乎乎字节面试真题

说说Redis为什么快 Redis有几种数据结构,底层分别是怎么存储 Redis有几种持久化方式 多线程情况下,如何保证线程安全? 用过volatile吗?底层原理是?...先看下Redis数据结构&内部编码图: 1.2.1 SDS简单动态字符串 字符串长度处理:Redis获取字符串长度,时间复杂度为O(1),而C语言中,需要从头开始遍历,复杂度为O(n); 空间预分配...字典就是哈希表,比如HashMap,通过key就可以直接获取到对应value。而哈希表特性,在O(1)时间复杂度就可以获得对应值。...多线程情况下,如何保证线程安全? 加锁,比如悲观锁select for update,sychronized等,如,乐观锁,乐观锁如CAS等,还有redis分布式锁等等。 5....它是如何保证可见性原理是什么 volatile关键字是Java虚拟机提供最轻量级同步机制,它作为一个修饰符, 用来修饰变量。它保证变量对所有线程可见性,禁止指令重排,但是不保证原子性。

91340

C++ STL 学习之【string使用】

我们对字符串操作就能变得行云流水 注意: string 诞生于 STL 之前,因此存在部分接口冗余情况 ---- 正文 本文介绍是 string 部分常用接口 basic_string string...s2 //string s2 = s1; //这种写法也是可以 return 0; } ---- 容量操作相关 我们可以把 string 类看作一个专门用来处理字符顺序表,因为它有字符指针...、容量、长度等信息,我们也可以进行手动扩容等操作 ️获取数据 获取 string 对象中指向字符串指针 _str C++兼容C,在某些场景下需要使用指向字符串指针,因此 string 类中提供了这个接口...int main() { string s("hello"); cout << s.c_str() << endl; //获取对象s中字符串指针 return 0; } 此时直接打印内容原因是当指针指向对象为常量字符串时...改用指针,先 2倍 扩容至 30,后续字符都是存在指针中 之后扩容操作,都是以 1.5倍 进行扩容 会多开辟一些空间 Linux中 string 扩容策略 默认大小为 0 空间 当第一次扩容时,会先扩至

22920

Redis详解(四)------ redis底层数据结构

①、常数复杂度获取字符串长度   由于 len 属性存在,我们获取 SDS 字符串长度只需要读取 len 属性,时间复杂度为 O(1)。...里面的元素,并且 SDS 不是以字符串来判断是否结束,而是以 len 属性表示长度来判断字符串是否结束。...②、无环:表头节点 prev 指针和表尾节点 next 指针都指向 NULL,对链表访问都是以 NULL 结束。     ...注意这里还有一个指向下一个哈希表节点指针,我们知道哈希表最大问题是存在哈希冲突,如何解决哈希冲突,有开放地址法和链地址法。...8、总结   大多数情况下,Redis使用简单字符串SDS作为字符串表示,相对于C语言字符串,SDS具有常数复杂度获取字符串长度,杜绝了缓存区溢出,减少了修改字符串长度时所需内存重分配次数,以及二进制安全能存储各种类型文件

72000

JavaScript 对象与 Hash 表

这个映射函数叫做散列函数,存放记录数组叫做散列表。 JavaScript 中对象也是以 Key-Value 形式访问,那么 JavaScript 对象是否以 Hash 结构存储呢?...JavaScript 对象存储形式 JavaScript 对象 Key 存储形式 在我们创建或者访问对象属性时候,如果使用 对象.属性名 方式,属性名只能为字符串类型,而且不能以数字开头: let...这里也间接证明了 JavaScript 对象中,所有的 key 都是字符串,即使你访问时候不是字符串形式,解释器也会先将其转化为字符串。...这种方式称之为按引用访问。...总结 在 JavaScript 中对象是以 Hash 结构存储,用 键值对表示对象属性,Key 数据类型为字符串,Value 数据类型是结构体,即对象是以 <String

1.8K20

redis底层数据结构

①、常数复杂度获取字符串长度 由于 len 属性存在,我们获取 SDS 字符串长度只需要读取 len 属性,时间复杂度为 O(1)。...里面的元素,并且 SDS 不是以字符串来判断是否结束,而是以 len 属性表示长度来判断字符串是否结束。...②、无环:表头节点 prev 指针和表尾节点 next 指针都指向 NULL,对链表访问都是以 NULL 结束。 ③、带链表长度计数器:通过 len 属性获取链表长度时间复杂度为 O(1)。...注意这里还有一个指向下一个哈希表节点指针,我们知道哈希表最大问题是存在哈希冲突,如何解决哈希冲突,有开放地址法和链地址法。...8、总结 大多数情况下,Redis使用简单字符串SDS作为字符串表示,相对于C语言字符串,SDS具有常数复杂度获取字符串长度,杜绝了缓存区溢出,减少了修改字符串长度时所需内存重分配次数,以及二进制安全能存储各种类型文件

46530
领券