iOS开发之常用技术点iOS开发之常见问题

简述iOS加密

2018-10-17  本文已影响63人  Miss_QL

本章简述iOS加密问题。
这里在最开始有必要先说明一下,base64这个东西只是个编码方案,是不能用来加密的,但是一般加密过后的数据会用base64进行表示。
好了,开始进入正题。

1、HASH
哈希函数,也叫散列函数,经常用在密码、搜索引擎和版权中,常见的有MD5、SHA1、SHA256/512、HMAC 。特点如下:
(1)算法公开的;
(2)对相同的数据加密,得到的结果是一样的;
(3)对不同的数据加密,得到的结果是定长的。如:MD5 32个字符;
(4)不能反算;
(5)信息摘要,信息“指纹”。是用来做数据识别的。
对于不同的数据,使用MD5以后能够得到相同的散列结果,这个叫做散列碰撞。目前破解的散列函数只有MD5,SHA1也在边缘。目前MD5的基本安全有两种方式,一种是加盐,一种是使用HMAC。加盐有个很严重的问题,就是盐的泄露问题无法从根本上解决,故此不推荐。HMAC是给定一个密钥,对明文进行加密,并且做了两次散列(32位),这种方式目前一两年在国内的使用开始增多。HMAC的客户端基本思路是用户先输入账号密码,然后本地查找密钥,如果没有密钥,就向服务器获取(账号可参考腾讯QQ设备锁,其他设备登录需要原设备同意)。用公式可表示为:加密之后的密码 ==(原始密码 + key)HMAC

2、对称加密
对称加密算法,也叫传统加密算法,因其运算效率高,通常用来对大数据进行加密。加解密的过程也很简单,明文进行加密成密文,密文进行解密成明文。常见的有DES、3DES、AES。
DES对称加密有两种方式:ECB和CBC。ECB为电子代码本,每一个数据块进行独立的加密。而CBC为密码块链,是使用一个密钥和一个初始化向量对数据进行加密,每一块数据的加密和解密都需要依赖前一块数据,因此这种加密可以保证数据的完整性。也就是说,用CBC加密方式的话,如果有一个数据块丢失,就会导致后面所有的数据无法正常解密,一般这个技术用来防范一些窃听技巧。
3DES是使用3个密钥,对相同的数据执行3次加密。
AES是高级密码标准。钥匙串的加密方式就是AES加密,可以将保存的密码以明文的方式反算出来。在此提醒一下大家,保存用户密码到本地,一定要用钥匙串访问!苹果的“生态圈”是从iOS7.0.3版本才开放给开发者的,其原生的接口都是C语言的,有第三方库可供使用(SSKeyChain),使用的时候注意在Capabities中开启KeyChainSharring。

3、RSA
RSA叫非对称加密算法,也叫做现代加密算法。自上世纪70年代出现,算法是公开的,只能通过因式分解破解。涉及到的数学知识点蛮多的,比如迪菲赫尔曼一对一的密钥交换,比如任意的复合数(非质数)由一个唯一的一组质数相乘而来,比如欧拉函数等。其特点是公钥加密,私钥解密和私钥加密,公钥解密。
OpenSSL 是 Mac 系统自带的开源加密库,RSA 也是依赖于此才可以直接在终端进行操作。
介绍RSA算法三个常用的操作指令:
genrsa: 生成并输入一个RSA私钥
rsautl: 使用RSA密钥进行加密、解密、签名和验证等运算
sa: 处理RSA密钥的格式转换等问题

下面进入终端👇
首先,cd 到你的目录文件下。。。
(1)生成RSA私钥,密钥长度为1024bit

openssl genrsa -out private.pem 1024

此时目录文件下会生成名为 private.pem 的私钥。
(2)从私钥中提取公钥

openssl rsa -in private.pem -pubout -out public.pem

此时目录文件下会生成名为 public.pem 的公钥。
(3)可以利用终端查看公、私钥里面的内容(其实就是base64编码的文本)

// 查看私钥文件
cat private.pem

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCzdalqsU4YF3MH/8ZLvTrMFRA6WYRIlPkr3B7LmeJF1GeAQl2S
J+pTOawo1EIfK3uRjVphLx5Fiotl5Gg+p2yJC7pfRZc7Vj3p0UpnDu5qhEhi2y7X
U8flrtqB/TqWGPHdXzkqMSYmA6BarzfQDzCOTi8XDyYBzhYSPEev7A5ViQIDAQAB
AoGAYBkDraRgYzo7WO84KlqcX6hv1i8VTSCpBTmMLA6tQiNpgR8IqDlDm2lorTxs
Y/CO7PQ6j4wBs89qshdLUzGoRh05nThfZs79Ud7S5ZTpyV6yg3w0RWPcsQMKVgLv
LuLbvMiYp20H5hjnvzoEV5elNODZTdJgOZMHVgynTJNIbeECQQDWYuFkcCUialNw
gEKjeIOyvq6VoAnUDx8IhmrD6LanDezoX6R4RrykuyYA6z0rTWvfbaiytJgcELha
NJpw4CGFAkEA1ks7vvNb1bHhMQD3WsKjxthAix8uqcwHEFb4xD7v5sLtF3fnk1MV
J6V+MtFTUwX8F2DfpmkvUGlH0k7kNWRhNQJBAK08zeF5dahvvukj27V5BwMDbtRd
tFN1vKAI7nFMtXwclpnX33GJx5pd2IHZlV5Oe6LaW/28TUYwhKfv5fTcSHkCQQCs
jFOFQ6r0fJBYxvBk8kixebsuymLmcdRWQdF5IzxEUTxbIz8iD0n/bHAbNxWiyjTc
FjK/af6g/sTIAKIco8DpAkBmb2SKTw9xD1amwUDehEQYsITJXUUCzlVLl/wQGt0f
s4TC/dr2E9CzK2Rq9MRT1OL53EPJeMlgJA5S36/Wn/v3
-----END RSA PRIVATE KEY-----

// 查看公钥文件
cat public.pem 

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzdalqsU4YF3MH/8ZLvTrMFRA6
WYRIlPkr3B7LmeJF1GeAQl2SJ+pTOawo1EIfK3uRjVphLx5Fiotl5Gg+p2yJC7pf
RZc7Vj3p0UpnDu5qhEhi2y7XU8flrtqB/TqWGPHdXzkqMSYmA6BarzfQDzCOTi8X
DyYBzhYSPEev7A5ViQIDAQAB
-----END PUBLIC KEY-----

(4)可以利用终端将私钥转换成明文信息

openssl rsa -in private.pem -text -out private.txt

此时目录文件下会生成名为 private.txt 的私钥明文信息文本。

// 查看私钥明文信息
cat private.txt 

Private-Key: (1024 bit)
modulus:
    00:b3:75:a9:6a:b1:4e:18:17:73:07:ff:c6:4b:bd:
    3a:cc:15:10:3a:59:84:48:94:f9:2b:dc:1e:cb:99:
    e2:45:d4:67:80:42:5d:92:27:ea:53:39:ac:28:d4:
    42:1f:2b:7b:91:8d:5a:61:2f:1e:45:8a:8b:65:e4:
    68:3e:a7:6c:89:0b:ba:5f:45:97:3b:56:3d:e9:d1:
    4a:67:0e:ee:6a:84:48:62:db:2e:d7:53:c7:e5:ae:
    da:81:fd:3a:96:18:f1:dd:5f:39:2a:31:26:26:03:
    a0:5a:af:37:d0:0f:30:8e:4e:2f:17:0f:26:01:ce:
    16:12:3c:47:af:ec:0e:55:89
publicExponent: 65537 (0x10001)
privateExponent:
    60:19:03:ad:a4:60:63:3a:3b:58:ef:38:2a:5a:9c:
    5f:a8:6f:d6:2f:15:4d:20:a9:05:39:8c:2c:0e:ad:
    42:23:69:81:1f:08:a8:39:43:9b:69:68:ad:3c:6c:
    63:f0:8e:ec:f4:3a:8f:8c:01:b3:cf:6a:b2:17:4b:
    53:31:a8:46:1d:39:9d:38:5f:66:ce:fd:51:de:d2:
    e5:94:e9:c9:5e:b2:83:7c:34:45:63:dc:b1:03:0a:
    56:02:ef:2e:e2:db:bc:c8:98:a7:6d:07:e6:18:e7:
    bf:3a:04:57:97:a5:34:e0:d9:4d:d2:60:39:93:07:
    56:0c:a7:4c:93:48:6d:e1
prime1:
    00:d6:62:e1:64:70:25:22:6a:53:70:80:42:a3:78:
    83:b2:be:ae:95:a0:09:d4:0f:1f:08:86:6a:c3:e8:
    b6:a7:0d:ec:e8:5f:a4:78:46:bc:a4:bb:26:00:eb:
    3d:2b:4d:6b:df:6d:a8:b2:b4:98:1c:10:b8:5a:34:
    9a:70:e0:21:85
prime2:
    00:d6:4b:3b:be:f3:5b:d5:b1:e1:31:00:f7:5a:c2:
    a3:c6:d8:40:8b:1f:2e:a9:cc:07:10:56:f8:c4:3e:
    ef:e6:c2:ed:17:77:e7:93:53:15:27:a5:7e:32:d1:
    53:53:05:fc:17:60:df:a6:69:2f:50:69:47:d2:4e:
    e4:35:64:61:35
exponent1:
    00:ad:3c:cd:e1:79:75:a8:6f:be:e9:23:db:b5:79:
    07:03:03:6e:d4:5d:b4:53:75:bc:a0:08:ee:71:4c:
    b5:7c:1c:96:99:d7:df:71:89:c7:9a:5d:d8:81:d9:
    95:5e:4e:7b:a2:da:5b:fd:bc:4d:46:30:84:a7:ef:
    e5:f4:dc:48:79
exponent2:
    00:ac:8c:53:85:43:aa:f4:7c:90:58:c6:f0:64:f2:
    48:b1:79:bb:2e:ca:62:e6:71:d4:56:41:d1:79:23:
    3c:44:51:3c:5b:23:3f:22:0f:49:ff:6c:70:1b:37:
    15:a2:ca:34:dc:16:32:bf:69:fe:a0:fe:c4:c8:00:
    a2:1c:a3:c0:e9
coefficient:
    66:6f:64:8a:4f:0f:71:0f:56:a6:c1:40:de:84:44:
    18:b0:84:c9:5d:45:02:ce:55:4b:97:fc:10:1a:dd:
    1f:b3:84:c2:fd:da:f6:13:d0:b3:2b:64:6a:f4:c4:
    53:d4:e2:f9:dc:43:c9:78:c9:60:24:0e:52:df:af:
    d6:9f:fb:f7
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCzdalqsU4YF3MH/8ZLvTrMFRA6WYRIlPkr3B7LmeJF1GeAQl2S
J+pTOawo1EIfK3uRjVphLx5Fiotl5Gg+p2yJC7pfRZc7Vj3p0UpnDu5qhEhi2y7X
U8flrtqB/TqWGPHdXzkqMSYmA6BarzfQDzCOTi8XDyYBzhYSPEev7A5ViQIDAQAB
AoGAYBkDraRgYzo7WO84KlqcX6hv1i8VTSCpBTmMLA6tQiNpgR8IqDlDm2lorTxs
Y/CO7PQ6j4wBs89qshdLUzGoRh05nThfZs79Ud7S5ZTpyV6yg3w0RWPcsQMKVgLv
LuLbvMiYp20H5hjnvzoEV5elNODZTdJgOZMHVgynTJNIbeECQQDWYuFkcCUialNw
gEKjeIOyvq6VoAnUDx8IhmrD6LanDezoX6R4RrykuyYA6z0rTWvfbaiytJgcELha
NJpw4CGFAkEA1ks7vvNb1bHhMQD3WsKjxthAix8uqcwHEFb4xD7v5sLtF3fnk1MV
J6V+MtFTUwX8F2DfpmkvUGlH0k7kNWRhNQJBAK08zeF5dahvvukj27V5BwMDbtRd
tFN1vKAI7nFMtXwclpnX33GJx5pd2IHZlV5Oe6LaW/28TUYwhKfv5fTcSHkCQQCs
jFOFQ6r0fJBYxvBk8kixebsuymLmcdRWQdF5IzxEUTxbIz8iD0n/bHAbNxWiyjTc
FjK/af6g/sTIAKIco8DpAkBmb2SKTw9xD1amwUDehEQYsITJXUUCzlVLl/wQGt0f
s4TC/dr2E9CzK2Rq9MRT1OL53EPJeMlgJA5S36/Wn/v3
-----END RSA PRIVATE KEY-----

(5)通过公钥加密数据,私钥解密数据

// 生成待加密的明文文件
vi password.txt
// 输入内容保存后,查看待加密的文件内容
cat password.txt 
密码:abc000
// 通过公钥进行加密,生成加密后的enc.txt文件
openssl rsautl -encrypt -in password.txt -inkey public.pem -pubin -out enc.txt
// 通过私钥进行解密,生成解密后的dec.txt文件
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
// 查看加密后的enc.txt文件内容
cat enc.txt 
?B??8Q????J)?k??t??Z3?=${?  ??9?b? ??????4?M???4'??(?w{R?6?R? ??P.??y???p?u4@??E*K?r?!G?꣋o$?
                c?Dy@c???у?E???Nfe??
// 查看解密后的dec.txt文件内容,与待加密的password.txt内容一致
cat dec.txt 
密码:abc000

(6)通过私钥加密数据,公钥解密数据

// 通过私钥进行加密,生成加密后的enc1.txt文件
openssl rsautl -sign -in password.txt -inkey private.pem -out enc1.txt
// 通过公钥进行解密,生成解密后的dec1.txt文件
openssl rsautl -verify -in enc1.txt -inkey public.pem -pubin -out dec1.txt
// 查看加密后的enc1.txt文件内容
cat enc1.txt 
Ev???p???MH??%???M%
// 查看解密后的dec1.txt文件内容,与待加密的password.txt内容一致
cat dec1.txt 
密码:abc000
上一篇 下一篇

猜你喜欢

热点阅读