首先需要了解一下加密的方式
对称加密:密钥相同,加密和解密使用相同的密钥,加密速度快。(AES,DES,chacha20)
非对称加密:分公钥和私钥,一般公钥只能用来加密,私钥只能用来解密和生成公钥。加密速度比较低,私钥由自己生成,再由私钥生成公钥,将公钥分发出去。(RSA)
哈希:哈希是一种不可逆的数据散列,并不是加密(MD5,Sha系列,HMAC)
请求
通常在请求的时候,如果只使用对称加密,加密的key被破解之后,数据也会泄露。因为需要移动端和服务器端同时保存加密的key,所以存在泄露的可能。
那对数据全部使用非对称加密呢,RSA加密的数据大小是有限制的(1024size = 128byte - 11byte),加密的效率会大大降低。
哈希的方式呢,哈希是不可逆的(当然现在有一些网站对部分比较常见的数据是可以破解的)一般用来保存密码,密码存在服务器也是哈希过的,如果怕被破解,也可以和后端约定好做一些加盐的操作,这里就不细说了,回到加密和解密。
这里推荐的加密方式是,对称和非对称混合使用,这样不会更慢了嘛?
答案是不会,对称加密用来加密的是数据本身,非对称加密的是对称加密的key,网络请求的时候出现的数据
pram= [ key: 非对称加密后的数据(对称加密的key),data: 对称加密的数据(数据本身)]
唉唉唉,不对啊,这样本地不是还要保存对称加密的key嘛,被破解后照样不能保证数据安全啊!
稍等,稍等,对称加密的key是传给对方的数据,是一次性的产物,每次在网络请求的时候随机生成,A 在请求的时候,先生成一个随机的对称加密的key,使用这个随机的key对数据加密,加密完成之后,将key使用 B 分发的公钥加密,然后将数据和key包装起来传给 B 。B在获取到A的数据之后,先使用私钥解密对称加密的key,解密得到key之后,使用key解密数据。做到这一步就数据基本就很安全了。
在这之上还可以对数据进行签名,B在接收数据的时候可以先确认是不是A发送的消息,如果是那就解密,如果不是直接丢弃。
不管是服务器接收数据还是移动端接收数据,保护数据的安全是一定要做的。如果你觉得自己写加密比较麻烦的话,这里可以使用我封装的的一个swift加密框架。
链接奉上:GitHub - linnoIt/LinnoEncrypt
目前包含了iOS大多数的对称加密和哈希,以及非对称加密RSA,都是一句代码搞定。你可以随时对Data,Array,Dictionary,String加密和解密。
具体的使用可以查看单元测试中的文件。暂时只支持cocoapods和手动下载。
使用过程中如果有问题的话可以直接联系我或者在github提出问题。当然,如果有需要实现的其他加密方式也可以提,我会试试能不能完成。