NSUserDefault的使用(转)

最常用的是MD5和base64编码,还有DES 3DES AES加密

ios怎么实现RAS加密解密

最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。  第一步,制作自签名的证书  1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。  openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650  按照命令行的提示输入内容就行了。  几个说明:  public_key.der是输出的自签名的x509证书,即我们要用的。  private_key.pem是输出的私钥,用来解密的,请妥善保管。  rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。  -days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。  事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)  1)创建私钥  openssl genrsa -out private_key.pem 1024  2)创建证书请求(按照提示输入信息)  openssl req -new -out cert.csr -key private_key.pem  3)自签署根证书  openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650  2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。

  第二步,使用public_key.der来进行加密。  1.导入Security.framework。  2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。  3.从public_key.der读取公钥。  4.加密。  下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)RSA.h////  RSA.h//#import <Foundation/Foundation.h>

@interface RSA : NSObject {    SecKeyRef publicKey;    SecCertificateRef certificate;    SecPolicyRef policy;    SecTrustRef trust;    size_t maxPlainLen;}

- (NSData *) encryptWithData:(NSData *)content;- (NSData *) encryptWithString:(NSString *)content;

@end

RSA.m////  RSA.m//#import "RSA.h"

@implementation RSA

- (id)init {    self = [super init];

    NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"                                                     ofType:@"der"];    if (publicKeyPath == nil) {        NSLog(@"Can not find pub.der");        return nil;    }

    NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];    if (publicKeyFileContent == nil) {        NSLog(@"Can not read from pub.der");        return nil;    }

    certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);    if (certificate == nil) {        NSLog(@"Can not read certificate from pub.der");        return nil;    }

    policy = SecPolicyCreateBasicX509();    OSStatus returnCode = SecTrustCreateWithCertificates(certificate, policy, &trust);    if (returnCode != 0) {        NSLog(@"SecTrustCreateWithCertificates fail. Error Code: %ld", returnCode);        return nil;    }

    SecTrustResultType trustResultType;    returnCode = SecTrustEvaluate(trust, &trustResultType);    if (returnCode != 0) {        NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);        return nil;    }

    publicKey = SecTrustCopyPublicKey(trust);    if (publicKey == nil) {        NSLog(@"SecTrustCopyPublicKey fail");        return nil;    }

    maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;    return self;}

- (NSData *) encryptWithData:(NSData *)content {

    size_t plainLen = [content length];    if (plainLen > maxPlainLen) {        NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);        return nil;    }

    void *plain = malloc(plainLen);    [content getBytes:plain                length:plainLen];

    size_t cipherLen = 128; // 当前RSA的密钥长度是128字节    void *cipher = malloc(cipherLen);

    OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,                                         plainLen, cipher, &cipherLen);

    NSData *result = nil;    if (returnCode != 0) {        NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);    }    else {        result = [NSData dataWithBytes:cipher                                 length:cipherLen];    }

    free(plain);    free(cipher);

    return result;}

- (NSData *) encryptWithString:(NSString *)content {    return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];}

- (void)dealloc{    CFRelease(certificate);    CFRelease(trust);    CFRelease(policy);    CFRelease(publicKey);}

@end

使用方法:RSA *rsa = [[RSA alloc] init];if (rsa != nil) {    NSLog(@"%@",[rsa encryptWithString:@"test"]);}else {    NSLog(@"init rsa error");}
时间: 2024-08-09 05:39:31

NSUserDefault的使用(转)的相关文章

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给

iOS开发——数据持久化Swift篇&amp;(一)NSUserDefault

NSUserDefault 1 2 //******************** 5.1 NSUserDefault和对象归档 3 func useNSUserDefault() 4 { 5 //通过单利来创建一个NSUserDefaults对象,全局变量NSUserDefault,可在整个项目传递变量 6 var userDefault:NSUserDefaults = NSUserDefaults.standardUserDefaults() 7 8 //通过init方法创建 9 var u

DataPersistence(数据持久化: 文件读写, NSUserDefault, 归档)

 DataPersistence(数据持久化) 1.数据持久化?   数据永久的保存 2.为什么要做数据持久化?   要把之前的操作(存档, 记录等)保存起来 3.为什么数据之前保存不了呢?   以前的数据都存在内存中, 程序一旦终止, 内存就会被收回 4.数据保存到哪里, 才能做数据持久化   把数据存到硬盘里 5.存到硬盘的哪个位置呢?   沙盒机制: iOS会为每一个应用, 单独创建一个文件夹(沙盒), 这个文件夹只允许当前应用访问 6.如何通过代码获取路径? 7.沙盒文件夹又分了多个子文

NSUserDefault

NSUserDefault是Cocoa提供的默认应用程序状态保持接口.它提供了简化的plist文件持久化方法.通过NSUserDefault类,你可以把用户首选项保存到plist文件中.到应用程序结束,这些数据依然存在,并可在应用程序启动时,再次吧上次运行的状态显示到应用程序中(NSUserDefault把plist文件存储到沙盒中的Library/Preference目录下,这个plist文件一直存在,知道你删除应用程序) 1.获取UserDefaults 要想获取到一个UserDefault

NSUserDefault 保存自定义对象

由于NSUserDefaults 不支持保存自定类,保存的对象需要实现NSCoding协议,不过自定的类型就算实现了NSCoding也不可以保存,可以通过以下方法实现: //h文件 #import <Foundation/Foundation.h> @interface People : NSObject<NSCoding> @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *age

NSUserDefault的使用

NSUserDefaults 在我们编写代码中是最常用的一个永久保存数据的方法,也是最简单的. 使用NSUserDefault需要注意: 1.数据的本地化保存不是实时的,如果需要实时保存,调用synchronize方法. 2.保存的数据必须是“不可变的”. 3.保存数据数据使用 setObjectforKey(不同数据类型提供了不同的方法,例如保存Integer使用SetIntegerforKey等),同理读取使用ObjectforKey(IntegerforKey). - (void) btn

把自己定义的实体用NSUserDefault保存起来

NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: [cpp] view plaincopy NSString *string = [NSString stringWithString @"hahaha"]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setObject:string forKey:@"myKey"]; N

iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,

iOS开发数据持久化技术01——NSUserDefault介绍

有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 首先说下什么是数据持久化技术 NSString *str = @"hello world"; ->内存 实际上就是将数据存储到硬盘上,针对于iOS应用程序是存储到沙盒中. . NSUserDefault介绍 1 是系统提供的自定义的类,可以随时在需要使用的地方声明对象,并随时需要的时候取出对象 2 支持的对象类型:NSString, NSNumber, NSData,

IOS问题汇总:2015-1-9 NSUserDefault (转)

NSUserDefault NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: [cpp] view plaincopyNSString *string = [NSString stringWithString @“hahaha”]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [ud setObject:string forKey:@“myKey”]; NSS