iOS NSCoding与NSSecureCoding 使用

本文对比了iOS中NSCoding与NSSecureCoding的区别及应用。NSCoding提供了一种简单的对象归档方式,而NSSecureCoding在此基础上增加了安全性检查,防止数据被恶意篡改。通过示例代码展示了两种归档方式的具体实现。

iOS NSCoding与NSSecureCoding

NSCoding与NSSecureCoding相比于NSSecureCoding 更安全。防止替换攻击,保证你读到的数据正是你写入的数据

NSCoding

@implementation People 
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:NSStringFromSelector(@selector(name))];
    [aCoder encodeObject:self.age forKey:NSStringFromSelector(@selector(age))];
}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(name))];
        self.age = [aDecoder decodeObjectForKey:NSStringFromSelector(@selector(age))];
        }
        return self;
}
@end
#
People *p1 = [People new];
p1.name = @"A";
p1.age = @5;

People *p2 = [People new];
p2.name = @"B";
p2.age = @6;

NSArray *dataArray = @[p1,p2];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray];
NSLog(@"data:%@",data);

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"datArray:%@",array);

NSSecureCoding

@implementation SecurePeople

+ (BOOL)supportsSecureCoding
{
    return YES;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:NSStringFromSelector(@selector(name))];
    [aCoder encodeObject:self.age forKey:NSStringFromSelector(@selector(age))];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectOfClass:[NSString class] forKey:NSStringFromSelector(@selector(name))];
        self.age = [aDecoder decodeObjectOfClass:[NSString class] forKey:NSStringFromSelector(@selector(age))];
    }
    return self;
}

@end
#
SecurePeople *secureP1 = [SecurePeople new];
secureP1.name = @"A";
secureP1.age = @(49);

SecurePeople *secureP2 = [SecurePeople new];
secureP2.name = @"B";
secureP2.age = @3;

NSArray *dataSecureArray = @[secureP1,secureP2];


NSData *secureData = [NSKeyedArchiver archivedDataWithRootObject:dataSecureArray];
NSLog(@"secureData:%@",secureData);
NSArray *asecureArray = [NSKeyedUnarchiver unarchiveObjectWithData:secureData];
NSLog(@"asecureArray:%@",((SecurePeople*)[asecureArray firstObject]).age);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值