程序开发中没有绝对的安全,只有相对的安全。当破解的成本 > 破解的利润,你的程序就是相对安全的。
昨天看直播中详细的介绍了关于iOS安全加密的各种方式,现在记录下,后期在增加内容。
1、HASH 加密:
在该加密中常用的方式是MD5加密
1、不可逆运算;
2、对不同的数据加密,得到的结果是定长的32位字符;(不论是一个图片还是1个G的电影,经过加密之后都是32位的字符串)
3、对相对的数据加密,得到的结果是一样的;(一个数据经过复制之后,对这两个数据加密得到的是同一个32位字符串)
虽然不可逆,但是在实际开发中,不会直接使用MD5,因为现在反查询数据比较多,不够安全,http://www.cmd5.com/ 这个网站中可以根据32位字符反查询到你的密码;
NSString *pwdMd5 = pwd.md5String; -- 对密码进行单次加密,也可以进行双次md5加密
在实际开发中,对安全系数要求不太高的应用,一般会用加盐的方式对数据进行加密
NSString *salt = @"abc";
NSString *pwdSalt = [pwd stringByAppendingString:salt].md5String;
但加盐方式也不是绝对安全的,因为salt是由开发人员自定义的,当salt泄露时,就相当于整个程序的加密方式暴露了,很容易被别人破解;
-. HMAC 给定一个密钥,对明文加密,做两次"散列",得到的仍旧是32个字符;
-. 在实际开发中,密钥是服务器给的,一个账号对应一个key,当你注册时给你生成一个KEY
-. 关于HMAC逻辑
1.注册: 账号:发送给服务器,服务器校验是否是合法账号,如果是合法账号,服务器生成一个唯一的KEY值
密码(HMAC加密):将HMAC(32位字符串)发给服务器,服务器保存HAMC密码;
2.登陆:
NSString *hmacPwd = [pwd hmacMD5StringWithKey:"abc"]; // abc: 服务器随机生成的key值
这种方式破解之后只能得到一个人的key值,也只能得到一个人数据,不会把整个应用暴露出去,相对安全一些;
-.还有一种加密方式:HMAC + 服务器时间 + key值
登陆逻辑(当用户点击登陆按钮的这一刻) ----- 目的:每次加密结果不一样!!!
客户端:
-. 生成HMAC密码;
-. (HMAC密码 + 服务器时间(精确到分钟)).md5 ;
-. 加上了事件的HASH值,发给服务器;
服务器:拥有的1.账号 2.HMAC密码 3.KEY
-.验证:(HMAC密码 + 服务器时间).md5
当服务器验证时,会有时间上的延迟,所有需要验证服务器当前时间的上一分钟(或者由服务器确定需要验证多少时间)
这种验证方式大大增加了应用的安全性,就算被获取了某些数据,也需要在规定的时间内破解,如果没有破解了,在下一分钟的密码就又不一样
2、对称加密: —— 传统加密方式
-明文 —> 密钥加密 —> 密文
-密文 —> 密钥解密 —> 明文
3、非对称加密:—— 现代加密方式
-公钥、私钥
-用公钥加密,用私钥解密
-用私钥加密,用公钥解密