Hash一般譯為“散列”搓蚪,也有直接音譯為“哈隙侍叮”,就是把任意長度的輸入通過散列算法變換成固定長度的輸出漠酿,該輸出就是散列值炒嘲。這種轉換是一種壓縮映射匈庭,也就是阱持,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出啼止,所以不可能從散列值來確定唯一的輸入值兵罢,簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數滓窍。
Hash的特點
- 算法是公開的
- 對相同數據運算得到的結果是一樣的
- 對不同數據運算,如MD5得到的結果默認是128位即横,32個字符(16進制標識)
- 不可逆運算
-
信息摘要东囚,信息“指紋”战授,是用來做數據識別的
Hash的用途
- 用戶密碼加密:將密碼進行加密后存儲在服務器植兰,以防止賬號信息泄漏楣导。
- 保護資料\版權:散列值可用于唯一地識別機密信息。
- 確保傳遞真實的信息:消息或數據的接受者確認消息是否被篡改的性質叫數據的真實性噩凹,也稱為完整性栓始。發(fā)信人通過將原消息和散列值一起發(fā)送血当,可以保證真實性臊旭。如數字簽名
- 搜索引擎:對搜索內容進行分詞后使用hash計算出結果的和离熏,然后匹配出搜索結果。
- 語音識別:如分析正在播放的音樂钻蔑,并將它于存儲在數據庫中的已知的散列值進行比較咪笑。用戶就能夠收到被識別的音樂的曲名娄涩。
在實際應用中,不能直接使用MD5扬虚,如果直接使用的話辜昵,很可能會被破解,如網站cmd5通過窮舉字符組合進行反向查詢贷洲。所以我們在應用的時候可以使用一些手段优构,如HMAC
方案雁竞,通過加key碑诉、時間戳等手段進行二次hash運算进栽。
對稱密鑰加密
又稱為對稱加密、私鑰加密快毛、共享密鑰加密唠帝。這類算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單地相互推算的密鑰贴铜。常見的對稱加密算法有AES("高級加密標準")绍坝、ChaCha20轩褐、3DES间坐、Salsa20竹宋、DES("數據加密標準")蜈七、Blowfish飒硅、IDEA( "國際資料加密算法")、RC5庵芭、RC6双吆、Camellia
好乐。對稱加密的速度比公鑰加密快很多蔚万,在很多場合都需要對稱加密临庇。
對稱加密有兩種不同的應用模式:
- ECB(Electronic Code Book):電子密碼本模式假夺,每一塊數據獨立加密侄泽,它是最基本的加密模式悼尾,相同的明文將永遠加密成相同的密文闺魏。它容易受到密碼本重放攻擊析桥,一般情況下很少用艰垂。
- CBC(Cipher Block Chaining):密碼分組鏈接模式猜憎,使用一個密鑰和一個初始化向量[IV]對數據執(zhí)行加密胰柑。
明文被加密前要與前面的密文進行異或運算后再密碼柬讨,因此只要選擇不同的初始向量踩官,相同的密文加密后會形成不同的密文蔗牡,這是目前應用最廣泛的模式蛋逾。第一塊數據都與前面是關聯的区匣,因此CBC可以有效的保證密文的完整性,如果數據塊傳遞過程中丟失姑丑,那么其后面的數據將無法正常解密栅哀。
使用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 -iv 0102030405060708 -K 616263 -nosalt | base64
- AES(ECB)加密“hello”字符串
-
解密:
- 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
- AES(ECB)解密
OC代碼使用
引入頭文件#import <CommonCrypto/CommonCrypto.h>
,加解密都是使用同一個方法
/*參數說明
1痴柔、kCCEncrypt 加密/kCCDecrypt 解密
2咳蔚、加密算法谈火。
3堆巧、加密選項:ECB/CBC,iv存在使用kCCOptionPKCS7Padding荒揣,不存在使用kCCOptionPKCS7Padding | kCCOptionECBMode
4焊刹、加密的密鑰
5虐块、密鑰的長度
6贺奠、iv 初始化向量
7儡率、加密的數據
8崎逃、加密的數據長度
9个绍、密文的內存地址
10、密文緩沖區(qū)的大小
11篮洁、加密結果大小
*/
CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmAES128, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv, /* optional initialization vector */
const void *dataIn, /* optional per op and alg */
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
API_AVAILABLE(macos(10.4), ios(2.0));