iOS 网络传输数据安全以及常用的加密算法使用

我们常说的数据安全:主要分为两种,数据本身的安全和数据防护安全。

数据本身的安全包括数据保密,数据完整性验证,数据双向认证等。

数据防护安全包括磁盘阵列,数据备份,异地容灾等。

App安全问题主要包括:
    App代码安全,包括代码混淆,加密或者app加壳。
    App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密。
    App网络传输安全,指对数据从客户端传输到服务器中间过程的加密,防止网络传输过程当中其他节点对数据的篡改。

我在这里主要想跟大家分享数据在网络传输过程中的安全问题。

数据安全简介

数据安全的基本概念

      数据安全:是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系,主要是有对称算法与公开密钥密码体系两种(非对称算法),都包含了数据的加密和解密过程。

      对称算法:对称密码算法有时又叫传统密码算法,是指加密密钥可以从解密密钥中推算出来,反过来也成立。

非对称算法:非对称密钥也叫公开密钥加密,就是不能由其中一个密钥推导出另一个密钥。 

      密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称 密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥)。
      明文:没有进行加密,能够直接代表原文含义的信息。
      密文:经过加密处理处理之后,隐藏原文含义的信息。
      加密:将明文转换成密文的实施过程。

      解密:将密文转换成明文的实施过程。

网络数据安全传输要实现的效果 

    例如数据从A传输到B,怎么才算安全传输。

        1.Message有A的电子签名,表明消息确实是来自A。
        2.Message没有被篡改过。
        3.Message被某种加密算法加密过,只有A和B知道如何解密。

数据安全的原则

1.在网络上不允许传输用户隐私数据的明文。(即:App网络传输安全,指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听)。
2.在本地不允许保存用户隐私数据的明文。(即:App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密)。
3.App代码安全。(即:包括代码混淆,加密或者app加壳)。

4.要想非常安全的传输数据,建议使用https。

5.防止中间人攻击,建议双向验证。 

常用的加密算法
1.编码方案:指定数据的编码格式,通过简单 BASE64编码防止数据明文传输。如 Base64编码方案。

    Base64可以成为密码学的基石,非常重要。它可以将任意的二进制数据进行Base64编码,并且所有的数据都能被编码为并只用65个字符(A~Z a~z 0~9 + / =)就能表示的文本文件。

    注意:对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。

    Base64编码原理:
        (1) 将所有字符转化为ASCII码
        (2) 将ASCII码转化为8位二进制
        (3) 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位
        (4) 统一在6位二进制前补两个0凑足8位
        (5) 将补0后的二进制转为十进制

        (6) 从Base64编码表获取十进制对应的Base64编码

    Base64处理过程:
        (1) 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
        (2) 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
        (3) 不断进行,直到全部输入数据转换完成。
        (4) 如果最后剩下两个输入数据,在编码结果后加1个“=”;
        (5) 如果最后剩下一个输入数据,编码结果后加2个“=”;

        (6) 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

2.哈希算法:通过使用安全散列算法,计算出一个数字消息所对应到的长度固定的字符串,进行数据完整性校验。如:MD2、MD4、MD5(消息摘要算法),SHA1,SHA256 等。

    哈希算法:哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。

哈希值是一段数据唯一且极其紧凑的数值表示形式。数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。哈希算法是一种摘要算法,主要作用是用来获取数据的摘要。严格意义上来说不属于加密算法(因为没有解密过程)。

     MD5简介

    MD5:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。对输入信息生成唯一的128位散列值(32个字符),即 32个16进制的数字。(简单防篡改,安全性较低,优点:快速)。算法是公开的,对相同的数据加密,得到的结果是一样的;对不同的数据加密,得到的结果是定长的;MD5对不同的数据进行加密,得到的结果都是 32 个字符长度的字符串信息摘要,信息"指纹",是用来做数据识别的,不能逆推反算(重要)。

    MD5算法特点:
        压缩性:任意长度的数据,算出的MD5值长度都是固定的(16进制的32位数,二进制128位)。
        容易计算:从原数据计算出MD5值很容易。
        抗修改性:输入两个不同的明文不会得到相同的输出值,对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

        强抗碰撞:根据输出值,不能得到原始的明文,即其过程不可逆。已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

    MD5主要应用在数字签名、文件完整性验证以及口令加密等方面。

    注意:

    (1)开发中,一定要和后台开发人员约定好,MD5加密的位数是16位还是32位(大多数都是32位的),16位的可以通过32位的转换得到。

    (2)随着暴力破解网站的出现现在的MD5已不再是绝对安全,因此可以对MD5稍作改进,以增加解密的难度。MD5公认被破解不代表其可逆,而是一段字符串加密后的密文,可以通过强大运算计算出字符串加密后的密文对应的原始字符串,但也不是绝对的被破解。MD5加密区分大小写,使用时要和后台约定好。

        PS.暴力破解是指通过将明文和生成的密文进行配对,生成强大的数据库,在数据库中搜索,在这里就可以破解密码。破解网址 http://www.cmd5.com

        解决:加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5(先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序)

    (3)介绍四种提升MD5加密安全方案:

        a:先明文加盐,然后再进行MD5。即明文后拼接字符串(此时拼接的字符串要 足够长+足够咸+足够复杂),再进行MD5加密。

        b:先加密+后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序.

        c:乱序+加盐+多次MD5加密等.

        d:使用消息认证机制HMAC:给定一个"秘钥",对明文进行加密,并且做"两次散列"!-> 得到的结果,还是 32 个字符,相对安全(KEY是服务器传给你的,不是你写死的).

        PS:消息的发送者和接收者有一个共享密钥,发送者使用共享密钥对消息加密计算得到MAC值(消息认证码),消息接收者使用共享密钥对消息加密计算得到MAC值,比较两个MAC值是否一致,使用客户端需要在发送的时候把(消息)+(消息·HMAC)一起发送给服务器,服务器接收到数据后,对拿到的消息用共享的KEY进行HMAC,比较是否一致,如果一致则信任。

3.对称加密算法 DES、AES

    对称加密的安全性全系于加密密钥的管理,在非对称加密算法出现之前,如何动态的协商密钥一直是个难题,大部分的应用场景都是采用通信双方通过其他手段预先交流密钥的方式。一旦密钥泄漏,就会导致严重的安全事故。

    对称加密算法常用的有AES和DES

        DES 数据加密标准:DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密。3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。

        AES 高级加密标准:AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。

    对称加密的特点:
        (1)加密/解密使用相同的密钥
        (2)加密和解密的过程是可逆的
    过程:
        (1)加密过程是先加密,再base64编码
        (2)解密过程是先base64解码,再解密
4.非对称加密算法(公开密钥加密)。常用算法有 RSA、ECC、ElGamal、背包算法、Rabin等,iOS中用的最多的是RSA。

    非对称加密是:一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。

    使用公开加密方式中的公钥和私钥可以进行数字签名,原理是这样子的:用私钥加密的信息,可以用公钥对其解密,用于客户验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。例如,从网上下载的安装程序,一般都带有程序制作者的数字签名,可以证明该程序的确是该作者(公司)发布的而不是第三方伪造的且未被篡改过(身份认证/验证)。

    RSA加密的基本原理 :RSA使用"密匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key).
公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端.
私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题.

关于RSA这种非对称加密算法,在使用当中其主要作用有2个:
    信息加密:通信双方可以在公开的网络环境下,“安全”的商量对称加密算法所使用的密钥。
    电子签名:为了防止中间人攻击,通信双方在商量密钥之前可以通过签名算法确认对方的身份。

    非对称加密算法本身是一种加密算法,但由于RSA本身加解密的性能在现在的计算机硬件条件下存在一定瓶颈,同时对加密数据的“安全长度”也有限制,被加密数据的长度一般要求不超过公钥的长度。所以RSA更多的是被用来商量一个密钥,如果密钥是安全的,那么后续的通信都可以使用上面提到的AES来完成,AES在性能上不存在瓶颈。

    RSA算法最经典也是最广泛的应用场景是HTTPS,HTTPS的安全握手流程完整的阐释了“加密”和“签名”这两个概念。

    RSA有另一个竞争者ECC,ECC现在使用也越来越广泛。二者在安全性上都不存在问题。不过ECC额外的优势,公钥私钥的生成速度快于RSA,在需要大量生产密钥对的业务场景下ECC会是更好的选择。ECC的最短安全公钥也比RSA要短的多,224bits的ECC公钥就已经足够安全,而同等级别的RSA公钥需要长达2048bits。RSA由于实现简单,出现较早,可以预见在很长一段时间内都将和ECC共存。

    注:生成公私匙的方法,执行 项目 根目录中 keypair/keypair.sh 脚本即可。在MAC上生成三个.pem格式的文件,一个公钥,两个私钥,都可以在终端通过指令vim xxx.pem 打开,里面是字符串,第三步生成的私钥是java端用来解密数据的,第五步转换格式的私钥iOS端可以用来调试公钥、私钥解密(因为私钥不留在客户端)。 iOS端公钥加密私钥解密、java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不能私钥加密公钥解密,只能用于验签。

5.HTTPS HTTP+SSL协议

HTTPS简介
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
HTTPS:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
注意:HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的保护。
        HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSign、Microsoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,这样一般在客户端是不被信任的。所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。
HTTPS和HTTP区别:
    (1).https协议需要到ca申请证书,一般免费证书很少,需要交费。
    (2).http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
    (3).http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    (4).http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    注意:iOS9中新增App Transport Security(简称ATS)特性, 让原来请求时候用到的HTTP,全部都转向TLS1.2协议进行传输。这意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。如果我们在iOS9下直接进行HTTP请求是会报错。系统会告诉我们不能直接使用HTTP进行请求,需要在Info.plist中控制ATS的配置。
        "NSAppTransportSecurity"是ATS配置的根节点,配置了节点表示告诉系统要走自定义的ATS设置。
        "NSAllowsAritraryLoads"节点控制是否禁用ATS特性,设置YES就是禁用ATS功能。

6.钥匙串加密

    钥匙串(Keychain):是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中和iOS7之后被导入,并且包括在了所有后续的各版本中。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。

    钥匙串加密:保存在钥匙串的内容相当于系统对其做了保护,在设备锁定时进行了加密处理。钥匙串中的条目称为SecItem,但它是存储在CFDictionary中的。SecItemRef类型并不存在。SecItem有五类:通用密码、互联网密码、证书、密钥和身份。在大多数情况下,我们用到的都是通用密码。
    钥匙串的使用和字典非常的相似,用原生的 Security.framework 就可以实现钥匙串的访问、读写。但是只能在真机上进行。通常我们使用KeychainItemWrapper来完成钥匙串的加密。

实践:

    本文档相关数据加密算法的使用的项目已公开到Github。希望大家多多指正。

    Github地址:https://github.com/tiangegege/ZGNetDataSafety


猜你喜欢

转载自blog.csdn.net/gulanggege/article/details/79556534