网络开发原则
- 在网络上不允许传输用户的明文隐私数据;
- 在本地不允许保存用户的明文隐私数据;
常用的加密方式
哈希(散列)函数 | 对称加密算法 | 非对称加密算法 |
---|---|---|
MD5 SHA1 SHA256/512 | DES 3DES AES | RSA |
- AES(高级密码标准):美国国家安全局使用的,Apple OS系统使用的加密方式(钥匙串)
散列函数
MD5、SHA1 SHA256/512
特点:
- 算法公开
- 加密相同数据,得到的结果一样
- 加密不用数据,得倒的结果是定长的:32个字符
- 信息摘要,信息“指纹”,是用于 数据识别 的
- 不能反算
MD5的用途:
1.作为 密码识别 。
- 因服务器无需知道用户的明文密码,在用户注册时,密码MD5加密后,可以存储到数据库。
2.用来 数据识别 。
- 搜索引擎:
ios + wangzzcloud :
9e304d4e8df1b74cfa009913198428ab+836a626786650cf45af100fd21fd1083
- 版权: 不同的数据 MD5 之后差别很大:
//同个文件不同名称:
MrwangPro:desktop wangzz$ md5 124.png
MD5 (124.png) = 7dbeafb656237acd295b667a3a34621e
MrwangPro:desktop wangzz$ md5 123.png
MD5 (123.png) = 7dbeafb656237acd295b667a3a34621e
//copy复制之后:
MrwangPro:desktop wangzz$ md5 1232.png
MD5 (1232.png) = 7dbeafb656237acd295b667a3a34621e
//不同文件之间:
MrwangPro:desktop wangzz$ md5 1111.png
MD5 (1111.png) = 65de7bd275bf7152b81165ccbd4db7d9
散列破解
- “被”破解散列函数,只有MD5,而SHA1也在被破解的边缘
单纯的MD5加密破解难度低,这里的破解是指,虽然过程不可逆,但是加密结果可被收录,对比可得原字符串,见www.cmd5.com。
- 散列碰撞,找到 不同数据 MD5 之后得到相同的结果:MD5之后有36^32种不同的结果,所以有可能成功。
提高MD5的安全性
- 加 "盐":
早期使用
- HMAC: 封装好的动态获取盐的方法,最近在增多
用户在注册时,从服务器获取 密钥(key),
保存在客户端本地: 钥匙串。
切换了设备,登录已有账号:重新找服务器获取
账号 key(密钥)
在新设备上获取验证的key(获取设备授权),可通过:
- 短信验证:
- 邮箱:
- 密码提问:
给定一个密钥,对 明文 进行 密钥 拼接,并做两次散列 => 32结果
特殊情况:
如何避免一种情况:
如果黑客 模拟你的网络请求..不需要拿到真实密码!用加密后的信息,也可以获得登录之后的权限!!
解决方式:让我们的密码具有 时效性 !! 也就是 加密过后的密码 有时间限制!!
客户端:
UserID = wangzz
Pass == ((123456)MD5+KEY)HMAC == e9cdab82d48dcd37af7734b6617357e6
KEY、temptime(服务器返回的时间)
发送:UserID : (Pass + '201702102020')md5
服务器:
KEY
UserID = wangzz
密码 = Pass == e9cdab82d48dcd37af7734b6617357e6
对比:
if((Pass + '201702102020')md5 == (Pass + '201702102021')md5
|| (Pass + '201702102020')md5 == (Pass + '201702102020')md5) {
//验证成功
}
只要服务器当前时间或者上一分钟 加密后的字符相等!就返回登录成功!!
隐私数据本地保存方法:钥匙串
NSUserDefaults: 只是Apple封装的一个全局字典类;
采用第三方 SSKeyChain ,可保存至本地的钥匙串中,采用的是AES对称加密算法。
可逆的加密算法
- 明文 -> 加密 -> 密文
- 密文 -> 解密 -> 明文
对称加密 -- 传统加密算法
加密和解密使用同一个Key(密钥)
密钥的保密工作很重要;会定期更新。
经典算法:
-
DES
数据加密标准(用的少,因为强度不够)
-
3DES
使用3个密钥,对相同的数据执行3次加密,增加强度
-
AES
高级加密标准。美国国防部和Apple目前使用。
加密方式:
-
ECB:
电子密码本加密。将一条数据拆分为多块,然后对其独立加密。
-
CBC:
密码块链加密。使用一个密钥和初始化 “向量” 对数据执行加密抓换能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏。
向量:某个方向的数量。
现代的密码学都和几何有关。 因为几何(圆、椭圆、球体)的变量是有规律的,而结果却是多变的。
如:
加密前:
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
22222222
//ECB方式加密 616263 是abc 的ANSI 字符串,16进制数据
MrwangPro:密码学 wangzz$ openssl enc -des-ecb -K 616263 -nosalt -in abc.txt -out msg1.bin
MrwangPro:密码学 wangzz$ xxd msg1.bin
00000000: d1f8 0876 7a80 0184 bbc2 3203 f334 210e ...vz.....2..4!.
00000010: bb70 0dfa 0725 a619 d74a 241c f348 76d0 .p...%...J$..Hv.
00000020: 86ae 214a ff02 4f0d 1d8e 208f c43c a517 ..!J..O... ..<..
00000030: cbda 2959 e3d7 0466 22c8 28b9 905f 1701 ..)Y...f".(.._..
00000040: 8fbe 8928 46d7 0620 c835 cec6 991c 08a2 ...(F.. .5......
00000050: b8db 0794 f9ed eca9 ........
加密前:
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
92222222
MrwangPro:密码学 wangzz$ openssl enc -des-ecb -K 616263 -nosalt -in abc.txt -out msg2.bin
MrwangPro:密码学 wangzz$ xxd msg2.bin
00000000: d1f8 0876 7a80 0184 bbc2 3203 f334 210e ...vz.....2..4!.
00000010: bb70 0dfa 0725 a619 d74a 241c f348 76d0 .p...%...J$..Hv.
00000020: 86ae 214a ff02 4f0d 1d8e 208f c43c a517 ..!J..O... ..<..
00000030: cbda 2959 e3d7 0466 22c8 28b9 905f 1701 ..)Y...f".(.._..
00000040: 8fbe 8928 46d7 0620 11ad 36c4 cc59 170d ...(F.. ..6..Y..
00000050: b8db 0794 f9ed eca9 ........
加密前:
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
92222222
//采用CBC方式加密 -0102030405060708是向量iv
MrwangPro:密码学 wangzz$ openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in abc.txt -out msg3.bin
MrwangPro:密码学 wangzz$ xxd msg3.bin
00000000: ca73 66ec 42d1 fcc3 2c47 faca 95d3 7f10 .sf.B...,G......
00000010: 16b8 a242 77f6 beaa 7c02 a026 c8cc 1971 ...Bw...|..&...q
00000020: 99fc d42e c360 bdaa fa48 9748 60ff 7775 .....`...H.H`.wu
00000030: f81c 9368 c92c c082 c612 27f2 d510 90c7 ...h.,....'.....
00000040: 9bdd 0b55 2bd9 86cd 76b5 e115 a2c0 d1f0 ...U+...v.......
00000050: d347 652e 60db 7cb5 .Ge.`.|.
加密前:
00000000
11111111
22222222
00000000
11111111
22222222
00000000
11111111
98222222
MrwangPro:密码学 wangzz$ openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in abc.txt -out msg4.bin
MrwangPro:密码学 wangzz$ xxd msg4.bin
00000000: ca73 66ec 42d1 fcc3 2c47 faca 95d3 7f10 .sf.B...,G......
00000010: 16b8 a242 77f6 beaa 7c02 a026 c8cc 1971 ...Bw...|..&...q
00000020: 99fc d42e c360 bdaa fa48 9748 60ff 7775 .....`...H.H`.wu
00000030: f81c 9368 c92c c082 c612 27f2 d510 90c7 ...h.,....'.....
00000040: 9bdd 0b55 2bd9 86cd b5a1 29c2 7828 6823 ...U+.....).x(h#
00000050: d8b3 d522 be2b f860
MrwangPro:密码学 wangzz$ vim ss.txt -> 填入 wangzenghan
MrwangPro:密码学 wangzz$ xxd ss.txt
00000000: 7761 6e67 7a65 6e67 6861 6e0a wangzenghan.
通过上面的例子,可以如果采用CBC的加密方式,在改变内容后,后面的加密内容都会随之改变。而不是采用ECB的加密方式时那样,加密出来的内容只改变了之前被加密内容的部分。所以,CBC的加密方式安全性更高。
非对称加密,以RSA为例
1 创建私钥
MrwangPro:密码学 wangzz$ openssl genrsa -out private.pem 512
Generating RSA private key, 512 bit long modulus
....++++++++++++
......++++++++++++
e is 65537 (0x10001)
2 根据私钥,生成公钥
MrwangPro:密码学 wangzz$ openssl rsa -in private.pem -out public.pem -pubout
writing RSA key
执行步骤1和2,生成的 私钥、公钥如下
//打印私钥
MrwangPro:密码学 wangzz$ cat private.pem
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAM3sq2rHQm3EcttlFWmAHIDvHoEgDOYNd7na6X5xqzwwcK3GbX47
4kfNt/XpfeEcYXG6q36k7NQ/j7U0w6Vweo0CAwEAAQJAK6gPN1YDKU5Ko2Ssw28b
m+IV734h/evBBC/67ImgqeOhqsS2rwntNSxkDT2vbnz+pjjwxVSGMu7/nymJ/jSO
gQIhAPB0G7N8CFJpkF85IppAZw8ewTDzAkHfFk4VpaCfVSe9AiEA2z0M1SKU6pLZ
3V5x03J9b3NMx3vzO0Yi6GfIdG5iIxECIQDtyjUW06M7NPA0a0FgAC6rEkQFj1x9
Hgxl3hx0cv14lQIgWg3xv3q9AL3hj/TDfL+Cls0dtLNNbgOZQy2eQXU2CoECICxE
xPLnHh0AVnkkj/1prTpKXOh+R3aTP3NhSCaP7ZTH
-----END RSA PRIVATE KEY-----
//打印公钥
MrwangPro:密码学 wangzz$ cat public.pem
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM3sq2rHQm3EcttlFWmAHIDvHoEgDOYN
d7na6X5xqzwwcK3GbX474kfNt/XpfeEcYXG6q36k7NQ/j7U0w6Vweo0CAwEAAQ==
-----END PUBLIC KEY-----
3 查看私钥的内容
执行
MrwangPro:密码学 wangzz$ openssl rsa -in private.pem -text -out private.txt
writing RSA key
MrwangPro:密码学 wangzz$ open private.txt
private.txt 展示内容如下:
Private-Key: (512 bit)
modulus:
00:cd:ec:ab:6a:c7:42:6d:c4:72:db:65:15:69:80:
1c:80:ef:1e:81:20:0c:e6:0d:77:b9:da:e9:7e:71:
ab:3c:30:70:ad:c6:6d:7e:3b:e2:47:cd:b7:f5:e9:
7d:e1:1c:61:71:ba:ab:7e:a4:ec:d4:3f:8f:b5:34:
c3:a5:70:7a:8d
publicExponent: 65537 (0x10001)
privateExponent:
2b:a8:0f:37:56:03:29:4e:4a:a3:64:ac:c3:6f:1b:
9b:e2:15:ef:7e:21:fd:eb:c1:04:2f:fa:ec:89:a0:
a9:e3:a1:aa:c4:b6:af:09:ed:35:2c:64:0d:3d:af:
6e:7c:fe:a6:38:f0:c5:54:86:32:ee:ff:9f:29:89:
fe:34:8e:81
prime1:
00:f0:74:1b:b3:7c:08:52:69:90:5f:39:22:9a:40:
67:0f:1e:c1:30:f3:02:41:df:16:4e:15:a5:a0:9f:
55:27:bd
prime2:
00:db:3d:0c:d5:22:94:ea:92:d9:dd:5e:71:d3:72:
7d:6f:73:4c:c7:7b:f3:3b:46:22:e8:67:c8:74:6e:
62:23:11
exponent1:
00:ed:ca:35:16:d3:a3:3b:34:f0:34:6b:41:60:00:
2e:ab:12:44:05:8f:5c:7d:1e:0c:65:de:1c:74:72:
fd:78:95
exponent2:
5a:0d:f1:bf:7a:bd:00:bd:e1:8f:f4:c3:7c:bf:82:
96:cd:1d:b4:b3:4d:6e:03:99:43:2d:9e:41:75:36:
0a:81
coefficient:
2c:44:c4:f2:e7:1e:1d:00:56:79:24:8f:fd:69:ad:
3a:4a:5c:e8:7e:47:76:93:3f:73:61:48:26:8f:ed:
94:c7
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAM3sq2rHQm3EcttlFWmAHIDvHoEgDOYNd7na6X5xqzwwcK3GbX47
4kfNt/XpfeEcYXG6q36k7NQ/j7U0w6Vweo0CAwEAAQJAK6gPN1YDKU5Ko2Ssw28b
m+IV734h/evBBC/67ImgqeOhqsS2rwntNSxkDT2vbnz+pjjwxVSGMu7/nymJ/jSO
gQIhAPB0G7N8CFJpkF85IppAZw8ewTDzAkHfFk4VpaCfVSe9AiEA2z0M1SKU6pLZ
3V5x03J9b3NMx3vzO0Yi6GfIdG5iIxECIQDtyjUW06M7NPA0a0FgAC6rEkQFj1x9
Hgxl3hx0cv14lQIgWg3xv3q9AL3hj/TDfL+Cls0dtLNNbgOZQy2eQXU2CoECICxE
xPLnHh0AVnkkj/1prTpKXOh+R3aTP3NhSCaP7ZTH
-----END RSA PRIVATE KEY-----
4 请求生成证书
MrwangPro:密码学 wangzz$ openssl req -new -key private.pem -out rsacert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:CN
State or Province Name (full name) []:Shandong
Locality Name (eg, city) []:Qingdao
Organization Name (eg, company) []:Wangzz
Organizational Unit Name (eg, section) []:Wangzz
Common Name (eg, fully qualified host name) []:zengzhan.wang
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:19921010
MrwangPro:密码学 wangzz$ ls
private.pem private.txt public.pem rsacert.csr
6 生成crt证书
MrwangPro:密码学 wangzz$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
Signature ok
subject=/C=CN/ST=Shandong/L=Qingdao/O=Wangzz/OU=Wangzz/CN=zengzhan.wang/[email protected]
Getting Private key
MrwangPro:密码学 wangzz$ cat rsacert.crt
-----BEGIN CERTIFICATE-----
MIICEDCCAboCCQD+M80V3Cnj1DANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC
Q04xETAPBgNVBAgMCFNoYW5kb25nMRAwDgYDVQQHDAdRaW5nZGFvMQ8wDQYDVQQK
DAZXYW5nenoxDzANBgNVBAsMBldhbmd6ejEWMBQGA1UEAwwNemVuZ3poYW4ud2Fu
ZzEgMB4GCSqGSIb3DQEJARYRMTYwOTQyOTkyNkBxcS5jb20wHhcNMTgxMDI1MDg1
ODEzWhcNMjgxMDIyMDg1ODEzWjCBjjELMAkGA1UEBhMCQ04xETAPBgNVBAgMCFNo
YW5kb25nMRAwDgYDVQQHDAdRaW5nZGFvMQ8wDQYDVQQKDAZXYW5nenoxDzANBgNV
BAsMBldhbmd6ejEWMBQGA1UEAwwNemVuZ3poYW4ud2FuZzEgMB4GCSqGSIb3DQEJ
ARYRMTYwOTQyOTkyNkBxcS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBIAkEAzeyr
asdCbcRy22UVaYAcgO8egSAM5g13udrpfnGrPDBwrcZtfjviR8239el94Rxhcbqr
fqTs1D+PtTTDpXB6jQIDAQABMA0GCSqGSIb3DQEBBQUAA0EAKqr6DTZo3MRiv6tE
c1TKpUpqA5pgh92loDXUjrNSenqhjR7PiF2OBJABSvFlI+YC7gkUN6pUxnF+R2Ks
v1p1cw==
-----END CERTIFICATE-----
7 转换格式:
MrwangPro:密码学 wangzz$ openssl x509 -outform der -in rsacert.crt -out rsacert.der
MrwangPro:密码学 wangzz$ ls
private.pem private.txt public.pem rsacert.crt rsacert.csr rsacert.der
8 生成p12文件
MrwangPro:密码学 wangzz$ openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
Enter Export Password:<19921010>
Verifying - Enter Export Password:
测试
总结,非对称加密的每次加密的结果(密文)都不同。
其他
指纹识别
基础要求:iPhone 5s+ && iOS 8+
注意:
指纹和登录的区别
指纹:代表你是这个设备的主人;
登录:代表你是这个账号的主人;
代码实例:
//需要导入的头文件
#import
/* 指纹识别的错误信息
LAErrorAuthenticationFailed --- 指纹无法识别
LAErrorUserCancel --- 用户点击了"取消"
LAErrorUserFallback --- 用户点击了"输入密码"
LAErrorSystemCancel --- 系统取消,比如激活了其他应用(用户)
LAErrorPasscodeNotSet --- 因为设备上没有设置密码
LAErrorTouchIDNotAvailable --- 设备没有Touch ID
LAErrorTouchIDNotEnrolled --- 因为用户没有输入指纹
LAErrorTouchIDLockout --- 多次输入错误,密码锁定
LAErrorAppCancel --- 比如电话进来,用户不可控的
*/
- (void)applyFingerprintIdentificationTechnology {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
LAContext *context = [LAContext new];
//判断设备是否支持指纹识别
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {
//请输入指纹识别
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请允许指纹识别" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_sync(dispatch_get_main_queue(), ^{
UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"提示" message:@"指纹识别成功,可以做好多事了" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *confirm = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];
[ac addAction:confirm];
[self.window.rootViewController presentViewController:ac animated:YES completion:nil];
ac = nil;
});
}
if (error.code != -2) {
NSLog(@"error:%@",error);
}
}];
}
}else {
NSLog(@"不支持");
}
}
感谢 hank