那么紧接之前的非对称加密RSA,直接上这次的干货部分
1、Hash概述2、数字签名3、对称加密算法简介4、对称加密算法终端命令5、对称加密算法终端演练6、对称加密算法代码演练7、CCCrypt函数一、Hash概述1、Hash的概念
Hash,一般翻译为'散列',也有直接音译的'哈希',就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2、Hash特点
1、算法是公开的2、对相同的数据运算,得到的结果是一样的3、对于不同的数据运算,如MD5(Hash算法的一种)的到的结果默认是128位的,32个字符(16进制标识)4、没法逆运算(因为哈希值是映射关系,会存在散列碰撞【即:无限个数据加密得到有限个数据,就存在一个或许多个数据存在同样的哈希值】)5、信息摘要,信息’指纹‘,一般是用来做数据识别的(由于没法做逆运算,所以一般不会用来做加密数据,只是把数据的哈希值取到,然后用来对比,做数据识别的)3、Hash函数(单向散列函数)
1、MD5(MessageDigestAlgorithm5)2、SHA(SecureHashAlgorithm)SHA又分为:SHA-1SHA-2系列(224,256,384,512,512/224,512/256统称为SHA-2系列)3、MAC(MessageAuthenticationCode)4、CRC(CyclicRedundancyCheck)5、SM3(国产哈希算法)4、Hash用途
什么是HMAC?HMAC(Hash-basedmessageauthenticationcode)是一种使用Hash函数(单向散列函数)来构造消息认证码的方法,利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。主要是为了能让人对对方身份正确性和消息有效性进行验证,与消息摘要的最大不同,就是有签名密钥!
HMAC通过两次hash两个不同的key来生成。目前还没有发现有任何的方法来产生碰撞。
HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的Hash函数(单向散列函数)都可以被用于HMAC。比如使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512。
1、什么是数字签名
数字签名就是用于鉴别数字信息的方法;
2、数字签名
下面我们以电商支付金额这个场景来描述数字签名的具体意义:
图示中,经过RSA加密的原商品信息Hash值这个整体就叫做数字签名。
1、对称加密算法定义:
对称加密方式:就是明文通过密钥加密得到密文。密文通过密钥解密得到明文。
2、对称加密常见算法
1、DES(DataEncryptionStandard):数据加密标准,速度较快,适用于加密大量数据的场合;(题外话:实际上用的不多,因为加密强度不够)2、3DES(TripleDES):是基于DES的对称算法,对相同的数据用3个不同的密钥执行3次加密,强度更高;(题外话:不过因为3个密钥管理起来麻烦,所以一般不是很常用~一出生就挂掉了,很惨。。。)3、RC2和RC4:用变长密钥对大量数据进行加密,比DES快哦~4、AES(AdvancedEncryptionStandard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES标准的一个实现是Rijndael算法;(题外话:很安全,苹果的钥匙串访问就是用的AES,美国国家安全局也是用的AES,想要暴力破解基本不可能)3、对称加密应用模式对称加密主要有两种应用模式,下面来详细介绍一下
ECB(ElectronicCodeBook):电子密码本模式。每一块数据,独立加密。
ECB是最基本的加密方式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
CBC(CipherBlockChaining):密码分组链接模式。使用一个密钥和一个初始化向量(IV)对数据进行加密。
CBC可以有效的保证密文的完整性,如果一个数据块在传递时丢失或者改变,后面的数据无法进行正常的解密。
AES对称加密算法两种应用模式下的终端命令分别如下:1、AES(ECB)的加密与解密
AES(ECB)加密'battleMage'字符串
$echo-nbattleMage|opensslenc-aes-128-ecb-K616263-nosalt|base64AES(ECB)解密'battleMage'字符串
$echo-nkXcE5nnetsinAMBEcK6D5g==|base64-D|opensslenc-aes-128-ecb-K616263-nosalt-d2、AES(CBC)的加密与解密
AES(CBC)加密'battleMage'字符串
$echo-nbattleMage|opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt|base64AES(CBC)解密'battleMage'字符串
$echo-nH3tn3dXCEtKNvijJYLsStw==|base64-D|opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-d五、对称加密算法终端演练对比1、新建一个message.txt文本文件
$vimessage.txt回车进入编辑界面,点击'i',进入编辑界面,输入5排'1234567890',点击'esc',再点击'shift+:',输入'wq'回车保存。
2、对该'message.txt'文件直接使用AES(ECB)进行加密,然后输出一个'meg1.bin'文件
$opensslenc-des-ecb-K616263-nosalt-inmessage.txt-outmeg1.bin直接敲回车,得到一个meg1.bin的文件
然后直接修改message.txt文件,把最后一排的第一个1改成2,
再次使用上述命令进行加密,然后输出一个'meg2.bin'文件
$opensslenc-des-ecb-K616263-nosalt-inmessage.txt-outmeg2.bin直接敲回车,得到一个meg2.bin的文件
接下来使用xxd命令查看meg1.bin和meg2.bin文件
同样通过AES(CBC)加密'message.txt'并输出一个‘meg3.bin’文件
$opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-inmessage.txt-outmeg3.bin再次手动编辑message.txt文件,把message.txt还原,然后通过AES(CBC)加密并输出一个‘meg4.bin’文件
$opensslenc-aes-128-cbc-iv0102030405060708-K616263-nosalt-inmessage.txt-outmeg4.bin对比如下图,
接下来开始代码演练部分,需要导入一个工具类,工具类代码并不多,这里直接贴工具类的内容吧,工具类头文件AES,DES各种终端命令也都包含在内了:
.h文件
2019-10-1221:57:26.858675+0800CryptDemo[1790:115503]AES(ECB)加密的结果是:d1QG4T2tivoi0Kiu3NEmZQ==2019-10-1221:57:26.858896+0800CryptDemo[1790:115503]AES(ECB)解密的结果是:hello2019-10-1221:57:26.859040+0800CryptDemo[1790:115503]AES(CBC)加密的结果是:u3W/N816uzFpcg6pZ+kbdg==2019-10-1221:57:26.859194+0800CryptDemo[1790:115503]AES(CBC)解密的结果是:hello七、CCCrypt函数第六步已经使用过封装好的加密工具类EncryptionTools.h,这个工具类只是封装了CCCrypt函数,下面我们来研究一下加密工具的核心函数CCCrypt函数:
使用CCCrypt函数,需要引入系统库
1、还是打开之前的工程,设置函数断点CCCrypt,然后使用真机运行!!!必须用真机,因为真机和模拟器的CPU不一样
2、运行工程,模拟黑客调试,然后点击屏幕出发touchBegin方法,然后断点停在了CCCrypt函数的地方
3、因为函数在调用的时候,都是存在CPU的寄存器上,输入寄存器查看指令
registerreadx6readx6是读取该函数对应的第7个参数,第一个参数是x0
4、拿到地址,然后强转类型,蒙圈了吧,你的数据就泄漏了
所以这个函数不能直接使用,现在只说基础,后面会详细说安全防护~今天就说到这里了~