首先上来就来说一下, iOS 常见的几种加密算法
* 哈希 (散列) 函数 : MD5,SHA
* 对称加密算法: DES,3DES,AES
* 非对称加密算法: RSA
一, 哈希 (散列) 函数
1,MD5
MD5 加密的特点:
1, 不可逆运算,
2, 对不同的数据加密的结果是定长的 32 位字符(不管文件多大都一样)
3, 对相同的数据加密, 得到的结果是一样的(也就是复制).
4, 抗修改性 : 信息 "指纹", 对原数据进行任何改动, 哪怕只修改一个字节, 所得到的 MD5 值都有很大区别.
5, 弱抗碰撞 : 已知原数据和其 MD5 值, 想找到一个具有相同 MD5 值的数据 (即伪造数据) 是非常困难的.
6, 强抗碰撞: 想找到两个不同数据, 使他们具有相同的 MD5 值, 是非常困难的.
所有的数据 (视频, 音频, 文件, 只要存在于硬盘或内存中的) 都是可以被 MD5 加密的, 得到的都是 32 个字符.
但是这是不安全的, 相对来说比较容易破解:
http://www.cmd5.com/
传统方法是加盐(Salt): 在明文的固定位置插入位数足够多, 足够复杂的随机串, 然后再进行 MD5.
2, 加 "盐"
可以加个 "盐" 试试,"盐" 就是一串比较复杂的字符串. 加盐的目的是加强加密的复杂度, 这么破解起来就更加麻烦, 当然这个 "盐" 越长越复杂, 加密后破解起来就越麻烦, 不信加盐后然后 MD5 加密, 再去到 md5 破解网站破解试试看, 他就没辙了!!!
哈哈, 这下应该安全了吧! 答案是否定的. 如果这个 "盐" 泄漏出去了, 不还是完犊子吗. 同学会问,"盐" 怎么能泄漏出去呢? 其实是会泄漏出去的. 比如苹果端, 安卓端, 前端, 后台等等那些个技术人员不都知道吗.. 都有可能泄漏出去. 又有同学说那就放在服务器吧, 放在服务器更加不安全, 直接抓包就抓到了!!!
加固定的 "盐" 还是有太多不安全的因素, 可以看出没有百分百的安全, 只能达到相对安全(破解成本> 破解利润), 所以一些金融的 App, 网站等加密比较高.
缺点: 盐是固定不变的, 一旦泄露后果不堪设想; 使用加盐通过 MD5 解密之后, 很容易发现规律从而破解.
3,SHA 加密
安全哈希算法 (Secure Hash Algorithm) 主要适用于数字签名标准 (Digital Signature Standard DSS) 里面定义的数字签名算法(Digital Signature Algorithm DSA). 对于长度小于 2^64 位的消息, SHA1 会产生一个 160 位的消息摘要. 当接收到消息的时候, 这个消息摘要可以用来验证数据的完整性. 在传输的过程中, 数据很可能会发生变化, 那么这时候就会产生不同的消息摘要. 当让除了 SHA1 还有 SHA256 以及 SHA512 等.
SHA1 有如下特性: 不可以从消息摘要中复原信息; 两个不同的消息不会产生同样的消息摘要.
4,HMAC 加密(其实就可以看成是在 加盐 加密基础上的一个算法)
HMAC: 给定一个密钥, 对明文加密, 做两次 "散列", 得到的结果还是 32 为字符串. 在实际开发中, 密钥是服务器生成, 客户端发送请求会拿到 KEY. 一个账号对应一个 KEY 以注册为例: 当用户把账号提交给服务器, 服务器会验证账号的合法性, 如果合法就会生成个 KEY 给客户端 (这个 KEY 只有在注册的时候会出现一次, 一个账号只对应一个 KEY); 客户端会用拿到的 KEY 给密码用 HMAC 方式加密(32 位字符串) 发给服务器, 最终服务器会保存这个 HMAC 密码. 这样就注册成功了! 以后再登录就会服务器就会比对这个 HMAC 密码是否相等决定能否登录成功.
这样一来好像安全了很多哎! 即使黑客拿到了客户 KEY, 也只能拿到一个用户的信息, 也就是说只丢失了一个客户的信息. 然而上面的加 "盐" 方式加密, 如果 "盐" 泄漏了, 那丢失的可是所有用户信息啊. 安全性有了很大提升有木有!!!
但是这还是不够安全, 还可以更佳安全!
以登录为例: 当用户点击登录时, 会生成 HMAC 密码, 然后用 HMAC 密码拼接上一个时间串(服务器当前时间, 201801171755, 只到分钟), 然后一起 MD5 加密, 最后客户端会把加上时间的 HMAC 值发给服务器; 这时候服务器也会用已经存起来的 HMAC 密码拼接上一个时间串(服务器当前时间), 然后一起 MD5 加密, 最后用这个加密后的 HMAC 值和客户端发来的进行 HMAC 值对比, 对此一样则登录成功!!!
疑问 1. 为什么一定要用服务器的时间呢?
答: 因为客户端可能会修改自己的手机时间, 以服务器为准比较好.
疑问 2. 如果网络有延迟怎么办?
答: 这里服务器可以对比两次, 再往后加一分钟对比一次. 试想一下如果网络延迟了两分钟, 还没请求到时间, 那这个网络也是够了!!!
疑问 3. 为什么不让服务器直接修改 KEY 呢?
答: 这样也能保证每次登录的 HMAC 值不一样? 注意: 这样做服务器会频繁的更新 KEY, 加大服务器的压力, 一般不会去更新, 除非更换密码才会更新. 当然服务器可以定期去更新 KEY, 这样安全等级又会提高, 更加安全!!
这个时候如果黑客拦截到了你加了时间戳的 HMAC 值, 不能在两分钟内破解密码, 那么他就永远登不进去了. 这个密码的破解难度是很大的, 代价也高, 这样是不是就很安全了, 是的, 这样就更加安全!!
这个举例是以 HMac MD5 的方式进行加密(加盐的更好展示方式)
如果用其他类型, 可以自行设置
二, 对称加密算法
对称加密 (也叫私钥加密) 指加密和解密使用相同密钥的加密算法. 有时又叫传统密码算法, 就是加密密钥能够从解密密钥中推算出来, 同时解密密钥也可以从加密密钥中推算出来. 数据发信方将明文 (原始数据) 和加密密钥一起经过特殊加密算法处理后, 使其变成复杂的加密密文发送出去. 收信方收到密文后, 若想解读原文, 则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密, 才能使其恢复成可读明文.
即:
明文 -->加密 -->密文
密文 -->解密 -->明文
特点: 算法公开, 计算量小, 加密速度快, 加密效率高.
缺点: 密钥管理困难, 使用成本较高, 双方都使用同样的密钥, 安全性得不到保证.
三, 非对称加密算法 --(RSA)现代加密算法
非对称加密算法需要两个密钥: 公开密钥 (publickey) 和私有密钥(privatekey). 公开密钥与私有密钥是一对, 如果用公开密钥对数据进行加密, 只有用对应的私有密钥才能解密; 如果用私有密钥对数据进行加密, 那么只有用对应的公开密钥才能解密. 因为加密和解密使用的是两个不同的密钥, 所以这种算法叫作非对称加密算法. 即:
1.A 要向 B 发送信息, A 和 B 都要产生一对用于加密和解密的公钥和私钥
2.A 的私钥保密, A 的公钥告诉 B;B 的私钥保密, B 的公钥告诉 A.
3.A 要给 B 发送信息时, A 用 B 的公钥加密信息, 因为 A 知道 B 的公钥.
4.A 将这个消息发给 B(已经用 B 的公钥加密消息).
5.B 收到这个消息后, B 用自己的私钥解密 A 的消息. 其他所有收到这个报文的人都无法解密, 因为只有 B 才有 B 的私钥.
特点: 算法强度复杂, 安全性较高.
缺点: 由于其算法复杂, 而使得加密解密速度没有对称加密解密的速度快.
来源: http://www.bubuko.com/infodetail-3097402.html