Base64編碼坏挠、MD5芍躏、SHA1-SHA512、HMAC(SHA1-SHA512)

據(jù)說今天520是個(gè)好日子降狠,為什么我想起的是502对竣、500、404這些榜配?還好服務(wù)器沒事否纬!

另,下圖剛好520喜歡蛋褥,已截圖保存临燃,不用擔(dān)心破壞,隨意點(diǎn)喜歡吧

520

一烙心、Base64編碼

Base64編碼要求把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24)膜廊,之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式淫茵,這樣每一個(gè)字節(jié)的有效位為6位爪瓜,則取值范圍0~630 ~ (2^6 - 1)。如果最后剩下的字符不到3個(gè)字節(jié)痘昌,則用0填充钥勋,輸出字符使用'=',因此我們看到Base64末尾會(huì)有1到2個(gè)'='辆苔。另外標(biāo)準(zhǔn)還要求每76個(gè)字符要插入換行(不過算灸,這個(gè)視具體情況定)。

iOS7之后蘋果有自己的Base64編碼解碼API驻啤,NSData的擴(kuò)展:NSData (NSDataBase64Encoding)

兩種存儲(chǔ)方式

  • 可見字符串形式

為了保證所輸出的每一個(gè)編碼字節(jié)都是可讀字符菲驴,而不是0~63這些數(shù)字,Base64制作了一個(gè)碼表骑冗,就像ASCII碼表一樣赊瞬,每一個(gè)Base64碼值都有對(duì)應(yīng)的字符。64個(gè)可讀字符從0到63非別是A-Z贼涩、a-z巧涧、0-9、+遥倦、/谤绳,這也是Base64名字的由來。

  • 以16進(jìn)制形式

即NSData形式保存,Base64編碼結(jié)果為字符缩筛,而這些字符又對(duì)應(yīng)ASCII碼表的碼值消略,NSData就是存儲(chǔ)ASCII碼表的碼值。

下面舉個(gè)例子瞎抛,并以蘋果提供的API來詳細(xì)介紹Base64編碼解碼過程:

假設(shè)我們對(duì)字符串"123"進(jìn)行Base64編碼艺演,"123"對(duì)應(yīng)的16進(jìn)制是313233,二進(jìn)制為00110001桐臊、00110010胎撤、00110011,將其變?yōu)?*6結(jié)果即下表中的第一行豪硅。然后根據(jù)Base64的碼表哩照,它們分別對(duì)應(yīng)表中的第二行挺物。那么"123"編碼的最終結(jié)果即為MTIz懒浮,以字符串的形式保存。然后根據(jù)MTIz對(duì)應(yīng)ASCII碼值识藤,以NSData形式存儲(chǔ)砚著,如表中的第三行。

轉(zhuǎn)換為4*6結(jié)果 00001100 00010011 00001000 00110011
Base64對(duì)應(yīng)字符 M T I z
對(duì)應(yīng)ASCII碼值(16進(jìn)制) 4d 54 49 7a

上面的過程通過代碼實(shí)現(xiàn)如下:

// 1 待編碼的原始字符串
NSString *plainStr = @"123";
// 2 將其轉(zhuǎn)換成NSData保存痴昧,那么"123"對(duì)應(yīng)的ASCII碼表碼值是31稽穆、32、33(16進(jìn)制)
NSData *plainData = [plainStr dataUsingEncoding:NSUTF8StringEncoding];
// 3.1 將其進(jìn)行Base64編碼赶撰,且結(jié)果以字符串形式保存舌镶,對(duì)應(yīng)表中的第二行
NSString *baseStr = [plainData base64EncodedStringWithOptions:0];
// 3.2 將其進(jìn)行Base64編碼,且結(jié)果以NSData形式保存
NSData *base64Data = [plainData base64EncodedDataWithOptions:0];

另外對(duì)于參數(shù)NSDataBase64EncodingOptions選項(xiàng)豪娜,有多種取值

  • NSDataBase64Encoding64CharacterLineLength:每64個(gè)字符插入\r或\n
  • NSDataBase64Encoding76CharacterLineLength:每76個(gè)字符插入\r或\n餐胀,標(biāo)準(zhǔn)中有要求是76個(gè)字符要換行,不過具體還是自己定
  • NSDataBase64EncodingEndLineWithCarriageReturn:插入字符為\r
  • NSDataBase64EncodingEndLineWithLineFeed:插入字符為\n

前兩個(gè)選項(xiàng)為是否允許插入字符瘤载,以及多少個(gè)字符長(zhǎng)度插入否灾,兩個(gè)可以選其一或者都不選。后兩個(gè)選項(xiàng)代表要插入的具體字符鸣奔。比如我們想76個(gè)字符后插入一個(gè)\r則可以NSDataBase64Encoding76CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn墨技。而在上面舉的例子中選項(xiàng)為0,則代表不插入字符挎狸。

第三方框架

在iOS7之前我們一般用的都是第三方框架扣汪,比如nicklockwood寫的https://github.com/nicklockwood/Base64還有Google的GTMBase64,雖然蘋果有了自己的實(shí)現(xiàn)锨匆,但是許多其它的加密框架都用到了它崭别,所以還是要了解一下,另外它還提供任意長(zhǎng)度字符插入\r\n,而蘋果只能是64或76長(zhǎng)度紊遵。

二账千、MD5、SHA1暗膜、SHA256匀奏、SHA512、HMAC實(shí)現(xiàn)

主要用于驗(yàn)證学搜,防止信息被修改娃善。介紹請(qǐng)參照http://www.reibang.com/p/003b85fd3e36

具體的實(shí)現(xiàn)參考第三方框架:https://github.com/kelp404/CocoaSecurity瑞佩。非常全面聚磺,不過不是太方便,比如想要獲得MD5結(jié)果

NSString *plainStr = @"123";
CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr];
// 獲取md5結(jié)果
NSString *md5Str = md5.hexLower;

不能直接plainStr.MD5Hash就獲得字符串形式的結(jié)果炬丸,這里我封裝了一個(gè)瘫寝,可以參見工程中的NSString+Hash類https://github.com/mddios/EncryptionTools,可以直接對(duì)字符串進(jìn)行操作,類似plainStr.MD5Hash稠炬、plainStr.sha1Hash···plainStr.sha256Hash···焕阿,非常方便。

比如對(duì)@"123"哈希首启,下面用上面提到兩種方法:

- (void)hashTest {
    NSString *plainStr = @"123";
    // md5
    CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr];
    NSLog(@"md5:%lu---%@---%@",plainStr.md5Hash.length, plainStr.md5Hash,md5.hex);
    // 40
    CocoaSecurityResult *sha1 = [CocoaSecurity sha1:plainStr];
    NSLog(@"sha1:%lu---%@---%@",plainStr.sha1Hash.length,  plainStr.sha1Hash,sha1.hex);
    // 56
    CocoaSecurityResult *sha224 = [CocoaSecurity sha224:plainStr];
    NSLog(@"sha224:%lu---%@---%@",plainStr.sha224Hash.length,plainStr.sha224Hash,sha224.hex);
    // 64
    CocoaSecurityResult *sha256 = [CocoaSecurity sha256:plainStr];
    NSLog(@"sha256:%lu---%@---%@",plainStr.sha256Hash.length,plainStr.sha256Hash,sha256.hex);
    // 96
    CocoaSecurityResult *sha384 = [CocoaSecurity sha384:plainStr];
    NSLog(@"sha384:%lu---%@---%@",plainStr.sha384Hash.length,plainStr.sha384Hash,sha384.hex);
    // 128
    CocoaSecurityResult *sha512 = [CocoaSecurity sha512:plainStr];
    NSLog(@"sha512:%lu---%@---%@",plainStr.sha512Hash.length,plainStr.sha512Hash,sha512.hex);
    
    // hmac
    CocoaSecurityResult *hmacmd5 = [CocoaSecurity hmacMd5:plainStr hmacKey:plainStr];
    NSLog(@"hmacmd5:%lu---%@---%@",[plainStr hmacMD5WithKey:plainStr].length,[plainStr hmacMD5WithKey:plainStr],hmacmd5.hex);
}
  • 在電腦終端來獲取結(jié)果

封裝的代碼中NSString+Hash.h頭文件暮屡,有具體列出終端命令方法,如下:

/// 返回結(jié)果:32長(zhǎng)度   終端命令:md5 -s "123"
- (NSString *)md5Hash;

/// 返回結(jié)果:40長(zhǎng)度   終端命令:echo -n "123" | openssl sha -sha1
- (NSString *)sha1Hash;

/// 返回結(jié)果:56長(zhǎng)度   終端命令:echo -n "123" | openssl sha -sha224
- (NSString *)sha224Hash;

/// 返回結(jié)果:64長(zhǎng)度   終端命令:echo -n "123" | openssl sha -sha256
- (NSString *)sha256Hash;

/// 返回結(jié)果:96長(zhǎng)度   終端命令:echo -n "123" | openssl sha -sha384
- (NSString *)sha384Hash;

/// 返回結(jié)果:128長(zhǎng)度   終端命令:echo -n "123" | openssl sha -sha512
- (NSString *)sha512Hash;

#pragma mark - HMAC

/// 返回結(jié)果:32長(zhǎng)度  終端命令:echo -n "123" | openssl dgst -md5 -hmac "123"
- (NSString *)hmacMD5WithKey:(NSString *)key;

/// 返回結(jié)果:40長(zhǎng)度   echo -n "string" | openssl sha -sha1 -hmac "key"
- (NSString *)hmacSHA1WithKey:(NSString *)key;
- (NSString *)hmacSHA224WithKey:(NSString *)key;
- (NSString *)hmacSHA256WithKey:(NSString *)key;
- (NSString *)hmacSHA384WithKey:(NSString *)key;
- (NSString *)hmacSHA512WithKey:(NSString *)key;
  • 關(guān)于MD5加鹽毅桃,只是多了下面第一行
plainStr = [plainStr stringByAppendingString:salt];
NSString *md5Str = plainStr.md5Hash;

github代碼下載地址:https://github.com/mddios/EncryptionTools

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褒纲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钥飞,更是在濱河造成了極大的恐慌莺掠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代承,死亡現(xiàn)場(chǎng)離奇詭異汁蝶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)论悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門掖棉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀估,你說我怎么就攤上這事幔亥。” “怎么了察纯?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帕棉,是天一觀的道長(zhǎng)针肥。 經(jīng)常有香客問我,道長(zhǎng)香伴,這世上最難降的妖魔是什么慰枕? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮即纲,結(jié)果婚禮上具帮,老公的妹妹穿的比我還像新娘。我一直安慰自己低斋,他們只是感情好蜂厅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膊畴,像睡著了一般掘猿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唇跨,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天稠通,我揣著相機(jī)與錄音,去河邊找鬼轻绞。 笑死采记,一個(gè)胖子當(dāng)著我的面吹牛佣耐,可吹牛的內(nèi)容都是我干的政勃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兼砖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奸远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讽挟,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懒叛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耽梅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛窥,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年眼姐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诅迷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡众旗,死狀恐怖罢杉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贡歧,我是刑警寧澤滩租,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布赋秀,位于F島的核電站,受9級(jí)特大地震影響律想,放射性物質(zhì)發(fā)生泄漏猎莲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一技即、第九天 我趴在偏房一處隱蔽的房頂上張望益眉。 院中可真熱鬧,春花似錦姥份、人聲如沸郭脂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)展鸡。三九已至,卻和暖如春埃难,著一層夾襖步出監(jiān)牢的瞬間莹弊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工涡尘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忍弛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓考抄,卻偏偏與公主長(zhǎng)得像细疚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子川梅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 引言: 根據(jù)相關(guān)資料(上半部之哈希/下半部之對(duì)稱和非對(duì)稱加密)進(jìn)行整理疯兼,方便以后回顧和查閱...... Base6...
    HoyaWhite閱讀 3,333評(píng)論 1 6
  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,776評(píng)論 2 17
  • 編碼原理 Base64編碼就是把3個(gè)8位的二進(jìn)制數(shù)據(jù)用4個(gè)ASCII可見字符展示出來。編碼時(shí)贫途,將3個(gè)8位二進(jìn)制碼重...
    awesome丁閱讀 987評(píng)論 0 0
  • 原文在這里:各種字符集和編碼詳解 在軟件的編碼和實(shí)現(xiàn)中吧彪,我們可能會(huì)碰到個(gè) 一個(gè)比較頭疼的問題--編碼,不同字符間的...
    舌尖上的大胖閱讀 1,793評(píng)論 0 2
  • 2016-7-25晴 這兩天寫“性能量”傀缩,這真的是剛需,不僅瀏覽量猛增凫碌,《今日頭條》單篇訪問量激增至30萬(wàn)+扑毡,評(píng)論...
    實(shí)干作品閱讀 371評(píng)論 0 0