標籤:
1.MD5MD5即Message-Digest Algorithm 5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。是電腦廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法),主流程式設計語言普遍已有MD5實現。將資料(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD5的前身有MD2、MD3和MD4。MD5演算法具有以下特點:1、壓縮性:任意長度的資料,算出的MD5值長度都是固定的。2、容易計算:從原資料計算出MD5值很容易。3、抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。4、強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。MD5的作用是讓大容量資訊在用數位簽章軟體簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進位數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。簡單的說,MD5就是網路加密技術的一種,就是把一個任一字元組成的普通的密碼,通過MD5演算法,換成一定長的十六進位數字串。比如一個密碼為:123456 通過MD5加密後就變成了: 常規 md5加密($pass) 32位MD5大寫:E10ADC3949BA59ABBE56E057F20F883E32位MD5小寫:e10adc3949ba59abbe56e057f20f883e16位MD5大寫:49BA59ABBE56E05716位MD5小寫:49ba59abbe56e057
- (NSString *)md5 {
const char *str = [self UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), digest);
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[result appendFormat:@"%02X", digest[i]];
return result;
}
- (NSString*)MD5
{
// Create pointer to the string as UTF8
const char *ptr = [self UTF8String];
// Create byte array of unsigned chars
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
// Create 16 byte MD5 hash value, store in buffer
CC_MD5(ptr, (CC_LONG)strlen(ptr), md5Buffer);
// Convert MD5 value in the buffer to NSString of hex values
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02X",md5Buffer[i]];
return output;
}
2.Base64
Base64編碼原理
Base64編碼之所以稱為Base64,是因為其使用64個字元來對任意資料進行編碼,同理有Base32、Base16編碼。
這64個字元是各種字元編碼(比如ASCII編碼)所使用字元的子集,基本,並且可列印。唯一有點特殊的是最後兩個字元,因對最後兩個字元的選擇不同,Base64編碼又有很多變種,比如Base64 URL編碼。
Base64編碼本質上是一種將位元據轉成文本資料的方案。對於非位元據,是先將其轉換成二進位形式,然後每連續6位元(2的6次方=64)計算其十進位值,根據該值在上面的索引表中找到對應的字元,最終得到一個文本字串。
通過NSString+Base64分類來實現
#import <Foundation/Foundation.h>@interface NSString (Base64)/** * 轉換為Base64編碼 */ - (NSString *)base64EncodedString; /** * 將Base64編碼還原 */ - (NSString *)base64DecodedString; @end
#import "NSString+Base64.h"@implementation NSString (Base64)- (NSString *)base64EncodedString;{NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];return [data base64EncodedStringWithOptions:0];}- (NSString *)base64DecodedString{NSData *data = [[NSData alloc]initWithBase64EncodedString:self options:0];return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];}@end
可能會有人在不理解Base64編碼的情況下,將其誤用於資料加密或資料校正。
Base64是一種資料編碼方式,目的是讓資料符合傳輸協議的要求。標準Base64編碼解碼無需額外資訊即完全可逆,即使你自己自訂字元集設計一種類Base64的編碼方式用於資料加密,在多數情境下也較容易破解。
對於資料加密應該使用專門的目前還沒有有效方式快速破解的密碼編譯演算法。比如:對稱式加密演算法AES-128-CBC,對稱式加密需要密鑰,只要密鑰沒有泄露,通常難以破解;也可以使用非對稱式加密演算法,如 RSA,利用極大整數因數分解的計算量極大這一特點,使得使用公開金鑰加密的資料,只有使用私密金鑰才能快速解密。
對於資料校正,也應該使用專門的訊息認證碼產生演算法,如 HMAC - 一種使用單向散列函數構造訊息認證碼的方法,其過程是無法復原的、唯一確定的,並且使用密鑰來產生認證碼,其目的是防止資料在傳輸過程中被篡改或偽造。將未經處理資料與認證碼一起傳輸,資料接收端將未經處理資料使用相同密鑰和相同演算法再次產生認證碼,與原有認證碼進行比對,校正資料的合法性。
Base64兼顧字元集大小和編碼後資料長度,並且可以靈活替換字元集的最後兩個字元,以應對多樣的需求,使其適用情境非常廣泛。
iOS開發之MD5與Base64