iOS逆向 07:Hash算法

iOS 底層原理 + 逆向 文章匯總

本文主要介紹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
  • 2、發(fā)送到服務(wù)器的Hash值
    • Hash值A(chǔ)b123975de0f19edef5a546bf212bd918
    • hash值B430a60f4989e104e9e903dbdcb84c69a
  • 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相等,所以驗證通過

例子中所用的演示代碼如下

- (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ā)送傳遞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荐吵,一起剝皮案震驚了整個濱河市骑冗,隨后出現(xiàn)的幾起案子赊瞬,更是在濱河造成了極大的恐慌,老刑警劉巖贼涩,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巧涧,死亡現(xiàn)場離奇詭異,居然都是意外死亡遥倦,警方通過查閱死者的電腦和手機(jī)谤绳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袒哥,“玉大人缩筛,你說我怎么就攤上這事”こ疲” “怎么了瞎抛?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長却紧。 經(jīng)常有香客問我桐臊,道長,這世上最難降的妖魔是什么晓殊? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任断凶,我火速辦了婚禮,結(jié)果婚禮上巫俺,老公的妹妹穿的比我還像新娘认烁。我一直安慰自己,他們只是感情好介汹,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布砚著。 她就那樣靜靜地躺著,像睡著了一般痴昧。 火紅的嫁衣襯著肌膚如雪稽穆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天赶撰,我揣著相機(jī)與錄音舌镶,去河邊找鬼柱彻。 笑死,一個胖子當(dāng)著我的面吹牛餐胀,可吹牛的內(nèi)容都是我干的哟楷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼否灾,長吁一口氣:“原來是場噩夢啊……” “哼卖擅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墨技,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惩阶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扣汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體断楷,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年崭别,在試婚紗的時候發(fā)現(xiàn)自己被綠了冬筒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡茅主,死狀恐怖舞痰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诀姚,我是刑警寧澤响牛,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站学搜,受9級特大地震影響娃善,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑞佩,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一聚磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炬丸,春花似錦瘫寝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至首启,卻和暖如春暮屡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毅桃。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工褒纲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留准夷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓莺掠,卻偏偏與公主長得像衫嵌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子彻秆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容