网络安全传输(读书笔记)

服务器验证

    
    通过创建NSURLProtectionSpace,来确认用户访问的是安全的服务器。从一个需要验证的服务器请求资源,过程如下:

    当服务器收到请求,响应发出HTTP状态码401,报头:WWW-AuthenticateNSURLConnection接收到后,告知APP调用willSendRequestForAuthenticationChallenge:;验证服务器工作就在这个函数中完成。
实现委托:
 - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
通过验证全部或部分属性,保证APP只连接指定服务器。

1.验证服务器全部属性

  创建信任的服务器的protection space:
NSURLProtectionSpace *defaultSpace = [[NSURLProtectionSpace alloc] initWithHost:@"yourbankingdomain.com"
                                                                           port:443
                                                                       protocol:NSURLProtectionSpaceHTTPS
                                                                          realm:@"mobile"
                                                           authenticationMethod:NSURLAuthenticationMethodDefault];

    然后验证challenge.protectionSpace是否是这个信任的服务器的protection space。

2.验证部分指定的服务器属性

  获取challenge.protectionSpace的各个属性,如: challenge.protectionSpace.host,challenge.protectionSpace.port,
challenge.protectionSpace.protocol等。依次检查各个属性是否是指定值,即可。

每一个网络连接操作都是NSOperation,在后台线程执行,所以,如果这些过程中需要更新UI,需要特别注意要在主线程中完成。服务器验证很重要,但其本身不足以防范所有攻击。例如,它不能防止网络通信被偷听。


HTTP认证

两种认证方式:标准和加速。

1.标准认证模式--用户名/密码

标准认证模式有:
  • HTTP Basic Authentication(基本认证)
  • HTTP Digest Authentication(摘要认证)
  • NTLM Authentication (NTLM认证
    // HTTPBasic
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic) {
        // 验证
        if (challenge.previousFailureCount == 0) {
            NSURLCredential *creds = [[NSURLCredential alloc] initWithUser:username
                                                                  password:password 
                                                               persistence:NSURLCredentialPersistenceForSession];
            [challenge.sender useCredential:creds forAuthenticationChallenge:challenge];
        // 之前验证失败
        } else {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
        }
    }

2.客户端证书认证


(这一章就是个坑啊……我这种没恒心的人先跳过好了)


哈希(HASH)和加密(ENCRYPTION)保证数据完整性

    APP必须保证数据在传输过程中是安全的、不会被修改,利用哈希和加密算法可以保护数据。
1.哈希
    iOS CommonCrypto中包括常用的MD5、SHA-1、SHA-256和一些不常用的哈希算法。以MD5为例:
    NSString *str = @"test string";//原字符串
    const char *ptr = [str UTF8String];
    unsigned char buffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(ptr, strlen(ptr), buffer);
    NSMutableString *hashString = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];//经过哈希算法后的字符串
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [hashString appendFormat:@"%02x",buffer[i]];
    }
      哈希算法的结果长度一定,且不可逆,无法根据结果推断原文。
    哈希算法用于检测数据完整性时,将数据及数据经过哈希算法计算出的值一起明文发送给服务器,服务器接收到后对数据进行哈希计算,将得到的值与接收到的哈希值比较,如果不等则认为数据不完整。
    哈希算法可以应用于验证登录,用户注册时,将密码应用哈希算法计算出一个杂乱无章的值存储在数据库,每一次登录时,输入密码,然后将密码利用哈希算法计算出哈希值,与存储在数据库中的密码哈希值进行比较,相等,则登录成功。
2.加密
      加密算法的结果长度随原文长度变化,可以,可以根据结果推断出原文。
    加密发送的数据不是明文的,下图是数据传输过程中加密和解密的步骤示意图。可以看到,
加密过程中,
  1. 生成iv(初始向量)。
  2. 利用iv和加密key对数据进行加密。
  3. 根据HMAC key生成MAC,将加密后的数据、iv及MAC组成request body发送至服务器。
解密过程中,
  1. 根据共享的加密key、iv,解密数据。
  2. 利用共享的HMAC key和解密后的数据生成服务器端MAC。
  3. 比较两个MAC值是否相等,如果否,则认为数据不安全。
发送和接受方共有加密和解密过程中重要的值如MAC算法、E-KEY、HMAC-KEY等。


MAC(Message Authentication Codes)

    MAC用于检测数据是否被修改。计算MAC算法类似哈希算法,但是MAC是成对的,更安全。APP会计算一个MAC随请求一起发送,服务器也会计算一个MAC,两个MAC比较,如果不一致,则数据被修改了。iOS和大多数服务器支持HMAC(Hash-Based Message Authentication Code),它的强度取决于密钥和哈希算法强度。
    const char *ptr = [@"test string" UTF8String];
    const char *keyPtr = [kMACKey UTF8String];
    unsigned char buffer[CC_SHA256_DIGEST_LENGTH];
    
    // 计算哈希值
    CCHmac(kCCHmacAlgSHA256,            // 算法
           keyPtr, kCCKeySizeAES256,    // key 和 key的长度
           ptr, strlen( ptr ),          // 原字符串 和 原字符串长度
           buffer);                     // 哈希值,哈希值长度等于所采用的哈希算法摘要长度
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x",buffer[i]];
    }
MAC和上面HASH算法的区别在于多了一个key,从图6-2可以看出E-key和M-key并没有随着请求一起发送,而是在APP和服务器端被共享的,它对于保护数据不被攻击至关重要。

加密与解密算法

      已经生成了MAC,就可以对数据进行加密,然后将其发送至服务器。这里主要讨论两种加密方式:高级加密标准(Advanced Encryption Standard,AES)和数据加密标准(Data Encryption Standard,DES)。DES占用资源较大,不适合手机设备,而AES从速度、强度和资源占用方面更适合手机设备。Objective-C中,CommonCryptor库中CCCrypt函数,可以实现加密和解密操作。
以AES为例,加密过程,首先需要生成iv,这里利用SecRandomCopyBytes函数,创建一组随机字节。加密代码如下:
    NSMutableData *iv = [NSMutableData dataWithLength:kCCBlockSizeAES128];
    SecRandomCopyBytes(kSecRandomDefault,kCCBlockSizeAES128,iv.mutableBytes);
    NSString *str = @"test string";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyData = [kAESEncryptionKey dataUsingEncoding:NSUTF8StringEncoding];
    size_t dataMoved;
    NSMutableData *encryptedData = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
    CCCryptorStatus status = CCCrypt(kCCEncrypt,                    // 加密
                                     kCCAlgorithmAES128,            // 加密标准
                                     kCCOptionPKCS7Padding,
                                     keyData.bytes,
                                     keyData.length,
                                     iv.bytes,
                                     data.bytes,
                                     data.length,
                                     encryptedData.mutableBytes,
                                     encryptedData.length,
                                     &dataMoved);
    
    if (status == kCCSuccess) {
        encryptedData.length = dataMoved;
    }
    NSString *encryptedString = [encryptedData base64Encoding];
解密算法与加密类似,唯一区别在于,CCCrypt函数第一个参数指定为解密操作。
NSMutableData *decryptedData = [NSMutableData dataWithLength:encryptedData.length + kCCBlockSizeAES128];
    CCCryptorStatus result = CCCrypt(kCCDecrypt,                    // kCCEncrypt or kCCDecrypt
                                     kCCAlgorithmAES128,
                                     kCCOptionPKCS7Padding,         // Padding option for CBC Mode
                                     keyData.bytes,
                                     keyData.length,
                                     iv.bytes,
                                     encryptedData.bytes,
                                     encryptedData.length,
                                     decryptedData.mutableBytes,    // encrypted data out
                                     decryptedData.length,
                                     &dataMoved);                   // total data moved
    if (result == kCCSuccess) {
        decryptedData.length = dataMoved;
    }
    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",decryptedString);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 千锋网络安全笔记是一份非常有价值的资料,其内容丰富、全面、详细。笔记共涵盖了网络安全领域的各个方面,包括网络安全基础知识、网络攻击与防御技术、安全测试工具及漏洞挖掘技术等。这些内容涵盖了安全行业的方方面面,对于想要深入学习和掌握网络安全知识的人来说具有非常高的参考价值。 此外,千锋网络安全笔记还采用了非常清晰的分类和编排方式,让读者可以方便地找到自己需要的资料和信息。笔记中使用图文并茂的方式对一些知识点进行了详细讲解,并且还提供了大量的案例分析和实战练习,帮助读者更好地理解和掌握所学内容。 因此,千锋网络安全笔记无论是对于想要从事网络安全行业的初学者,还是对于有一定经验的从业者来说,都具有非常重要的参考和学习价值。希望更多的人可以利用这份优质资源,不断提高自己的网络安全专业知识和技能,为网络安全事业的发展做出更为重要的贡献。 ### 回答2: 千锋网络安全笔记pdf是一本重要的网络安全学习资料。该笔记详细介绍了网络安全的相关知识,包括网络攻击类型、防范措施、网络安全评估等方面。这本笔记不仅适合安全从业人员,也适合网络管理员和想要了解网络安全知识的普通用户。 该笔记内容详实,涵盖了多个方面。它是一本非常全面的学习笔记,内容包括网络安全基础知识和实战技巧。它还提供了许多经典案例,方便读者了解实际安全攻击情况。 千锋网络安全笔记pdf的特点是结构清晰,语言简明易懂。该笔记采用了图文并茂的方式,以图示和实例等形式,使复杂的技术知识变得简单易懂。每个章节都有练习部分,方便读者检验所学知识,并加深理解。 总的来说,千锋网络安全笔记pdf是一本不可或缺的网络安全学习资料。它能够帮助读者深入了解网络安全,了解现代网络攻击的方式以及防范措施。不但适合初学者阅读,也适合资深专业人士查阅,是一本涵盖广泛的网络安全实战手册。 ### 回答3: 千锋网络安全笔记是千锋教育机构的一本网络安全入门读物,该笔记涵盖了许多网络安全基础知识,如网络攻击、网络防御、密码学、漏洞利用、Web安全等。同时,笔记也提供了一些实践操作,方便读者进行一些实际的网络安全练习。 该笔记分为多个章节,每个章节都涵盖了一个特定的主题,例如网络攻击和防御、密码学基础、网络架构和拓扑、Web安全等。每个章节都有比较系统的知识点和案例分析,能够帮助读者对网络安全有一个更全面的认识和了解。 另外,千锋网络安全笔记还提供了后续学习的参考资料和一些重要的网络安全术语和标准,读者可以通过笔记中的参考链接和书籍推荐进一步深入学习和掌握更高级的网络安全技能。 总的来说,千锋网络安全笔记是一本入门级别的网络安全读物,适合初学者阅读,也能够为职业技术人员提供一些参考和提醒。读者可以通过笔记掌握网络安全的基本概念和操作技巧,并能在实践中不断提高自己的网络安全知识和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值