HSAH
Hash绢记,一般翻譯做“散列”令杈,也有直接音譯為“哈戏畏酰”的匀借,就是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值平窘。
簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)
Hash的特點(diǎn)
?算法是公開的
?對相同數(shù)據(jù)運(yùn)算,得到的結(jié)果是一樣的
?對不同數(shù)據(jù)運(yùn)算,如MD5得到的結(jié)果默認(rèn)是128位,32個(gè)字符(16進(jìn)制標(biāo)識(shí))吓肋。
?這玩意沒法逆運(yùn)算(32個(gè)字符所能表達(dá)的數(shù)據(jù)是不定長的,散列碰撞)
?信息摘要瑰艘,信息“指紋”是鬼,是用來做數(shù)據(jù)識(shí)別的。
加密方式
非對稱加密 : RSA
對稱加密 : DES 紫新、 3DES 均蜜、AES
HASH: MD5 、 SHA1 / SHA256
用途
?用戶密碼的加密
?搜索引擎
?版權(quán) (相似的文件的hash值不同芒率,可視為正版盜版的一個(gè)判定依據(jù)囤耳,同個(gè)文件改文件名或類型或copy后,hash值并不發(fā)生改變偶芍,只有改變二進(jìn)制排列才會(huì)產(chǎn)生變化)
?數(shù)字簽名
HASH加密方式:
1.加鹽 壞處:鹽一旦泄露 就不安全了充择,鹽是寫死的。
2.HMAC加密方案
使用一個(gè)密鑰加密匪蟀,并且做了兩次散列椎麦,?在實(shí)際開發(fā)中,密鑰來自于服務(wù)器
- (NSString*)hmacMD5StringWithKey:(NSString*)key {}
例如用戶注冊登錄:
注冊時(shí)先把賬號(hào)發(fā)給服務(wù)器匹配賬號(hào)是否可以使用材彪,可以使用后隨機(jī)生成key密鑰观挎,然后將密鑰發(fā)給客戶端撒桨,客戶端拿到key值后再進(jìn)行HMAC加密,加密之后得到的HASH值發(fā)給服務(wù)器键兜。
如果換了設(shè)備登錄的話凤类,就找服務(wù)器要對應(yīng)賬號(hào)的key,輸入密碼用key進(jìn)行HMAC加密,然后將加密的結(jié)果發(fā)給服務(wù)器驗(yàn)證普气,驗(yàn)證成功后登錄成功谜疤,將key保存在本地,沒有登錄成功將key刪除现诀。
加一步:如果設(shè)備開啟了授權(quán)設(shè)備鎖夷磕,那么向服務(wù)器索要key的時(shí)候會(huì)向已授權(quán)設(shè)備發(fā)送驗(yàn)證, 授權(quán)設(shè)備允許后將key給與新的設(shè)備仔沿。
漏洞:不需要獲得用戶的真實(shí)密碼坐桩,直接將加密后的md5值發(fā)送給服務(wù)器,一樣可以登錄封锉。
HMAC
升級(jí)后HMAC加密:
在生成的 HMAC哈希值 的后面添加一個(gè)當(dāng)前時(shí)間的字符串(可能是當(dāng)前的年月日時(shí)分)绵跷,在求一次md5,然后發(fā)送給服務(wù)器成福,服務(wù)器驗(yàn)證?HMAC哈希值 加上當(dāng)前的時(shí)間的字符串(有時(shí)加上上一分鐘的字符創(chuàng))進(jìn)行md5運(yùn)算碾局,這樣這個(gè)值的有效期在1分鐘到1分鐘59秒之間。
這樣的好處是每次加密的結(jié)果都不一樣奴艾,這個(gè)時(shí)間戳是服務(wù)器給的净当。
密碼加密方式
?直接使用MD5
?MD5加鹽
?HMAC加密方案
?添點(diǎn)東西
源代碼
?#define CC_MD5_DIGEST_LENGTH? ? 16? ? ? ? ? /* digest length in bytes */ 16個(gè)字節(jié),16*8 = 128位的二進(jìn)制
? ? constchar*str =self.UTF8String;//加密數(shù)據(jù)的指針
? ? uint8_t buffer[CC_MD5_DIGEST_LENGTH];//加密數(shù)據(jù)的長度蕴潦,
? ? CC_MD5(str, (CC_LONG)strlen(str), buffer);像啼、
? ? return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
數(shù)字簽名
將原始數(shù)據(jù)的hash值用RSA進(jìn)行加密潭苞,發(fā)給服務(wù)器的將是原始數(shù)據(jù)和用RSA加密后的hash值忽冻,然后服務(wù)器解密,對比原始數(shù)據(jù)進(jìn)行相同算法的hash值萄传,如果匹配說明數(shù)據(jù)沒有被修改過甚颂,這就叫做數(shù)字簽名蜜猾。
代碼簽名
對稱加密
對稱加密方式:明文通過密鑰加密得到密文秀菱。密文通過密鑰解密得到明文。
常見算法
?DES? ? 數(shù)據(jù)加密標(biāo)準(zhǔn)(用得少蹭睡,因?yàn)閺?qiáng)度不夠)
?3DES? 使用3個(gè)密鑰衍菱,對相同的數(shù)據(jù)執(zhí)行3次加密,強(qiáng)度增強(qiáng)
?AES? 高級(jí)密碼標(biāo)準(zhǔn)肩豁。(鑰匙串訪問)
應(yīng)用模式
?ECB(Electronic Code Book):電子密碼本模式脊串。每一塊數(shù)據(jù)辫呻,獨(dú)立加密。
?最基本的加密模式琼锋,也就是通常理解的加密放闺,相同的明文將永遠(yuǎn)加密成相同的密文,無初始向量缕坎,容易受到密碼本重放攻擊怖侦,一般情況下很少用。
?CBC(Cipher Block Chaining):密碼分組鏈接模式谜叹。使用一個(gè)密鑰和一個(gè)初始化向量[IV]對數(shù)據(jù)執(zhí)行加密匾寝。加密解密都會(huì)依賴前一塊數(shù)據(jù)。(防竊聽的技術(shù))
?明文被加密前要與前面的密文進(jìn)行異或運(yùn)算后再加密荷腊,因此只要選擇不同的初始向量艳悔,相同的密文加密后會(huì)形成不同的密文,這是目前應(yīng)用最廣泛的模式女仰。CBC加密后的密文是上下文相關(guān)的猜年,但明文的錯(cuò)誤不會(huì)傳遞到后續(xù)分組,但如果一個(gè)分組丟失疾忍,后面的分組將全部作廢(同步錯(cuò)誤)码倦。
?CBC可以有效的保證密文的完整性,如果一個(gè)數(shù)據(jù)塊在傳遞是丟失或改變锭碳,后面的數(shù)據(jù)將無法正常解密袁稽。
$ openssl enc -des-ecb -k -616263 -nosalt -in message.txt -out msg1.bin? (用ecb進(jìn)行加密)
$ openssl enc -des-cbc -iv 0102030405060708 -k 616263 -nosalt -in message.txt -out msg4.bin? (用cbc進(jìn)行加密)
xxd msg1.bin? (查看)
- k 616263 傳遞的就是二進(jìn)制 (abc)
OpenSSL
終端命令:
?加密:
?AES(ECB)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
?AES(CBC)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 | base64
?解密:
?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 -K 616263 -iv 0102030405060708 -nosalt -d
代碼
需要導(dǎo)入 EncryptionTools.h
iv (初始化向量)有值就是cbc, 無值就是ecb,返回的結(jié)果是個(gè)base的字符串
加密解密都是它 -- CCCrypt? 參數(shù)說明
? ? CCCrypt(<#CCOperation op#>, <#CCAlgorithm alg#>, <#CCOptions options#>, <#const void *key#>, <#size_t keyLength#>, <#const void *iv#>, <#const void *dataIn#>, <#size_t dataInLength#>, <#void *dataOut#>, <#size_t dataOutAvailable#>, <#size_t *dataOutMoved#>)
?? ? 1、kCCEncrypt 加密/kCCDecrypt 解密
?? ? 2擒抛、加密算法推汽。
?? ? 3、加密選項(xiàng):ECB/CBC
?? ? 4歧沪、加密的密鑰
?? ? 5歹撒、密鑰的長度
?? ? 6、iv 初始化向量
?? ? 7诊胞、加密的數(shù)據(jù)
?? ? 8暖夭、加密的數(shù)據(jù)長度
?? ? 9、密文的內(nèi)存地址
?? ? 10撵孤、密文緩沖區(qū)的大小
?? ? 11迈着、加密結(jié)果大小
弊端:可以 symbolic 斷點(diǎn)斷住?CCCrypt 函數(shù)
函數(shù)調(diào)用的參數(shù)存在cpu的寄存器中
register read x6? ?(x6 是因?yàn)榈?個(gè)參數(shù)是加密的數(shù)據(jù))
p (char *)0x00000001c000ec20? ? (顯示加密的數(shù)據(jù))