本文主要介紹Hash算法
Hash介紹
Hash蝗蛙,一般翻譯做“散列”
蝇庭,也有直接音譯為“哈希”的捡硅,就是把任意長度的輸入通過散列算法變換成固定長度的輸出
哮内,該輸出就是散列值
。這種轉(zhuǎn)換是一種壓縮映射壮韭,也就是北发,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出
喷屋,所以不可能從散列值來確定唯一的輸入值琳拨。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)
。
簡單來說屯曹,hash算法(即散列函數(shù))狱庇,是一種單向密碼體制
,即它是一個從明文到密文的不可逆的映射
恶耽,只有加密過程密任,沒有解密過程。同時偷俭,哈希函數(shù)可以將任意長度的輸入經(jīng)過變化以后得到固定長度的輸出浪讳。哈希函數(shù)的這種單向特征和輸出數(shù)據(jù)長度固定的特征使得它可以生成消息或者數(shù)據(jù)。
Hash的特點
算法是公開的
對
相同數(shù)據(jù)
運(yùn)算,得到的結(jié)果是一樣
的(同樣的數(shù)據(jù)社搅,得到的結(jié)果是一樣的)對
不同數(shù)據(jù)
運(yùn)算驻债,得到的結(jié)果是定長
的,如MD5得到的結(jié)果默認(rèn)是128位,32個字符
(16進(jìn)制標(biāo)識)乳规。無法逆運(yùn)算
是信息摘要形葬、信息
“指紋”
,是用來做數(shù)據(jù)識別的暮的、完整性檢查的笙以。
Hash用途
- 1、用戶密碼的加密
- 2冻辩、搜索引擎
- 3猖腕、版權(quán)
- 4拆祈、數(shù)字簽名
- ......
數(shù)據(jù)傳輸/存儲原則:網(wǎng)絡(luò)傳輸數(shù)據(jù) + 本地保存數(shù)據(jù) + 服務(wù)端保存數(shù)據(jù)等
,這些是隱私數(shù)據(jù)倘感,絕對不能明文放坏,一定是密文傳輸/存儲。
常見的Hash算法
常見的hash算法主要有MD5老玛、SHA-1淤年、SHA-256健民、SHA-512等
MD5
MD4
(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年設(shè)計的贯卦,MD 是 Message Digest(消息摘要)
的縮寫。它適用在32位
字長的處理器上用高速軟件實現(xiàn)——它是基于 32位操作數(shù)的位操作來實現(xiàn)的酬滤。
MD5(RFC 1321)是 Rivest 于1991年對MD4的改進(jìn)版本镜廉。它對輸入仍以512位分組
弄诲,其輸出是4個32位字的級聯(lián),與 MD4 相同娇唯。MD5比MD4來得復(fù)雜齐遵,并且速度較之要慢一點,但更安全塔插,在抗分析和抗差分方面表現(xiàn)更好洛搀。
Message Digest Algorithm MD5(消息摘要算法5)為計算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護(hù)佑淀。是計算機(jī)廣泛使用的雜湊算法之一留美,將數(shù)據(jù)(如漢字)運(yùn)算為另一固定長度值
,是雜湊算法的基礎(chǔ)原理伸刃,MD5的前身有MD2谎砾、MD3和MD4。
特點
1捧颅、
壓縮性
:任意長度的數(shù)據(jù)景图,算出的MD5值長度都是固定的。2碉哑、
容易計算
:從原數(shù)據(jù)計算出MD5值很容易挚币。3、
抗修改性
:對原數(shù)據(jù)進(jìn)行任何改動扣典,哪怕只修改1個字節(jié)妆毕,所得到的MD5值都有很大區(qū)別。4贮尖、
強(qiáng)抗碰撞
:已知原數(shù)據(jù)和其MD5值笛粘,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
應(yīng)用場景
一致性驗證
數(shù)字簽名
安全訪問認(rèn)證
SHA-1、SHA-256薪前、SHA-512
安全哈希算法(Secure Hash Algorithm)
主要適用于數(shù)字簽名標(biāo)準(zhǔn)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)润努。對于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘要
示括。當(dāng)接收到消息的時候铺浇,這個消息摘要可以用來驗證數(shù)據(jù)的完整性。在傳輸?shù)倪^程中垛膝,數(shù)據(jù)很可能會發(fā)生變化随抠,那么這時候就會產(chǎn)生不同的消息摘要。
SHA1
是由NIST NSA設(shè)計為同DSA一起使用的繁涂,它對長度小于264的輸入拱她,產(chǎn)生長度為160bit的散列值
,因此抗窮舉(brute-force)性更好扔罪。SHA-1 設(shè)計時基于和MD4相同原理秉沼,并且模仿了該算法。
SHA-2 SHA-224矿酵、SHA-256
唬复、SHA-384,和SHA-512
并稱為SHA-2全肮。 新的哈希函數(shù)并沒有接受像SHA-1一樣的公眾密碼社區(qū)做詳細(xì)的檢驗敞咧,所以它們的密碼安全性還不被大家廣泛的信任。 雖然至今尚未出現(xiàn)對SHA-2有效的攻擊辜腺,它的算法跟SHA-1基本上仍然相似休建;因此有些人開始發(fā)展其他替代的哈希算法。
注:這里只做簡單介紹评疗,并不展開詳細(xì)說明测砂,有興趣的可以參考以下鏈接
密碼加密
這里我們分別來對比以下四種,對密碼的加密方式
- 1百匆、直接使用MD5(信息摘要算法)
- 2砌些、MD5加鹽
- 3、HMAC加密方案
- 4加匈、添點東西
準(zhǔn)備工作
在進(jìn)行演示前存璃,首先封裝常用的Hash算法
<!--h文件-->
#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 sha1
* @endcode
*
* @return 40個字符的SHA1散列字符串
*/
- (NSString *)sha1String;
/**
* 計算SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl sha -sha256
* @endcode
*
* @return 64個字符的SHA256散列字符串
*/
- (NSString *)sha256String;
/**
* 計算SHA 512散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl sha -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 sha -sha1 -hmac "key"
* @endcode
*
* @return 40個字符的HMAC SHA1散列字符串
*/
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;
/**
* 計算HMAC SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl sha -sha256 -hmac "key"
* @endcode
*
* @return 64個字符的HMAC SHA256散列字符串
*/
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;
/**
* 計算HMAC SHA512散列結(jié)果
*
* 終端測試命令:
* @code
* echo -n "string" | openssl sha -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 sha -sha1 file.dat
* @endcode
*
* @return 40個字符的SHA1散列字符串
*/
- (NSString *)fileSHA1Hash;
/**
* 計算文件的SHA256散列結(jié)果
*
* 終端測試命令:
* @code
* openssl sha -sha256 file.dat
* @endcode
*
* @return 64個字符的SHA256散列字符串
*/
- (NSString *)fileSHA256Hash;
/**
* 計算文件的SHA512散列結(jié)果
*
* 終端測試命令:
* @code
* openssl sha -sha512 file.dat
* @endcode
*
* @return 128個字符的SHA512散列字符串
*/
- (NSString *)fileSHA512Hash;
@end
<!--m文件-->
#import "NSString+Hash.h"
#import <CommonCrypto/CommonCrypto.h>
@implementation NSString (Hash)
#pragma mark - 散列函數(shù)
- (NSString *)md5String {
const char *str = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)sha1String {
const char *str = self.UTF8String;
uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}
- (NSString *)sha256String {
const char *str = self.UTF8String;
uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}
- (NSString *)sha512String {
const char *str = self.UTF8String;
uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}
#pragma mark - HMAC 散列函數(shù)
- (NSString *)hmacMD5StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)hmacSHA1StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}
- (NSString *)hmacSHA256StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}
- (NSString *)hmacSHA512StringWithKey:(NSString *)key {
const char *keyData = key.UTF8String;
const char *strData = self.UTF8String;
uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA512, keyData, strlen(keyData), strData, strlen(strData), buffer);
return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}
#pragma mark - 文件散列函數(shù)
#define FileHashDefaultChunkSizeForReadingData 4096
- (NSString *)fileMD5Hash {
NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
if (fp == nil) {
return nil;
}
CC_MD5_CTX hashCtx;
CC_MD5_Init(&hashCtx);
while (YES) {
@autoreleasepool {
NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
CC_MD5_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
if (data.length == 0) {
break;
}
}
}
[fp closeFile];
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(buffer, &hashCtx);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)fileSHA1Hash {
NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
if (fp == nil) {
return nil;
}
CC_SHA1_CTX hashCtx;
CC_SHA1_Init(&hashCtx);
while (YES) {
@autoreleasepool {
NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
CC_SHA1_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
if (data.length == 0) {
break;
}
}
}
[fp closeFile];
uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
CC_SHA1_Final(buffer, &hashCtx);
return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}
- (NSString *)fileSHA256Hash {
NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
if (fp == nil) {
return nil;
}
CC_SHA256_CTX hashCtx;
CC_SHA256_Init(&hashCtx);
while (YES) {
@autoreleasepool {
NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
CC_SHA256_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
if (data.length == 0) {
break;
}
}
}
[fp closeFile];
uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
CC_SHA256_Final(buffer, &hashCtx);
return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH];
}
- (NSString *)fileSHA512Hash {
NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self];
if (fp == nil) {
return nil;
}
CC_SHA512_CTX hashCtx;
CC_SHA512_Init(&hashCtx);
while (YES) {
@autoreleasepool {
NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData];
CC_SHA512_Update(&hashCtx, data.bytes, (CC_LONG)data.length);
if (data.length == 0) {
break;
}
}
}
[fp closeFile];
uint8_t buffer[CC_SHA512_DIGEST_LENGTH];
CC_SHA512_Final(buffer, &hashCtx);
return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH];
}
#pragma mark - 助手方法
/**
* 返回二進(jìn)制 Bytes 流的字符串表示形式
*
* @param bytes 二進(jìn)制 Bytes 數(shù)組
* @param length 數(shù)組長度
*
* @return 字符串表示形式
*/
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < length; i++) {
[strM appendFormat:@"%02x", bytes[i]];
}
return [strM copy];
}
@end
方式一:直接使用MD5
終端演示
md5 -s "123456"
MD5 ("123456") 纵东,結(jié)果為
e10adc3949ba59abbe56e057f20f883e
代碼演示
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *pwd = @"123456";
//傳遞數(shù)據(jù)
pwd = pwd.md5String;
NSLog(@"pwd - %@", pwd);
}
<!--運(yùn)行結(jié)果-->
pwd - e10adc3949ba59abbe56e057f20f883e
結(jié)論:直接使用MD5不安全,大部分MD5現(xiàn)在通過網(wǎng)站都可以還原
方式二:MD5加固定鹽
在方式一的基礎(chǔ)上悲没,加上一個固定的字符串篮迎,代碼演示如下
//加鹽
static NSString *salt = @"LKSJDFLKJ";
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *pwd = @"123456";
//傳遞數(shù)據(jù)
pwd = [pwd stringByAppendingString:salt].md5String;
NSLog(@"pwd - %@", pwd);
}
<!--運(yùn)行結(jié)果-->
pwd - 2cac01acb03a3cc2b96cee3aae4d2276
結(jié)論:加固定鹽,現(xiàn)在也不安全示姿,因為如果鹽泄漏了甜橱,也會有數(shù)據(jù)泄漏的風(fēng)險
方式三:HMAC加密
HMAC加密,其原理就是判斷是否有key
栈戳,這個key是由服務(wù)器動態(tài)提供的岂傲,保存在手機(jī)側(cè)。簡單來說子檀,就相當(dāng)于現(xiàn)在的授權(quán)設(shè)備镊掖,HMAC主要就是檢測你的設(shè)備是否有授權(quán)
。其代碼演示如下
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *pwd = @"123456";
//傳遞數(shù)據(jù)
//key是動態(tài)的褂痰,由服務(wù)器提供(即一個賬號一個key)
pwd = [pwd hmacMD5StringWithKey:@"CJL"];
NSLog(@"pwd - %@", pwd);
}
<!--打印結(jié)果-->
pwd - b123975de0f19edef5a546bf212bd918
結(jié)論:現(xiàn)在這種加密方式亩进,用戶密碼確實安全了。但是用于服務(wù)器登錄驗證是一個hash值缩歪,而不是密碼归薛。所以這個hash值也有被攔截的風(fēng)險。也是不安全的
方式四:HMAC + 時間戳
基于方式三的基礎(chǔ)上匪蝙,我們載增加一些東西一起加密主籍,這個增加的就是時間戳
。對于密碼
來說逛球,加密方式還是采用HMAC
加密千元。只是驗證方式發(fā)生了變化。原本只是驗證hash值即可〔疲現(xiàn)在是在hash值的基礎(chǔ)上加上了一個時間期限幸海。例如hash值的有效時間最多是2分鐘,超過這個時間就失效了奥务。類似于現(xiàn)在驗證碼的驗證涕烧。
主要流程如下:
- 1、客戶端:對密碼使用
HMAC加密
汗洒,得到一個hash值A(chǔ)
议纯,hash值帶上服務(wù)器給的時間戳
,求得另一個hash值B
- 2溢谤、將客戶端得到的
Hash值A(chǔ)
瞻凤、Hash值B
發(fā)送到服務(wù)器進(jìn)行驗證 - 3、服務(wù)器:將傳過來的Hash值A(chǔ)世杀,帶上服務(wù)器的時間戳阀参,得到一個Hash值C,判斷Hash值C是否等于傳過來的Hash值B瞻坝,如果不等于蛛壳,則表示不通過,在時間范圍內(nèi),再繼續(xù)驗證上一分鐘
舉例說明
假設(shè)現(xiàn)在用戶的密碼是:123456衙荐,
- 1捞挥、客戶端:
- 使用HMAC加密得到的
Hash值A(chǔ)
=b123975de0f19edef5a546bf212bd918
- HMAC哈希值 + 時間戳(假設(shè)是
2021-4-10 17:15:10
) 得到的hash值B
=430a60f4989e104e9e903dbdcb84c69a
- 使用HMAC加密得到的
- 2、發(fā)送到服務(wù)器的Hash值
-
Hash值A(chǔ)
:b123975de0f19edef5a546bf212bd918
-
hash值B
:430a60f4989e104e9e903dbdcb84c69a
-
- 3忧吟、服務(wù)端:
- HMAC哈希值 + 服務(wù)器時間戳(假設(shè)是
2021-4-10 17:15:11
) 得到的hash值C
=0cf1dceda0fd58aefd4c7a7b2b08e193
- 與客戶端傳入的
hash值C
不等砌函,繼續(xù)求HMAC帶上上一個時間(2分鐘內(nèi))的hash值D
=430a60f4989e104e9e903dbdcb84c69a
.與hash值B相等,所以驗證通過
- HMAC哈希值 + 服務(wù)器時間戳(假設(shè)是
例子中所用的演示代碼如下
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *pwd = @"123456";
//傳遞數(shù)據(jù)
pwd = [pwd hmacMD5StringWithKey:@"CJL"];//key是動態(tài)的溜族,由服務(wù)器提供
NSLog(@"pwd - %@", pwd);
pwd = [NSString stringWithFormat:@"%@%@",pwd, [self getOtherTimeStrWithString:@"2021-4-10 17:15:10"]].md5String;
NSLog(@"pwd - %@", pwd);
}
- (NSString *)getOtherTimeStrWithString:(NSString *)formatTime{
NSLog(@"formatTime - - - - - -%@",formatTime);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //(@"YYYY-MM-dd hh:mm:ss") ----------設(shè)置你想要的格式,hh與HH的區(qū)別:分別表示12小時制,24小時制
//設(shè)置時區(qū)選擇北京時間
NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
[formatter setTimeZone:timeZone];
NSDate* date = [formatter dateFromString:formatTime]; //------------將字符串按formatter轉(zhuǎn)成nsdate
//時間轉(zhuǎn)時間戳的方法:
NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue] * 1000;
NSLog(@"將某個時間轉(zhuǎn)化成 時間戳timeSp:%ld",(long)timeSp); //時間戳的值
return [NSString stringWithFormat:@"%ld",(long)timeSp];
}
數(shù)字簽名
目的:驗證二進(jìn)制數(shù)據(jù)是不是頒發(fā)機(jī)構(gòu)頒發(fā)的
早期只是給一個數(shù)據(jù)讹俊,扔給我,我就用煌抒,這是不安全的
-
1仍劈、數(shù)據(jù)報文,即原始數(shù)據(jù)
早期
后來的數(shù)字簽名寡壮,為了安全耳奕,不僅給數(shù)據(jù),還給數(shù)據(jù)的Hash值诬像,但是還是不安全屋群,因為數(shù)據(jù)、hash值都有可能同時篡改
1坏挠、數(shù)據(jù)報文芍躏,即原始數(shù)據(jù)
-
2、原始數(shù)據(jù)的Hash值
后來
現(xiàn)在的數(shù)字簽名降狠,除了給數(shù)據(jù)对竣,同時還給原始數(shù)據(jù)Hash值
進(jìn)行RSA加密
后得到的hash值,其中原始數(shù)據(jù)HASH值RSA加密后得到的值
稱為原始數(shù)據(jù)的 數(shù)字簽名
1榜配、數(shù)據(jù)報文否纬,即原始數(shù)據(jù)
2、原始數(shù)據(jù)的Hash值
-
3蛋褥、數(shù)字簽名:原始數(shù)據(jù)Hash值通過RSA加密后得到的結(jié)果
現(xiàn)在
總結(jié)
- HASH算法(散列函數(shù))
不可逆運(yùn)算(因為無限的數(shù)據(jù)临燃,存在有限的表示形式,所以會出現(xiàn) 多個不同的數(shù)據(jù)烙心,有同樣的hash值)
相同的數(shù)據(jù)結(jié)果相同
不同的數(shù)據(jù)長度相同
一般用于做數(shù)據(jù)的識別膜廊,例如密碼、版權(quán)淫茵、百度云數(shù)據(jù)識別
- 密碼加密
md5直接加密爪瓜,可被查詢,容易破解
加固定鹽(固定的鹽有安全隱患)
HMAC
:比較好的方案匙瘪,因為破解的成本 大于 破解后的獲益铆铆,所以相對安全HASH + 時間戳
:這樣的方式蝶缀,每次加密結(jié)果不一樣,因為受時間的影響比較大
- 數(shù)字簽名
算法:
RSA + HASH
目的:驗證數(shù)據(jù)的完整性薄货,不被篡改
-
主要邏輯:
- 1翁都、原始數(shù)據(jù)報文進(jìn)行HASH
- 2、使用RSA加密 HASH值(這部分?jǐn)?shù)據(jù)就是原始數(shù)據(jù)的簽名信息)
- 3菲驴、將原始數(shù)據(jù)hash值 + 數(shù)字簽名 一起打包發(fā)送傳遞