使用時(shí)導(dǎo)入 #import <CommonCrypto/CommonCrypto.h>頭文件,才能使用。
總共分為三大類;
一、哈希(散列函數(shù))算法
算法公開
對(duì)不同的數(shù)據(jù)加密結(jié)果是定長(zhǎng)的 32位字符!!(所能表示的個(gè)數(shù)是不是有限的)
信息摘要(加密之后的數(shù)據(jù)是不可逆!!)
哈希的破解!!
散列碰撞:就是找出兩個(gè)不同的數(shù)據(jù),加密之后得到相同的結(jié)果??!
使用的說明
比方說:用戶隱私數(shù)據(jù)!! 絕對(duì)不能允許明文傳遞?。?需要加密! —哈希算法)
服務(wù)器是不知道用戶的真實(shí)密碼!!(當(dāng)用戶注冊(cè)時(shí),通過哈希算法獲得32位字符,登錄時(shí)對(duì)比兩個(gè)的32位字符) —2010年之前的找回密碼功能!,2010年之后不能找回真實(shí)密碼。
網(wǎng)絡(luò)傳輸數(shù)據(jù)—登錄(用戶密碼)
進(jìn)行加密的處理方法:
1.直接MD5加密
2.加鹽處理 — 早起的使用!!(就是定義一個(gè)復(fù)雜的字符串) (密碼 + 鹽).md5
鹽:固定寫死的?。懰涝诔绦蚶锩娴模?!一旦鹽泄漏就不安全了
3. ——HMAC處理(更加的安全) 用一個(gè)密鑰加密,然后做兩次散列。
在實(shí)際開發(fā)中,這個(gè)KEY是密鑰,這個(gè)密鑰是從服務(wù)器獲取的
QQ的設(shè)備鎖,使用的就是HMAC
HASH代表的算法
1. MD5(查詢MD5值的網(wǎng)站:www.cmd5.com) (信息指紋)
一般用來(lái)做密碼加密!!
版權(quán)問題!!(MD5值對(duì)比)
搜索引擎:
搜索內(nèi)容分別為:iOS haha 和 haha iOS ,搜索到的結(jié)果是一樣的,怎么辦到的?
(終端上使用命令:md5 - s “iOS”,獲取MD5值)
iOS的MD5值:1bdf605991920db11cbdf8508204c4eb
hank的MD5值:b6dfea72ba631c88abe4a1d17114bfcf
(iOS和hank的MD5值進(jìn)行位運(yùn)算得到的結(jié)果,就是兩個(gè)搜索到的結(jié)果一樣)
百度云&360云盤??!秒傳!!服務(wù)器上只要有這個(gè)文件,那么用戶可以實(shí)現(xiàn)秒傳!!。核心就是對(duì)比文件MD5的值。
2.SHA 512/256
和MD5差不多
3.HMAC
hamc的使用過程(登錄過程)

優(yōu)化的最終使用方案(加入時(shí)間戳)

以下兩種加密算法都是可逆的!
*明文->加密->密文
*密文->加密->明文
二、對(duì)稱加密算法 (enc)
加密和解密使用同一個(gè)”密鑰”!??!
密鑰的保密工作非常重要??!密鑰一般會(huì)定期更換!密鑰管理非常麻煩!!
經(jīng)典算法
- DES 數(shù)據(jù)加密標(biāo)準(zhǔn)(用的少,因?yàn)閺?qiáng)度不夠!)
- 3DES 使用3個(gè)密鑰,對(duì)相同的數(shù)據(jù)執(zhí)行三次加密,強(qiáng)度增強(qiáng)(更加用的少)
- AES 高級(jí)密碼標(biāo)準(zhǔn),目前美國(guó)國(guó)家安全局使用的就是AES!!破解需要2000萬(wàn)年!!
對(duì)稱加密算法有兩種加密方式!!
ECB&CBC (cbc比ecb更加安全)
*ECB:電子代碼本,就是說每一個(gè)數(shù)據(jù)塊都是獨(dú)立加密的
*CBC:密碼塊鏈,使用一個(gè)密鑰和一個(gè)”初始化向量(IV)(8個(gè)字節(jié))”對(duì)數(shù)據(jù)執(zhí)行加密轉(zhuǎn)換!(每一個(gè)獨(dú)立塊都是有聯(lián)系的)。如果在傳輸數(shù)據(jù)的過程中,一個(gè)數(shù)據(jù)塊被破壞了,那么整個(gè)數(shù)據(jù)都沒法解密了!!
終端使用openssl進(jìn)行ECB加密
openssl enc -des-ecb -K 616263 -nosalt -in abc.txt -out msg1.bin
//CBC加密
openssl enc - des-cbc - iv 0102030405060708 - K616263(abc) -nosalt -in abc.txt - out msg3.bin
查看使用命令 xxd msg3.bin
終端測(cè)試指令
/**
* 終端測(cè)試指令
*
* DES(ECB)加密
* $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
*
* DES(CBC)加密
* $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
*
* AES(ECB)加密
* $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
*
* AES(CBC)加密
* $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
*
* DES(ECB)解密
* $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
*
* DES(CBC)解密
* $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
*
* AES(ECB)解密
* $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
*
* AES(CBC)解密
* $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
*
* 提示:
* 1> 加密過程是先加密,再base64編碼
* 2> 解密過程是先base64解碼,再解密
*/
舉例加密字符串:hello
1.AEC - ECB加密
終端命令: echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
解釋命令: echo -n hello是輸出hello結(jié)果,|是管道,將左邊的值賦值給右邊 , openssl enc -aes-128-ecb -K 616263 -nosalt:通過openssl這個(gè)工具進(jìn)行對(duì)稱加密算法的aes,128是加密強(qiáng)度,ecb的加密方式, K是key,616263(ASCII碼):就是abc,nosalt:不加鹽。將加密的二進(jìn)制文件通過管道進(jìn)行base64編碼。
2.AEC - ECB解密 base64 -D:解碼
終端命令:echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
如何查看ASCII碼,需要的字符串保存到txt文件中,然后終端cd到這個(gè)存放這個(gè)txt文件下,然后使用命令:xxd +txt文件名,回車,就可以看到ASCII碼(其實(shí)就是十六進(jìn)制)
三、非對(duì)稱加密算法(RSA) — 現(xiàn)在加密算法
只能通過因式分解進(jìn)行破解??!
公鑰和私鑰
- 使用公鑰加密,私鑰解密
- 使用私鑰加密,公鑰解密
生成私鑰的命令 :openssl genrsa -out private.pem 512
通過私鑰生成公鑰的命令:openssl rsa -in private.pem -out public.pem -pubout
查看公鑰和私鑰的命令 cat private.pem/public.pem
將生成的私鑰輸入成txt文本形式
命令: openssl rsa -in private.pem -text -out private.txt
對(duì)rsa的使用案例
數(shù)字簽名
從客戶端往服務(wù)器發(fā)送數(shù)據(jù)報(bào)文,對(duì)數(shù)據(jù)進(jìn)行一次HSAH算法,得到32位字符,對(duì)MD5進(jìn)行RSA公鑰加密(數(shù)字簽名),然后數(shù)字報(bào)文和數(shù)字簽名后的字符進(jìn)行打包發(fā)送。服務(wù)器拿到數(shù)據(jù)包后,先對(duì)數(shù)據(jù)報(bào)文進(jìn)行HSAH算法,得到32位字符,然后在使用私鑰對(duì)數(shù)字簽名的數(shù)據(jù)進(jìn)行解密,得到32位的字符,然后對(duì)比兩個(gè)32位字符,如果不一樣說明數(shù)據(jù)被串改了,那么數(shù)據(jù)沒有被串改。
