数据加密历史上用于最多最广泛的是军事领域,起源最早的是公元前凯撒大帝。早期的加密方式是将数据按照一定规律将字符转化为其他字符,接受者使用同样的规律将数据反向转换成信息。
现代生活中加密用于各个领域,用户的基本信息也很重要,加密经常用于用户的重要信息的保存和传输,下面我就来和大家聊聊加密的那些事。
常见的加密方式有哈希(散列)加密、对称加密、非对称加密;
1、哈希(散列)加密
特点:算法公开、对相同的数据加密,得到的结果是一样的。对不同的数据加密,得到的结果是定长的,MD5对不同的数据加密得到的结果都是32位字符;不能反算;可以用于数据摘要。
-MD5
常用于用户密码的加密。用户密码不可以直接在本地保存,也不可以在服务端明文传输,服务器接受到加密的数据后可以保存在数据库。应该确保iOS本地和服务端都只能存储加密后的数据。App不可以具备找回密码功能,只能通过手机验证码验证重新设置新密码。
百度搜索功能当中也用到了MD5,他会对输入框的内容拆分字段进行MD5加密,即使不同顺序的搜索内容也可以当成一样的搜索内容来做处理,降低了搜索的复杂度。
MD5可以对任何数据进行加密,包括图片、视频、音频、文本、字串等等... 。因其加密具有唯一性 可以用这个特点做出来识别资料是否为正版,相同文件的拷贝资料MD5加密数据一样,而录拍翻拍资料MD5加密就有很大的差别。
客户端与服务器端的数据断点传输中可以用MD5加密的字段作比较判断数据是否传输完成;也可以通过MD5字段比较确认用户是否重复传输同一个文件数据。
md5 -s "string" 终端命令 获得32个字符的MD5散列字符串
md5 file.dat 终端命令 文件的MD5散列结果
-SHA1
echo -n "string" | openssl sha -sha1 终端命令 获得40个字符的SHA1散列字符串
openssl sha -sha1 file.dat 终端命令 得到40个字符的SHA1散列字符串
-SHA256\512
echo -n "string" | openssl sha -sha256 终端命令 获得64个字符的SHA256散列字符串
openssl sha -sha256 file.dat 终端命令 计算文件得到64个字符的SHA256散列字符串
echo -n "string" | openssl sha -sha512 终端命令 获得128个字符的SHA 512散列字符串
openssl sha -sha512 file.dat 终端命令 计算文件的SHA512散列结果,获得128个字符的SHA 512散列字符串
2、对称加密
加密和解密使用同一个秘钥;
-DES
早期的经典加密算法,是数据加密的标准,因加密强度不够现在用的不多。
-3DES
使用3个秘钥,对相同的数据执行3次加密,强度增强。
-AES
高级加密标准,目前美国国家安全局使用AES加密,苹果公司的钥匙串访问就是使用AES加密。
ECB: 电子代码本,就是将一个数据拆分为多块,然后独立加密的!
$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.txt -out msg1.bin 终端加密
$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.bin -out msg1.txt -d 终端解密
$ xxd msg1.bin 查看加密后的二进制文件
CBC: 密码块链,使用一个密钥和一个初始化"向量"对数据执行加密抓换。能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏! 现代的密码学都和几何有关!因为几何(包含圆形\椭圆\球体)的变量是有规律的,但是结果是多变的!
$ openssl enc -des-cbc -K 616263 -iv 0000000000000000 -nosalt -in a.txt -out msg1.bin 终端加密
$ openssl enc -des-cbc -K 616263 -iv 0000000000000000 -nosalt -in msg1.bin -out msg4.txt -d 终端解密
$ xxd msg1.bin 查看加密后的二进制文件
3、非对称加密
公钥加密私钥解密、私钥加密公钥解密。非对称加密很安全,但是对大量数据加密很慢,速度慢。
RSA
原理:找出两个“很大”的质数:P & Q;N = P * Q;M = (P – 1) * (Q – 1);找出整数E,E与M互质,即除了1之外,没有其他公约数;找出整数D,使得E*D除以M余1,即 (E * D) % M = 1;
加密:(X ^ E) % N = Y;X是明文;Y是密文
解密:(Y ^ D) % N = X;Y是密文;X是明文
不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应关系,破译出下一份密文;N和E可以公开给任何人加密使用,但是只有掌握密钥D的人才可以解密,即使加密者自己也无法解密。可以产生很多的公钥E和私钥D的组合给不同的加密者。RSA算法有两个作用一个是加密一个是数字签名。
----------------------------------------------我是分割线-----------------------------------------------
数据加密在iOS App场景中的运用
-登录注册
用户输入密码后应当立刻给密码加密,客户端和后台服务端都不应该明文保存数据。
1、MD5 加盐
在这里大家用的最多的就是MD5加密方式。MD5加密后具有唯一识别性,加密数据被泄露后同样不够安全。早期开发者会使用加盐方式,给加密数据加盐后再传输给后端。就这要求iOS、安卓、后台保持同样一份加盐数据 才能正确识别。而且这个盐是固定不变,前后端高度统一 安全性不够高。
MD5逆向获取明文网站:点我试试
2、HMAC
给定一个密钥,对明文进行密钥拼接,并且做"两次散列" -> 得到32位结果!
用户在注册的那一刻,向服务器索取 密钥(key); 客户端拿到KEY的这一刻,就将KEY保存在本地;切换了新的设备(换手机登录,登录新的已有账号!) -- 重新找服务器获取!!QQ就是采用这个方式,换设备登录获取不到原来的key,需要原设备授权后台才能给新设备这个KEY,授权方包含手机验证码和密保问题。
3、密文时效性
厉害的黑客可以模拟网络拿到加密后密码,可以同样进行数据访问。如果我们将传输和验证过程添加时效性那就可以大大避免这种风险。客户端在发送数据时候加上时间数据精确到分钟,客户端拿到数据后可以进行时间验证 误差在正负一分钟内的数据为安全数据。 (Pass + '201806132020')md5 == (Pass + '201806132020')md5
4、钥匙串数据保存本地
苹果的"生态圈",从 iOS7.0.3 版本开放给开发者; 功能:在Mac上能够动态生成复杂密码,帮助用户记住密码;如果用户访问网站,记住密码,我们还可以看到记住的密码明文!明文记录;本身的所有接口都是 C 语言的.借助三方库;采用的加密方式是 AES 加密! 可以开启手机icould钥匙串备份 永久不会丢失。
5、iOS指纹识别
#import
LAContext * ctx = [[LAContext alloc]init];
//判断设备是否支持指纹识别
if ([ctx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]) {
//输入指纹
[ctx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指纹支付" reply:^(BOOL success, NSError * _Nullable error) {
NSLog(@"%d %@",success,error);
}];
}else{
NSLog(@"不支持");
}
指纹:代表你是这个手机的主人; 密码:代表你是这个账号的主人。
-数据报文传输
很多支付相关的订单信息需要很高的安全性,在传输中要确保数据不能被篡改。iOS客户端需要用到更多的加密方式。
数据发送方:"报文" HASH 得到 "报文摘要","报文摘要" 用公钥加密(数字签名) + 报文。
数据接收方:"报文" HASH 得到 "报文摘要","数字签名" 用私钥解密 判断是否与 "报文摘要" 相同。