密碼學

密碼學概論

原則:

  1. 在網絡上不允許明文傳輸用戶隱私信息;
  2. 在本地不允許明文保存用戶隱私信息;

base64 編碼

base64 編碼:將二進制數據編碼成只有65個字符文本文件(字符)!

base64 編碼包括的字符:0 ~9, a~z, A~Z, +/=

編碼后文件數據會比原有文件大1/3左右。

原理

base64 編碼:8位的二進制ASCII編碼 —> 6位的base64編碼

base64編碼表:

0~63,64個字符,還有 = 表示空格,總共65個字符。

示例:

Man 轉換為 base64 編碼:TWFu

M 的 ASCII編碼 十進制為 77 ,二進制為 01001101:

前6位二進制 010011 (十進制為19)在上面的base64編碼表中為 T 。

因此 M ? T 。

空格情況

因為是把8個字節轉換為6個字節進行編碼,勢必會產生位數不對應的問題。因此會使用 0 來補齊,用=表示全0的情況。(注意到base64 總會編碼補齊為4個字符一組)

因此,單獨的 M 用base64編碼 ? TQ==

Objective-C 代碼

// base64編碼
- (NSString *)base64Encode:(NSString *)string {
    // 1.將字符串轉換為二進制
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    // 2.二進制數據進行編碼
    return [data base64EncodedStringWithOptions:0];
}

// base64解碼
- (NSString *)base64Decode:(NSString *)string {
    // 1.字符串轉換為二進制
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
    // 2.解碼
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

哈希、對稱加密、非對稱加密

上世紀70年代開始 RSA — 非對稱加密算法

RSA — 非對稱加密算法

  • 公鑰加密,私鑰解密;
  • 私鑰加密,公鑰解密;

哈希(散列)函數

  • MD5
  • SHA1\SHA256\SHA512
  • HMAC

對稱加密算法

  • DES
  • 3DES
  • RC2、RC4
  • AES(高級密碼標準,美國國家安全局使用、Apple 鑰匙串訪問使用、Lastpass 使用了256位的AES密鑰),以目前現階段計算機的運行效率,要暴力破解AES加密算法,需要上千萬年。

散列函數

算法都是公開的。

  • 對相同的數據加密,得到的結果是一樣的。
  • 對不同的數據加密,得到的結果是定長的。(比如MD5對不同的數據加密,得到32個字符)
  • 加密之后的數據是沒法解密的。(不可逆運算

MD5 哈希算法

GitHub源碼:jerilimov/NSHash——NSData、NSString 的分類,添加了MD5、SHA1、SHA256、SHA512 加密算法

NSString *pwd = @"123456";
pwd = [pwd MD5];
NSLog(@"MD5 = %@",pwd);
// MD5 = e10adc3949ba59abbe56e057f20f883e

像 MD5 這樣的加密算法是無法反向解密的,但是對相同的數據加密,得到的結果是一樣的。

于是 CMD5 利用散列函數的這種特性,將加密前的數據和加密后的數據進行映射保存,可以實現反向查詢。

將剛才 123456 加密后的 MD5 輸入,可以反向查詢出原始數據:

MD5加鹽:對數據先加鹽,再進行MD5加密,可以增加結果的復雜度

/* 鹽,足夠長,足夠復雜,足夠咸*/
static NSString *slat = @"5O9Jc!9%N^6Kd*dcS9Or$&fSVWmC^xku2@Lg0xd8CL0Sl$omN6zQS7c7YrHhtwn@";

NSString *pwd = @"123456";
pwd = [[pwd stringByAppendingString:slat] MD5];
NSLog(@"MD5 = %@",pwd);
// MD5 = 04f60881265e2b240b217f8deaaa8e12

再將此MD5密碼放到該網站上進行查詢:

沒有查到,結果顯示,被反向查詢出來的難度就會加大。

缺點:鹽是固定的,如果鹽被泄露,數據就會不安全。

注:哈希算法&加密算法的區分

  • MD5、HMAC、SHA 等所有的哈希算法嚴格上來說并不能稱之為加密算法,它只能說是密碼學中的哈希算法
  • 加密算法加密之后是可以解密的,而哈希算法無法反向解出原始數據。
  • 哈希算法通常用于校驗數據的完整性,例如:校驗下載后的安裝包文件是否被篡改、刪減或植入惡意代碼。

HMAC 哈希算法

//-----------------------------------------------------
#import <Foundation/Foundation.h>

@interface NSString (Hash)
- (NSString *)hmacMD5StringWithKey:(NSString *)key;
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;
- (NSString *)hmacSHA512StringWithKey:(NSString *)key;
@end
  
#import "NSString+Hash.h"
#import <CommonCrypto/CommonHMAC.h>
@implementation NSString (Hash)

- (NSString *)hmacMD5StringWithKey:(NSString *)key
{
    return [self hmacStringUsingAlg:kCCHmacAlgMD5 withKey:key];
}
- (NSString *)hmacSHA1StringWithKey:(NSString *)key
{
    return [self hmacStringUsingAlg:kCCHmacAlgSHA1 withKey:key];
}
- (NSString *)hmacSHA256StringWithKey:(NSString *)key
{
    return [self hmacStringUsingAlg:kCCHmacAlgSHA256 withKey:key];
}
- (NSString *)hmacSHA512StringWithKey:(NSString *)key
{
    return [self hmacStringUsingAlg:kCCHmacAlgSHA512 withKey:key];
}
#pragma mark - Helpers
- (NSString *)hmacStringUsingAlg:(CCHmacAlgorithm)alg withKey:(NSString *)key
{
    size_t size;
    switch (alg) {
        case kCCHmacAlgMD5:
            size = CC_MD5_DIGEST_LENGTH;
            break;
        case kCCHmacAlgSHA1:
            size = CC_SHA1_DIGEST_LENGTH;
            break;
        case kCCHmacAlgSHA224:
            size = CC_SHA224_DIGEST_LENGTH;
            break;
        case kCCHmacAlgSHA256:
            size = CC_SHA256_DIGEST_LENGTH;
            break;
        case kCCHmacAlgSHA384:
            size = CC_SHA384_DIGEST_LENGTH;
            break;
        case kCCHmacAlgSHA512:
            size = CC_SHA512_DIGEST_LENGTH;
            break;
        default:
            return nil;
    }
    
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableData *mutableData = [NSMutableData dataWithLength:size];
    CCHmac(alg, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes);
    return [self stringFromBytes:(unsigned char *)mutableData.bytes length:(int)mutableData.length];
}
- (NSString *)stringFromBytes:(unsigned char *)bytes length:(int)length
{
    NSMutableString *mutableString = @"".mutableCopy;
    for (int i = 0; i < length; i++)
        [mutableString appendFormat:@"%02x", bytes[i]];
    return [NSString stringWithString:mutableString];
}
@end

測試

// HMAC 用一個密鑰加密,并且做了兩次散列。
// 在實際的開發中,密鑰來自于服務器。——對應一個帳號,一個KEY
NSString *pwd = @"123456";
pwd = [pwd hmacMD5StringWithKey:@"Key"];
NSLog(@"MD5 = %@",pwd);
// MD5 = a7cac7471d2c9eb7a944e07d44d305ca

將此MD5密碼放到該網站上查詢也是查不到的。

項目實際使用流程:

  1. 服務器根據用戶帳號生成KEY,發送給客戶端;
  2. 客戶端獲得KEY并保存到本地,使用KEY對數據進行HMAC加密,將加密后的數據發送給服務器;
  3. 服務器對加密后對數據進行驗證。

客戶端登錄時,沒有KEY就先根據帳號從服務器獲取KEY保存到本地,再將獲得的KEY對密碼進行加密。

防止KEY泄露,對KEY進行非對稱加密、定期更換KEY。

QQ設備鎖:

  • 本地有KEY——為授權手機。
  • 本地沒有KEY,未授權設備,需要允許服務器發送KEY。允許一次登錄,本地不保存KEY,允許多次登錄,保存KEY到本地。
  • 短信驗證碼登錄獲取KEY。
  • 申訴獲取KEY。

HMAC加密+時間戳(不加秒)

之前:

驗證方式:HMAC密碼直接匹配是否正確。

現在:

客戶端:(HMAC密碼+“201711010358”).MD5校驗

服務器:

  1. (HMAC密碼+“201711010359”).MD5校驗
  2. (HMAC密碼+“201711010358”).MD5校驗

密碼驗證有效期最長2分鐘,超過2分鐘,驗證失敗。

有經驗的服務器人員,會在返回數據時,返回時間戳。

登錄等待時間,不要超過6秒!!!提示用戶:你的網絡不穩定,請稍后再試!

終端測試命令:

md5 -s "string" #這是 Apple 用的 openssl 標準進行的MD5加密

MD5使用場景,百度搜索引擎(拆詞搜索思路)運用 以及百度云盤文件識別運用

搜索引擎的拆詞搜索 && 詞庫

無論搜索 Apple Blue Sky,還是搜索Sky Blue Apple,得到的返回結果是一樣的。

原理

先計算各個單詞的MD5

  • MD5 ("Apple") = 9f6290f4436e5a2351f12e03b6433c3c
  • MD5 ("Blue") = 9594eec95be70e7b1710f730fdda33d9
  • MD5 ("Sky") = 03462a41aec357b74c89eb8d272532f7

然后再對MD5值進行按位相加,得到的結果是一樣的。

再去搜索匹配結果的數據。

散列碰撞:兩個不同的數據,哈希之后,得到相同的哈希值!

從理論的角度出發,有無限個碰撞可能!

MD5 32為字符,它能表達的數據個數是有限的,而被加密的數據是無限個。

其他使用場景

通過數據的散列值,判斷數據是否相等,保存云盤數據(相同的數據在云上保存一份)。

正版軟件使用哈希進行文件識別。

對下載后的軟件安裝版進行 MD5 校驗,判斷安裝包是否被污染。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 這篇文章主要講述在Mobile BI(移動商務智能)開發過程中,在網絡通信、數據存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,585評論 0 6
  • 一、GET/POST方法簡介&用戶安全 1、GET/POST方法簡介 在客戶端和服務器之間進行請求-響應時,兩種最...
    方圓十里不留母狗閱讀 32,069評論 0 13
  • 概述 之前一直對加密相關的算法知之甚少,只知道類似DES、RSA等加密算法能對數據傳輸進行加密,且各種加密算法各有...
    Henryzhu閱讀 3,044評論 0 14
  • 桃花源 有朵偷開的桃花 還在 隱隱發笑 彌留之際 歲月給了她輕狂的一擊 泡沫鋪滿空城。
    留子堯閱讀 199評論 0 2
  • 我的朋友在家掃地,她上幼兒園的外甥跑來說:“小姨,我幫你掃地。”她高高興興地把掃帚交給外甥,打算看他大干一場。 小...
    進擊的工人閱讀 277評論 0 0