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

在NSString中存储密码而不在内存中可读

在NSString中存储密码而不在内存中可读,可以使用加密技术来实现。常见的加密算法有AES、RSA等。

在iOS开发中,可以使用Apple提供的加密库CommonCrypto来实现加密和解密。具体实现步骤如下:

  1. 导入CommonCrypto库

在Xcode中,选择项目 -> 目标 -> 通用 -> 链接框架与库 -> 添加 -> 搜索CommonCrypto -> 添加

  1. 使用AES加密算法加密密码
代码语言:txt
复制
- (NSString *)AES256EncryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL,
                                          [self UTF8String], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        return [NSString stringWithFormat:@"%@", [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]];
    }

    free(buffer);
    return nil;
}
  1. 使用AES解密算法解密密码
代码语言:txt
复制
- (NSString *)AES256DecryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        return [[NSString alloc] initWithBytes:buffer length:numBytesDecrypted encoding:NSUTF8StringEncoding];
    }

    free(buffer);
    return nil;
}
  1. 使用加密和解密方法
代码语言:txt
复制
NSString *password = @"password";
NSString *key = @"1234567890123456";

NSString *encryptedPassword = [password AES256EncryptWithKey:key];
NSString *decryptedPassword = [encryptedPassword AES256DecryptWithKey:key];

这样,在NSString中存储密码时,就可以使用加密技术来保证密码的安全性,同时避免在内存中可读。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Node进阶-探究不在V8堆内存存储的Buffer对象

,如果小于4KB的话则从当前分配池里面判断是否够空间放下当前存储的数据,如果不够则重新去申请8KB的内存空间,把数据存储到新申请的空间里面,如果足够写入则直接写入数据到内存空间里面,下图为其内存分配策略...看内存分配策略图,如果当前存储了2KB的数据,后面要存储5KB大小数据的时候分配池判断所需内存空间大于4KB,则会去重新申请内存空间来存储5KB数据并且分配池的当前偏移指针也是指向新申请的内存空间,这时候就之前剩余的...这里内部 parent属性指向的 SlowBuffer对象来自 Node自身 C++的定义,是 C++层面的 Buffer对象,所用内存不在 V8的堆 内存分配的限制 此外, Buffer单次的内存分配也有限制...当进行小频繁的 Buffer操作时,采用的是 8KB为一个单元的机制进行预先申请和事后分配,使得 Javascript到操作系统之间不必有过多的内存申请方面的系统调用。...c++堆外分配内存,并且 Google也对 String进行优化,实际的拼接测速对比, String比 Buffer快。

72420

Node进阶-探究不在V8堆内存存储的Buffer对象

,如果小于4KB的话则从当前分配池里面判断是否够空间放下当前存储的数据,如果不够则重新去申请8KB的内存空间,把数据存储到新申请的空间里面,如果足够写入则直接写入数据到内存空间里面,下图为其内存分配策略...看内存分配策略图,如果当前存储了2KB的数据,后面要存储5KB大小数据的时候分配池判断所需内存空间大于4KB,则会去重新申请内存空间来存储5KB数据并且分配池的当前偏移指针也是指向新申请的内存空间,这时候就之前剩余的...这里内部 parent属性指向的 SlowBuffer对象来自 Node自身 C++的定义,是 C++层面的 Buffer对象,所用内存不在 V8的堆 内存分配的限制 此外, Buffer单次的内存分配也有限制...当进行小频繁的 Buffer操作时,采用的是 8KB为一个单元的机制进行预先申请和事后分配,使得 Javascript到操作系统之间不必有过多的内存申请方面的系统调用。...c++堆外分配内存,并且 Google也对 String进行优化,实际的拼接测速对比, String比 Buffer快。

1K20
  • 程序员面试闪充--iOS密码

    最后2个零值只是为了Base64编码补充的,原始字符并没有对应的字符,那么Base64编码结果的最后两个字符 AA 实际不带有效信息,所以需要特殊处理,以免解码错误。...因为 = 字符并不在Base64编码索引表,其意义在于结束符号,Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。...当用户进行注册、登录操作时,我们可以直接对密码进行MD5操作,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,系统并"不知道"用户的密码是什么。...所以就算黑客中途截取了密码的密文 也能在1分钟只能破译才能有效,大大加强了安全性。...软件及硬件上都能快速地加解密且只需要很少的存储资源。 AES的使用:除了类库本身只有Config类里面包含AESCrpt.h,只有两个方法用到。

    1.5K110

    iOS Keychain编程指南

    用户可以用一个密码来解锁Keychain,然后任何Keychain服务感知的应用程序都可以使用该Keychain来存储和检索密码。...获取钥匙串项目中的属性和数据 更改钥匙串项目中的属性和数据 注意:iOS,Keychain权限取决于用于签署应用程序的供应配置文件。...确保不同版本的应用程序始终使用相同的配置文件。 三、APP中使用Keychain 钥匙串项目可以具有几个类型之一。...网络密码用于通过网络访问的服务器和网站,普通密码用于任何其他受密码保护的服务(如数据库或调度应用程序)。 同时,用于建立信任的证书,密钥和身份也可以存储钥匙串。...如果密码不在keychain上,则SecItemCopyMatching返回errSecItemNotFound结果代码。在这种情况下,App显示一个对话框来请求用户名和密码

    92520

    XML解析方式及GData框架使用一、概念二、XML解析SAM方式(只读)三、DOM方式解析(可读写)四、GData写入功能,生成XML

    一、概念 1、XML概念: Extensible Markup Language(可扩展标记语言) HTML (超文本标记语言) 非常类似于HTML,HTML的作用是显示数据,XML的目的是存储和传输数据...,只读 DOM : mac上的解析方式,iOS无法直接使用,解析过程内存占用大,读写 SAX的解析步骤: 加载xml数据 找开始节点(包括节点的属性) 找节点之间的内容 找结束节点 重复2、3、...4步骤,直到最后一个节点,解析结束 例子:解析XML文档到模型 注意:KVC的所有属性要用copy,不然拼接字符串会导致模型的值为空(因为KVC只是改变指针指向,不是赋值) @property...解析出错时执行 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { } ---- 三、DOM方式解析(可读写...) DOM方式的解析 Document Object Model DOM--文档对象模型(文档树模型) 一次性把xml全部加载到内存内存消耗大 之前的SAX方式只能读取XML,DOM可以修改,

    1.2K60

    class_ro_t 的探索

    WWDC2020有一个视频讲的是关于Objective—C 在运行时的一些优化,本篇文章是对视频中讲到的的部分知识点进行探索。...3.为什么 class_ro_t 已经存储了 Methods,Protocols,Properties, class_rw_t 还要存储这些?...class_rw_t 是可读可写的,它信息的存储是在运行的时候,需要用到的时候才会写入,并且一直存在于内存。...可以看到分类添加实例变量语法都不过,那我们只能添加属性了,但其实大概也能猜出来添加属性就算语法过了,class_ro_t 也不会存储。先来验证一下吧。...,但是这个 list 源码是 list[0],我们把 list[0] 打印出来试试: 打印出来是protocol_ref_t,我们再去看源码 protocol_ref_t 是什么结构: 我们发现

    41210

    OC - 属性关键字和所有权修饰符

    1.2 读写权限 属性关键字 用法 readwrite 可读可写(默认),同时生成 setter 方法和 getter 方法的声明和实现。...这些关键字可以用于属性、方法返回值和参数,来指定对象的可空性,这样编写代码的时候就会智能提示。 Swift 可以使用!和?...为了安全起见,苹果还制定了以下几条规则: typedef类型的的可空性通常依赖于上下文,即使 Audited Regions 也不能假定它为nonnull; 对于复杂的指针类型(如id *)必须明确指定它的可空性...__autoreleasing MRC 我们可以给对象发生 autorelease 消息来将它注册到 autoreleasepool ,而在 ARC 我们可以使用 __autoreleasing...1.weak可以修饰对象,assign既可以修饰对象也可以修饰基本数据类型; 2.assign修饰的对象在被释放后,指针仍然指向原对象地址;weak修饰的对象在被释放之后会自动置指针为 nil; 3

    1.4K31

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

    void anti_debug() //一般的函数调用都会通过call的方式来调用,hacker很容易对一个函数做手脚,如果是以inline的方式编译的,会把该函数的code拷贝到每次调用该函数的地方;static...} @end II 敏感信息的安全设计Checklist 临时产生的敏感数据(写入内存或文件),应具有及时清除和释放机制 不要在 HTTP GET 请求参数包含敏感信息,如用户名、...密码、卡号、ID等 禁止表单的自动填充功能,因为表单可能包含敏感信息,包括身份验证信息 不要在客户端上以明文形式保存密码或其他敏感信息 为所有敏感信息采用SSL加密传输 禁止将敏感信息(包含加密秘钥等...)硬编码程序 不要在日志中保存敏感信息,包含但不限于系统详细信息、会话标识符、密码等 禁止异常泄露应用服务器的指纹信息,如版本,路径,组件版本等 禁止将源码或sql上传到开源平台或社区,如github...、CSDN 请求中含有敏感参数(如订单号、ID等),应进行混淆方式处理,防止产生参数遍历获取信息风险 iOS敏感逻辑的保护方案:【把函数名隐藏在结构体里,以函数指针成员的形式存储】 敏感信息需要展示web

    1.1K10

    内存管理、属性关键字

    copy会重新开辟一个内存空间,复制将内容复制过去。Strong是将指针指过去而已。...而且是strong类型的 } Runtime维护了一个Weak表,用于存储指向某个对象的所有Weak指针。...与weak的区别在于,weak修饰的引用被释放后会自动置为nil,assign不会,这样会导致野指针 readonly 只读 只会生成getter方法 readwrite 可读写 默认属性 四、其他关键字...1、Static 保证局部变量永远只初始化一次,程序的运行过程永远只有一份内存 先看一下区别 for (int i = 0; i < 10; i ++) { int a...h文件extern声明一些全局的常量 .h声明一些全局常量 extern NSString * const name;extern NSInteger const count; 然后.m文件中去实现

    43720

    YYCache 源码剖析:一览亮点

    日常开发业务使用,多是直接操作 YYCache 类,该类是对内存缓存功能和磁盘缓存功能的一个简单封装。...基于第2点的分析,可能有人会疑问为什么作者要在主线程做内存修剪的操作?如果创建一个串行的队列,然后该队列执行这些逻辑不是可以不使用锁就能保证线程安全了么?...磁盘缓存的核心类是 YYKVStorage,注意该类是非线程安全的,它主要封装了 SQLite 数据库的操作和文件存储操作。 后文的剖析大部分的代码都是 YYKVStorage 文件。...在数据库,建了一个表,表的结构如上代码所示: key 唯一标识 size 当前内存块的大小。 inline_data 使用者存储内容(value)的二进制数据。...table),存储数据的二进制文件,却根据情况分别处理:要么存在数据库表的 inline_data 下,要么直接存储 /data 文件夹下。

    1.4K61

    iOS-Foundation框架中常用的类

    NSString NSString创建与内存存储 NSString是1个数据类型,用来保存OC字符串,NSString的本质是1个类,既然是1个类,所以,最标准的创建NSString对象的方式如下: NSString...当系统准备要在内存创建字符串对象的时候,会先检查内存是否有相同内容的字符串对象,如果有,直接指向该内存区域,如果没有才会重新创建。...str1与str2指向相同的地址 注意:存储常量区的数据不会被回收. 所以存储常量区的字符串对象也不会被回收. NSString类的常用方法 使用拼接的方式创建1个NSString对象。...因此NSArray不能存储nil,会将nil作为元素结束的标志,并且NSArray只能存储OC对象,nil等于0为基本数据类型。...以键值对的形式存储数据,唯一的key对应value,通过key来找到存储字典的value。

    1.7K100

    声明NSString属性的时候到底要不要采用copy限定词?

    通过这些文章,我们有了一个共识:声明NSString类型的属性的时候需要采用copy内存管理策略。...需要注意的是,我上面说的是针对于一般的业务场景开发过程OC的语法层面,父类指针是可以指向子类对象的,如果现在是开发一个工具,或者一个基准类,那么是不在本文的讨论范围之内的。...封装的场景,我们声明一个NSString类型的属性,它可能会指向NSString类型的变量,也可能会指向NSMutableString的对象,此时必须要使用copy,这一点问题没有。...但是日常的业务场景,我们遇到的场景基本都是确定的,我们会明确地知道最终传递给NSString类型的指针的变量到底是NSString还是NSMutableString,这样的话,我们最终赋值的时候就完全可以手动将变量转换一下...一句话总结:封装基类不在本问题的讨论范围之内,我们讨论的是日常业务场景下的NSString内存管理策略,日常的业务场景基本都是确定的场景,我们会明确知道最终传递给NSString指针的到底是NSString

    22340

    FMDB 使用注意点

    关于FMDB最基本的使用我们就不在说了,这个网上大把的文章介绍,我就在这里总结几点我最近在写一个小东西的时候注意到的一点点东西: 一: 怎么看真机上SQLite数据库 我们开发的过程中肯定有使用到真机测试...在数据库操作,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,关系数据库,一个事务可以是一条SQL语句、一组SQL语句或整个程序。   ...数据库的插入操作是比较耗时的,假如我们一次性主线插入几百几千条数据,由于比较较慢就会造成主线程阻塞。那么这时候可以开启一个事物来进行操作。   ...当用事物的形式提交,开始事务后,进行的大量操作语句都 保存在内存,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。...事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储的数据处于一致状态。保证数据的无损。

    97130

    iOS缓存 NSCache详解及SDWebImage缓存策略源码分析你要知道的NSCache都在这里

    ,最重要的是它是线程安全的,NSMutableDictionary不是线程安全的,多线程环境下使用NSCache是更好的选择。...,目的就是为了收到系统内存警告后进行内存的清理工作。...//还有可能是内存缓存的对象被删除了,然后磁盘中找到了,此时也需要设置一下 //setObject:forKey:cost方法的时间复杂度是常量的,所以哪怕内存中有也无所谓...//如果内存缓存没有再去磁盘查找 image = [self imageFromDiskCacheForKey:key]; return image; } //磁盘中所有的保存路径...淘汰算法来剔除超过限制的缓存对象,使用pthread_mutext互斥锁来保证线程安全,包括释放对象使用了一个小技巧使得可以子线程释放,不需要在主线程执行,直接访问ivar不使用getter/

    3.9K93

    如何提高代码的可读性? - 读《编写可读代码的艺术》

    软件历史,有许多影响深远的重大失败,其根源往往是编码细节出现了疏漏。 因此笔者认为代码的可读性可以作为考量一名程序员专业程度的指标。 或许已经有很多同行也正在努力提高自己代码的可读性。...clip:类似的,到底是原来的基础上截掉某一段还是另外截出来某一段呢?同样也不推荐使用。 布尔值:read_password:是表达需要读取密码,还是已经读了密码呢?...如何声明与使用变量 写程序的过程我们会声明很多变量(成员变量,临时变量),而我们要知道变量的声明与使用策略是会对代码的可读性造成影响的: 变量越多,越难跟踪它们的动向。...除了减轻了内存和处理器的负担(因为不需要开辟新的内容来存储结果变量以及可能不用完全走遍整个的for语句),阅读代码的人也会很快领会代码的意图。...列对齐 声明一组变量的时候,由于每个变量名的长度不同,导致了变量名左侧对齐的情况下,等号以及右侧的内容没有对齐: NSString *name = userInfo[@"name"]; NSString

    1.1K10

    iOS - 老生常谈内存管理(五):Tagged Pointer

    引入 Tagged Pointer 技术之前 NSNumber等对象存储堆上,NSNumber的指针存储的是堆NSNumber对象的地址值。 从内存占用来看 基本数据类型所需的内存不大。...引入 Tagged Pointer 技术之后 NSNumber等对象的值直接存储了指针,不必堆上为其分配内存,节省了很多内存开销。...number4由于数据过大,指针的8个字节不够存储,所以堆中分配了内存。 注意: MacOS与iOS平台下的Tagged Pointer有差别,下面会讲到。...number4由于数据过大,指针的8个字节不够存储,所以堆中分配了内存。 最后一位用来表示数据类型。 第一位b的二进制为1011,其中第一位1是Tagged Pointer标识位。...存储堆空间的对象由于内存对齐,它的内存地址的最低有效位为 0。由此可以辨别Tagged Pointer和一般对象指针。

    1.8K60

    Block 详解

    操作 开始研究Block的copy操作之前,先来思考一下:Block是存储栈上还是堆上呢?...栈块存在于栈内存, 超出其作用域则马上被销毁 堆块存在于堆内存, 是一个带引用计数的对象, 需要自行管理其内存 简而言之,存储的Block就是栈块、存储的就是堆块、既不在不在的块就是全局块...遇到一个Block,我们怎么这个Block的存储位置呢? (1)Block不访问外界变量(包括栈中和堆的变量) Block 既不在栈又不在代码段,ARC和MRC下都是如此。此时为全局块。...ARC 环境下:访问外界变量的 Block 默认存储(实际是放在栈区,然后ARC情况下自动又拷贝到堆区),自动释放。 ARC下,访问外界变量的 Block为什么要自动从栈区拷贝到堆区呢?...虽然Block也是以对象的身份存在,但是栈块没有引用计数,因为不需要,我们都知道栈区的内存由编译器自动分配释放。

    1.1K50

    HTTP协议的401授权认证机制iOS上的实现

    我们在用NSURLConnection或者NSURLSession进行HTTP请求时,有些URL因为需要授权认证返回401,因此客户端需要在HTTP的请求头中带上用户和密码进行授权认证(具体查看这里)...可以通过如下函数来建立挑战凭证 //通过用户密码建立凭证,这种用于401错误的挑战凭证和代理的挑战凭证 (id)initWithUser:(NSString*)user password:(NSString...NSURLCredentialPersistenceForSession, //只本次会话中有效 NSURLCredentialPersistencePermanent //永久有效,保存在钥匙串,...其他也有效 为什么服务器信任的凭证不需要保存到存储,原因是服务器信任的凭证总是从服务器下发给客户端的 为什么要有保存策略呢?...也就是客户端处理willSendRequestForAuthenticationChallenge函数的最后必须指定接收挑战的方式。客户端可以调用sender的协议指定的方法来执行接收挑战的方式。

    1.3K30

    iOS-代码规范

    所以首先是为人编写程序,其次才是计算机: 不要过分追求技巧,降低程序的可读性。 简洁的代码可以让bug无处藏身。要写出明显没有bug的代码,不是没有明显bug的代码。...尽量使用不可变对象 建议尽量把对外公布出来的属性设置为只读,实现文件内部设为读写。具体做法是: 头文件,设置对象属性为readonly。 实现文件设置为readwrite。...如果在公开部分只能设置其为只读属性,那么就在非公开部分存储一个可变型。...如果你成功定义了一个新的指定初始化方法并能保证调用者一定能调用它,你最好要在文档明确写出哪一个才是你定义的新初始化方法。...*employer;//将EOCEmployer作为属性 @end // EOCPerson.m #import "EOCEmployer.h" 这样做有什么优点呢: 不在A的头文件引入B的头文件

    2.2K20

    iOS 代码规范

    所以首先是为人编写程序,其次才是计算机: 不要过分追求技巧,降低程序的可读性。 简洁的代码可以让bug无处藏身。要写出明显没有bug的代码,不是没有明显bug的代码。...尽量使用不可变对象 建议尽量把对外公布出来的属性设置为只读,实现文件内部设为读写。具体做法是: 头文件,设置对象属性为readonly。 实现文件设置为readwrite。...如果在公开部分只能设置其为只读属性,那么就在非公开部分存储一个可变型。...如果你成功定义了一个新的指定初始化方法并能保证调用者一定能调用它,你最好要在文档明确写出哪一个才是你定义的新初始化方法。...*employer;//将EOCEmployer作为属性 @end // EOCPerson.m #import "EOCEmployer.h" 这样做有什么优点呢: 不在A的头文件引入B的头文件

    2.4K20
    领券