网络安全

来源:互联网 发布:网络贸易 编辑:程序博客网 时间:2024/06/10 10:06

网络安全问题

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

  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
0 0
原创粉丝点击