iOS-探究密码学-加密算法特性总结

加密算法分为三大类:哈希算法、对称加密算法、非对称加密算法。

加密算法特性:

加密算法都是对二进制数据进行加密哦!

哈希算法特性:散列、不可逆运算、同样的数据哈希加密后是一样的(例如文件加密:只要不更改数据内容,而更改文件名或者扩展名,加密后的结果是一样的,例如:百度云秒上传)。

对称加密特性:可逆运算。通过密钥加密->明文通过密钥加密成密文,密文通过密钥解密成明文。

非对称加密特性:可逆运算。通过公钥私钥加密解密->用公钥加密,用私钥解密;用私钥加密,用公钥解密。例如:总部只有一个私钥,而很多间谍拿着不同的公钥给总部发加密文件。

PS:苹果自带的加密算法都要导入头文件:#import  。

一、哈希算法加密(HASH散列):

1、-MD5: 加密结果一定是32位的字符串

终端测试命令:md5 -s "这里写测试字符串" 

提示:随着MD5碰撞生成器的出现,MD5算法不应被用于任何软件完整性检查或代码签名的用途。

2、-SHA1: 加密结果是40个字符的SHA1散列字符串

终端测试命令:echo -n "这里写测试字符串" | openssl sha -sha1

3、-sha256:64个字符的SHA256散列字符串

终端测试命令:echo -n "这里写测试字符串" | openssl sha -sha256

4、-sha512:128个字符的SHA 512散列字符串

终端测试命令:echo -n "这里写测试字符串" | openssl sha -sha512

5、-HMAC:计算HMAC MD5散列结果,返回32个字符的HMAC MD5散列字符串,需要一个密钥

终端测试命令:echo -n "这里写测试字符串" | openssl dgst -md5 -hmac "输入密钥"

HMAC做类似微信的设备锁的登录注册功能:

a、注册时,用户post账号密码给服务器,返回一个key给用户并保存到本地。

b、登录时,用户先检测本地有没有这个key,有则直接登录,没有key说明这是另外一台设备则告诉服务器给我的新设备一个key,这时需要通过旧设备的验证通过后才能给新设备key。

c、现在基本不会出现找回密码,一般是重置密码了。

d、为了app更安全每次请求的时候post给服务器的加密后的密码控制不一样,这就需要[“HMAC密码+时间戳字符串年月日时分没有秒” md5]。而服务器进行验证的数据有:1.账号。2.key。3.HMAC密码。4.[“HMAC密码+201708201956” md5]。5.[“HMAC密码+201708201957” md5]。

二、对称加密算法(传统加密算法):

经典的算法:

1、-DES (数据加密标准,用得少,使用一个密钥,加密强度不够)

2、-3DES (使用三个密钥,对相同的数据执行三次加密,增强强度,用得少,因为密钥管理难度大)

3、-AES (高级加密标准,目前美国国家安全局使用的,苹果系统钥匙串也是用AES)

注意:对称加密算法有两种加密方案

a、-ECB :电子代码本。使用一个密钥。将大的数据块会别拆分成独立的一块块的二进制数据,ECB就是对每一块的二进制数据进行加密然后拼接在一起。若改变了原来数据的某个字符串只会对那个改变了的字符串的小数据块的加密,对后面的数据块加密并不影响。

b、-CBC :密码块链。使用一个密钥和一个初始化项量[IV]对数据执行加密。CBC也是对小的数据块进行加密的,它首先对第一块二进制数据进行加密,然后对下一块数据加密时与上一块加密的数据有着密切的联系,以此类推。若改变了原来数据的某个字符串只会对那个改变了的字符串的小数据块的加密,对后面的数据块加密都会有影响。CBC可以有效保证数据的完整性.

加密组合终端测试指令:  算法(方案)    

<1>、DES(ECB)加密:

//加密字符串:hello是测试的加密字符串;616263是abc字符串的二进制,这个都要写二进制;默认加盐,这里设置不加盐;base64是在终端加密一个字符串并输出一个字符串就要用到。

$ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64

//加密文件:test.txt是文件名;msg1.bin是产生的新的文件名。

$ openssl enc -des-ecb -K 616263 -nosalt -in test.txt -out msg1.bin 

查看文件的二进制  $ xxd msg1.bin

看更多请移步找到密码学进阶文件夹。

三、非对称加密算法(现代加密算法):

1、-RSA 需要一对密钥。 用某用户公钥加密后所得的信息,只能用该用户的解密密钥才能解密。原理是这样子的:用私钥加密的信息,可以用公钥对其解密,用于客户验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。

通过下面的代码,我们能够自己生成一个数字证书:

// 生成1024位私钥 openssl genrsa -out private_key.pem 1024

// 根据私钥生成CSR文件 openssl req -new -key private_key.pem -out rsaCertReq.csr

// 根据私钥和CSR文件生成crt文件 openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt

// 为IOS端生成公钥der文件 openssl x509 -outform der -in rsaCert.crt -out public_key.der

// 将私钥导出为这p12文件 openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem 

得到公钥和私钥后就可以将数据进行加密了。我们把一个字符串用RAS算法加密后查看加密后的字符串,再反编码看到解密后的字符串,查看加密和解密的效果。

你可能感兴趣的:(iOS-探究密码学-加密算法特性总结)