使用時導入 #import <CommonCrypto/CommonCrypto.h>頭文件坝冕,才能使用。
總共分為三大類;
一纬霞、哈希(散列函數(shù))算法
算法公開
對不同的數(shù)據(jù)加密結果是定長的 32位字符!!(所能表示的個數(shù)是不是有限的)
信息摘要(加密之后的數(shù)據(jù)是不可逆!!)
哈希的破解!!
散列碰撞:就是找出兩個不同的數(shù)據(jù)溉知,加密之后得到相同的結果Jバ焚鹊!
使用的說明
比方說:用戶隱私數(shù)據(jù)!! 絕對不能允許明文傳遞:劢臁!(需要加密! —哈希算法)
服務器是不知道用戶的真實密碼D┗肌研叫!(當用戶注冊時,通過哈希算法獲得32位字符璧针,登錄時對比兩個的32位字符) —2010年之前的找回密碼功能!,2010年之后不能找回真實密碼嚷炉。
網(wǎng)絡傳輸數(shù)據(jù)—登錄(用戶密碼)
進行加密的處理方法:
1.直接MD5加密
2.加鹽處理 — 早起的使用!!(就是定義一個復雜的字符串) (密碼 + 鹽).md5
鹽:固定寫死的!探橱!寫死在程序里面的I暌佟!一旦鹽泄漏就不安全了
3. ——HMAC處理(更加的安全) 用一個密鑰加密隧膏,然后做兩次散列哗讥。
在實際開發(fā)中,這個KEY是密鑰私植,這個密鑰是從服務器獲取的
QQ的設備鎖忌栅,使用的就是HMAC
HASH代表的算法
1. MD5(查詢MD5值的網(wǎng)站:www.cmd5.com) (信息指紋)
一般用來做密碼加密!曲稼!
版權問題!!(MD5值對比)
搜索引擎:
搜索內(nèi)容分別為:iOS haha 和 haha iOS ,搜索到的結果是一樣的湖员,怎么辦到的?
(終端上使用命令:md5 - s “iOS”,獲取MD5值)
iOS的MD5值:1bdf605991920db11cbdf8508204c4eb
hank的MD5值:b6dfea72ba631c88abe4a1d17114bfcf
(iOS和hank的MD5值進行位運算得到的結果贫悄,就是兩個搜索到的結果一樣)
百度云&360云盤!娘摔!秒傳U埂!服務器上只要有這個文件凳寺,那么用戶可以實現(xiàn)秒傳!!鸭津。核心就是對比文件MD5的值。
2.SHA 512/256
和MD5差不多
3.HMAC
hamc的使用過程(登錄過程)
優(yōu)化的最終使用方案(加入時間戳)
以下兩種加密算法都是可逆的肠缨!
*明文->加密->密文
*密文->加密->明文
二逆趋、對稱加密算法 (enc)
加密和解密使用同一個”密鑰”!I罐取闻书!
密鑰的保密工作非常重要C濉!密鑰一般會定期更換魄眉!密鑰管理非常麻煩E檠巍!
經(jīng)典算法
- DES 數(shù)據(jù)加密標準(用的少坑律,因為強度不夠岩梳!)
- 3DES 使用3個密鑰,對相同的數(shù)據(jù)執(zhí)行三次加密晃择,強度增強(更加用的少)
- AES 高級密碼標準蒋腮,目前美國國家安全局使用的就是AES!!破解需要2000萬年!!
對稱加密算法有兩種加密方式!!
ECB&CBC (cbc比ecb更加安全)
*ECB:電子代碼本,就是說每一個數(shù)據(jù)塊都是獨立加密的
*CBC:密碼塊鏈,使用一個密鑰和一個”初始化向量(IV)(8個字節(jié))”對數(shù)據(jù)執(zhí)行加密轉換藕各!(每一個獨立塊都是有聯(lián)系的)池摧。如果在傳輸數(shù)據(jù)的過程中,一個數(shù)據(jù)塊被破壞了激况,那么整個數(shù)據(jù)都沒法解密了!!
終端使用openssl進行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
終端測試指令
/**
* 終端測試指令
*
* 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結果乌逐,|是管道竭讳,將左邊的值賦值給右邊 , openssl enc -aes-128-ecb -K 616263 -nosalt:通過openssl這個工具進行對稱加密算法的aes浙踢,128是加密強度绢慢,ecb的加密方式, K是key,616263(ASCII碼):就是abc洛波,nosalt:不加鹽胰舆。將加密的二進制文件通過管道進行base64編碼。
2.AEC - ECB解密 base64 -D:解碼
終端命令:echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
如何查看ASCII碼蹬挤,需要的字符串保存到txt文件中缚窿,然后終端cd到這個存放這個txt文件下,然后使用命令:xxd +txt文件名焰扳,回車倦零,就可以看到ASCII碼(其實就是十六進制)
三、非對稱加密算法(RSA) — 現(xiàn)在加密算法
只能通過因式分解進行破解6趾贰扫茅!
公鑰和私鑰
- 使用公鑰加密,私鑰解密
- 使用私鑰加密,公鑰解密
生成私鑰的命令 :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
對rsa的使用案例
數(shù)字簽名
從客戶端往服務器發(fā)送數(shù)據(jù)報文,對數(shù)據(jù)進行一次HSAH算法育瓜,得到32位字符葫隙,對MD5進行RSA公鑰加密(數(shù)字簽名),然后數(shù)字報文和數(shù)字簽名后的字符進行打包發(fā)送。服務器拿到數(shù)據(jù)包后爆雹,先對數(shù)據(jù)報文進行HSAH算法停蕉,得到32位字符愕鼓,然后在使用私鑰對數(shù)字簽名的數(shù)據(jù)進行解密,得到32位的字符慧起,然后對比兩個32位字符菇晃,如果不一樣說明數(shù)據(jù)被串改了,那么數(shù)據(jù)沒有被串改蚓挤。