网络安全

1 篇文章 0 订阅
1 篇文章 0 订阅

网络安全问题

归根结底为两个网络安全问题

  1. 本地存储的用户名和密码等敏感信息—可以通过查看用户的偏好设置进行破解

    • 可以通过 软件iFunBox 查看指定应用的偏好设置.也就是说,一旦别人接触你的手机,并破解锁屏密码,那么手机中任何账户密码都会暴露.
  2. 网络传输过程中,黑客通过某些技术手段可以拦截用户发送的敏感信息

    • 可以通过软件青花瓷来抓取应用发送接收请求时的数据,并有针对性的进行破解,从而获取敏感信息.即使是用 POST 方法也能查看明文信息

    • 为了能让青花瓷抓取到手机访问电脑上网页资源的请求信息,需要先用本机分享无线网络给手机,然后在手机上设置该 wifi 热点的代理电脑的 ip 地址

Base64

  • 既可以用来保存到本地,也可以用于网络传输加密.
  • 经过 base64机密后的字符串就不像之前的明文那样好理解,在一定程度上可保护个人隐私
  • 缺点 : 能编码,也能轻易解码

终端实现

  • 编码
    • echo -n “Amos” | base64
    • 结果:QW1vcw==
  • 解码
    • echo -n “QW1vcw==” | base64 -D
    • 结果:Amos

代码实现

  • 编码

    1. 先将字符串转换成 NSData
    2. 在用 data 对象的base64NSStringWithOption方法获取加密后的字符串

      • 代码如下
    - (NSString*)base64Encoder:(NSString*)originalString
    {
    //1.先转化成二进制数据
    NSData* data = [originalString dataUsingEncoding:NSUTF8StringEncoding];
    
    //2.利用 data 加密
    return [data base64EncodedStringWithOptions:0];
    }
  • 解码

    1. 先用NSData 的initWithBase64EncodedString创建一个对象data,此时data 已经是解码后的
      2.利用 data 创建一个 NSString 对象,就是解码后的明文

      • 代码如下
    - (NSString*)base64Decoder:(NSString*)encodedString
    {
    //1.根据加密的字符串创建二进制数据
    NSData* data = [[NSData alloc] initWithBase64EncodedString:encodedString options:0];
    
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }

MD5(主要用于密码)

散列(哈希)函数

  • 算法是公开的,对 所有语言都是通用的
  • 对任意一个二进制数据进行加密,都能得到相同长度(32位)的密文
  • 主要用于在网络传输中,用于密码加密
  • 网盘应用 因为相同文件的 MD5都一样,所以文件在网盘上只需要存放一份
  • 缺点:长度不够,国外已弃用,国内仍普遍使用

终端实现:

  • md5 -s “amos”

  • 打印结果:MD5 (“amos”) = 2869191f3991a5611e8991dd59f9987d

代码实现:

都需要导入一个工具包头文件: NSString+Hash.h,下载地址:哈希函数

  • 初步:

        NSString* originalString = @"amos";
        NSLog(@"加密后:%@", [originalString md5String]);
    • md5String 这个是从NSString+Hash.h定义的分类方法,可返回字符串32位的 md5密文
  • 加盐:

    在原有字符串后添加其他字符串(多为特殊字符串),增加穷举难度

    - (void)test
    {
        NSString* originalString = @"amos";
        [self hashTestWithString:originalString];
    }
    
        - (NSString*)hashTestWithString:(NSString*)originalString
    {
        //盐(干扰性字符串)---越咸越好
        NSString* salt = @"%@#^&";
    
        //加盐
        originalString = [originalString stringByAppendingString:salt];
    
        NSLog(@"加密后:%@", [originalString md5String]);
    
        return [originalString md5String];
    }
    • 结果:
    加密后:2869191f3991a5611e8991dd59f9987d
  • 多次 MD5

     NSLog(@"加密后:%@", [[originalString md5String] md5String]);
    • 结果:
    加密后:350e1165ed352f68a24744584140039f
  • 有序的乱序 MD5

        //加密源字符串,得到密文
    originalString = [originalString md5String];
    
    NSLog(@"乱序前:%@", originalString);
    
    1 //获取密文头部子字符串作为新密文尾部
    NSString* trail = [originalString substringToIndex:2];
    
    //获取密文尾部子字符串作为新密文头部
    NSString* header = [originalString substringFromIndex:2];
    
    NSLog(@"乱序后:%@", [header stringByAppendingString:trail]);
    
    //返回重新拼接的密文
    return [header stringByAppendingString:trail];
    • 结果:
     乱序前:2869191f3991a5611e8991dd59f9987d
     乱序后:69191f3991a5611e8991dd59f9987d28
  • 注意: 不管是用哪一种规则,都要保持客户端与服务器端相同,否则将无法匹配,因为 MD5加密是不可逆的.

钥匙串(苹果推荐,在 iOS7.0.3之后才能使用)

  • 主要用于保存到本地,将敏感信息交给钥匙串保管更安全
  • 使用钥匙串访问,使用的是 AES 256算法,能够保证密码安全
  • 钥匙串保存位置:未知,只有苹果知道
  • 钥匙串访问 SDK 在 iOS7.0.3之后才发布
  • 其接口是纯 C 语言的,有人封装成 OC, 使用很方便,名字是: SSKeyChain, 可以在 gitHub 上下载

  • 事例代码:

- (void)testKeyChain
{

    //1.保存账户和密码到钥匙串
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* appId = bundle.bundleIdentifier;

    [SSKeychain setPassword:@"amos" forService:appId account:@"username"];
    [SSKeychain setPassword:@"heheda" forService:appId account:@"password"];

    //2.从钥匙串中取出对应的账户和密码
    NSString* username = [SSKeychain passwordForService:appId account:@"username"];

    NSString* password = [SSKeychain passwordForService:appId account:@"password"];

    NSLog(@"从钥匙串中获取的账户名:%@", username);
    NSLog(@"从钥匙串中获取的密码:%@", password);
}
  • 打印结果:

    从钥匙串中获取的账户名:amos
    从钥匙串中获取的密码:heheda
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值