1、非對稱加密(現(xiàn)代加密算法):RSA(不適合加密大數(shù)據(jù))系忙、ECC
2诵盼、對稱加密(傳統(tǒng)加密算法):DES、3DES银还、AES风宁;應(yīng)用模式:ECB、CBC
3蛹疯、HASH(不是數(shù)據(jù)加密戒财,而是數(shù)據(jù)識別):md5、sha1捺弦、sha256饮寞、sha512
一、HASH
Hash列吼,一般翻譯做“散列”幽崩,也有直接音譯為“哈希”的寞钥,就是把任意長度的輸入通過散列算法變換成固定長度的輸出慌申,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射理郑,也就是蹄溉,散列值的空間通常遠(yuǎn)小于輸入的空間咨油,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值类缤。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)
-
Hash的特點
- 算法是公開的
- 對相同數(shù)據(jù)運算,得到的結(jié)果是一樣的
- 對不同數(shù)據(jù)運算,如MD5得到的結(jié)果默認(rèn)是128位(32個字符(16進(jìn)制標(biāo)識),一個字符4個位)臼勉×诳裕【散列碰撞:128位表示的信息是有限餐弱,所以會存在不同的數(shù)據(jù)得到相同的結(jié)果】
- 這玩意沒法逆運算
- 信息摘要,信息“指紋”囱晴,是用來做
數(shù)據(jù)識別
的膏蚓。
-
md5在線破解
加鹽
多次md5
-
HMAC不是一種加密算法,而是一種加密方案畸写。使用一個密鑰加密驮瞧,并且做了兩次散列。在實際開發(fā)中枯芬,密鑰來自于服務(wù)器论笔。每個賬號匹配一個密鑰。
- 1千所、客戶端填寫一個賬號狂魔,發(fā)給服務(wù)端驗證。服務(wù)端返回一個隨機(jī)數(shù)給客戶端淫痰。
- 2最楷、此隨機(jī)數(shù)就是HMAC的key〈恚客戶端保存這個key籽孙。客戶端的密碼使用這個key加密火俄,然后把這個加密之后的hash值發(fā)個服務(wù)端犯建。
- 3、服務(wù)端保存客服端發(fā)送過來的hash值瓜客。這個hash值只會傳輸一次适瓦。在注冊或換手機(jī)登錄的情況下傳輸。
- 4忆家、以后的每次登錄驗證都是用這個hash值加上服務(wù)端時間戳(精確到分)犹菇,然后再hash一次,得到新的hash發(fā)送給服務(wù)端芽卿。服務(wù)端用它保存的hash值也加上服務(wù)端時間揭芍,然后再hash一次,用得到的hash和客戶端發(fā)送過來的hash比對卸例。比對這一分鐘和上一分鐘称杨,只要有一個比對成功肌毅,就算成功。
- 5姑原、有一種情況悬而,客戶端換了手機(jī)且開啟了設(shè)備驗證,向服務(wù)端要key锭汛。服務(wù)器會先向授權(quán)設(shè)備發(fā)起是否授權(quán)笨奠,授權(quán)通過發(fā)送key,授權(quán)不通過不發(fā)送key唤殴。
-
Hash用途
- 用戶密碼的加密
- 搜索引擎
- 版權(quán)
- 數(shù)字簽名
二般婆、密碼加密
通過運用HASH算法,給用戶的密碼進(jìn)行加密
- 密碼加密方式
- 直接使用MD5
- MD5加鹽
- HMAC加密方案
- 添點東西
三朵逝、數(shù)字簽名
為什么用簽名這個詞.因為老外喜歡用支票,支票上面的簽名能夠證明這玩意是你的.那么數(shù)字簽名顧名思義,就是用于鑒別數(shù)字信息的方法
數(shù)字簽名
四蔚袍、
- 密碼:你是這個賬號的主人
- 人臉、指紋:你是這個手機(jī)的主人
五配名、對稱加密
對稱加密方式:明文通過密鑰加密得到密文啤咽。密文通過密鑰解密得到明文。
-
常見算法
- DES 數(shù)據(jù)加密標(biāo)準(zhǔn)(用得少渠脉,因為強度不夠)
- 3DES 使用3個密鑰宇整,對相同的數(shù)據(jù)執(zhí)行3次加密,強度增強
- AES 高級密碼標(biāo)準(zhǔn)连舍。
-
應(yīng)用模式
ECB(Electronic Code Book):電子密碼本模式没陡。每一塊數(shù)據(jù),獨立加密索赏。
最基本的加密模式盼玄,也就是通常理解的加密,相同的明文將永遠(yuǎn)加密成相同的密文潜腻,無初始向量埃儿,容易受到密碼本重放攻擊,一般情況下很少用融涣。CBC(Cipher Block Chaining):密碼分組
鏈
接模式童番。使用一個密鑰和一個初始化向量[IV]
對數(shù)據(jù)執(zhí)行加密。
明文被加密前要與前面的密文進(jìn)行異或運算后再加密威鹿,因此只要選擇不同的初始向量剃斧,相同的密文加密后會形成不同的密文,這是目前應(yīng)用最廣泛的模式忽你。CBC加密后的密文是上下文相關(guān)的幼东,但明文的錯誤不會傳遞到后續(xù)分組,但如果一個分組丟失,后面的分組將全部作廢(同步錯誤)根蟹。
CBC可以有效的保證密文的完整性脓杉,如果一個數(shù)據(jù)塊在傳遞是丟失或改變,后面的數(shù)據(jù)將無法正常解密简逮。
六球散、終端操作
-
終端操作文本
- 1、vim message.txt 或者 vi message.txt
- 2散庶、i
- 3蕉堰、esc
- 4、:
- 5督赤、wq
-
DES-ECB:
openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin
- DES-CBC:
openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg3.bin
七嘁灯、CCCrypt函數(shù)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
/** AES - ECB 加密 */
// NSString * key = @"abc";
// NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
// NSLog(@"加密的結(jié)果是:%@",encStr);
//
// NSLog(@"解密的結(jié)果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
/** AES - CBC 加密 */
NSString * key = @"abc";
uint8_t iv[8] = {1,2,3,4,5,6,7,8};
NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
/** 對稱加密算法
kCCAlgorithmAES128 = 0,
kCCAlgorithmAES = 0,
kCCAlgorithmDES,
kCCAlgorithm3DES,
kCCAlgorithmCAST,
kCCAlgorithmRC4,
kCCAlgorithmRC2,
kCCAlgorithmBlowfish
*/
// [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithm3DES;//設(shè)置加密算法泻蚊,默認(rèn)是AES
NSLog(@"加密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:ivData]);
NSLog(@"解密的結(jié)果:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"u3W/N816uzFpcg6pZ+kbdg==" keyString:key iv:ivData]);
}
下一個符號斷點
/**
1躲舌、kCCEncrypt 加密/kCCDecrypt 解密
2、加密算法性雄。
3没卸、加密選項:ECB/CBC
4、加密的密鑰
5秒旋、密鑰的長度
6约计、iv 初始化向量
7、加密的數(shù)據(jù)
8迁筛、加密的數(shù)據(jù)長度
9煤蚌、密文的內(nèi)存地址
10、密文緩沖區(qū)的大小
11细卧、加密結(jié)果大小
*/
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&encryptedSize);
只能用真機(jī)才可以register read
出來
八尉桩、代碼
#import <Foundation/Foundation.h>
@interface NSString (Hash)
#pragma mark - 散列函數(shù)
/**
* 計算MD5散列結(jié)果
*
* 終端測試命令:
* @code
* md5 -s "string"
* @endcode
*
* <p>提示:隨著 MD5 碰撞生成器的出現(xiàn),MD5 算法不應(yīng)被用于任何軟件完整性檢查或代碼簽名的用途贪庙。<p>
*
* @return 32個字符的MD5散列字符串
*/
- (NSString *)md5String;
/**
* 計算SHA1散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha1
* @endcode
*
* @return 40個字符的SHA1散列字符串
*/
- (NSString *)sha1String;
/**
* 計算SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha256
* @endcode
*
* @return 64個字符的SHA256散列字符串
*/
- (NSString *)sha256String;
/**
* 計算SHA 512散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha512
* @endcode
*
* @return 128個字符的SHA 512散列字符串
*/
- (NSString *)sha512String;
#pragma mark - HMAC 散列函數(shù)
/**
* 計算HMAC MD5散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -md5 -hmac "key"
* @endcode
*
* @return 32個字符的HMAC MD5散列字符串
*/
- (NSString *)hmacMD5StringWithKey:(NSString *)key;
/**
* 計算HMAC SHA1散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha1 -hmac "key"
* @endcode
*
* @return 40個字符的HMAC SHA1散列字符串
*/
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;
/**
* 計算HMAC SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha256 -hmac "key"
* @endcode
*
* @return 64個字符的HMAC SHA256散列字符串
*/
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;
/**
* 計算HMAC SHA512散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl dgst -sha512 -hmac "key"
* @endcode
*
* @return 128個字符的HMAC SHA512散列字符串
*/
- (NSString *)hmacSHA512StringWithKey:(NSString *)key;
#pragma mark - 文件散列函數(shù)
/**
* 計算文件的MD5散列結(jié)果
*
* 終端測試命令:
* @code
* md5 file.dat
* @endcode
*
* @return 32個字符的MD5散列字符串
*/
- (NSString *)fileMD5Hash;
/**
* 計算文件的SHA1散列結(jié)果
*
* 終端測試命令:
* @code
* openssl dgst -sha1 file.dat
* @endcode
*
* @return 40個字符的SHA1散列字符串
*/
- (NSString *)fileSHA1Hash;
/**
* 計算文件的SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* openssl dgst -sha256 file.dat
* @endcode
*
* @return 64個字符的SHA256散列字符串
*/
- (NSString *)fileSHA256Hash;
/**
* 計算文件的SHA512散列結(jié)果
*
* 終端測試命令:
* @code
* openssl dgst -sha512 file.dat
* @endcode
*
* @return 128個字符的SHA512散列字符串
*/
- (NSString *)fileSHA512Hash;
@end
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>
/**
* 終端測試指令
*
* 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解碼,再解密
*/
@interface EncryptionTools : NSObject
+ (instancetype)sharedEncryptionTools;
/**
@constant kCCAlgorithmAES 高級加密標(biāo)準(zhǔn)止邮,128位(默認(rèn))
@constant kCCAlgorithmDES 數(shù)據(jù)加密標(biāo)準(zhǔn)
*/
@property (nonatomic, assign) uint32_t algorithm;
/**
* 加密字符串并返回base64編碼字符串
*
* @param string 要加密的字符串
* @param keyString 加密密鑰
* @param iv 初始化向量(8個字節(jié))
*
* @return 返回加密后的base64編碼字符串
*/
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
/**
* 解密字符串
*
* @param string 加密并base64編碼后的字符串
* @param keyString 解密密鑰
* @param iv 初始化向量(8個字節(jié))
*
* @return 返回解密后的字符串
*/
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
@end