APP安全機制(三)—— Base64加密

版本記錄

版本號 時間
V1.0 2017.08.19

前言

在這個信息爆炸的年代,特別是一些敏感的行業,比如金融業和銀行卡相關等等,這都對app的安全機制有更高的需求,很多大公司都有安全 部門,用于檢測自己產品的安全性,但是及時是這樣,安全問題仍然被不斷曝出,接下來幾篇我們主要說一下app的安全機制。感興趣的看我上面幾篇。
1. APP安全機制(一)—— 幾種和安全性有關的情況
2. APP安全機制(二)—— 使用Reveal查看任意APP的UI

Base64加密

1. 基本了解

下面是百度百科上的解釋。

Base64是網絡上最常見的用于傳輸8Bit字節碼的編碼方式之一,Base64就是一種基于64個可打印字符來表示二進制數據的方法。可查看RFC2045~RFC2049,上面有MIME的詳細規范。Base64編碼是從二進制到字符的過程,可用于在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就采用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,采用Base64編碼具有不可讀性,需要解碼后才能閱讀。

其實Base64作為一種編碼方式:

  • 定義:8Bits字節編碼方式之一
  • 應用 :傳輸8Bit字節代碼
  • 特性:Base64編碼具有不可讀性

2. 原理

下面看一下轉碼的例子。

3 * 8bits = 4 * 6bits
內存一個字節占8位,轉前:s13,先轉成ASCII:115 49 51 ,然后對應的二進制:01110011 00110001 00110011,下面我們就對其進行分組,6bits一組可以分為四組,如下所示:011100 110011 000100 110011,然后計算機是8位8位的存數6位不夠就在高位自動補充2個0,所有高位都補0,所以計算機輸入為: 00011100 00110011 00000100 00110011,轉化可以得到 28 51 4 51,查表可以看到c z E z

迅雷下載的鏈接,地址就是加密的專用下載地址,也是用Base64加密的,過程如下:

  • 在地址前后分別添加AA和ZZ
  • 對新的字符串進行Base64編碼

Flashget與迅雷類似,只是加不同罷了,QQ旋風根本不加料,直接進行Base64編碼。

下面給大家看一下Base64編碼對應的字母表。

Base64對應編碼字母表

3. API

下面看一下Base64相關的API

@interface NSData (NSDataBase64Encoding)

/* Create an NSData from a Base-64 encoded NSString using the given options. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64 encoded NSString from the receiver's contents using the given options.
*/
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create an NSData from a Base-64, UTF-8 encoded NSData. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);

/* Create a Base-64, UTF-8 encoded NSData from the receiver's contents using the given options.
*/
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

@end

這里還有兩個枚舉,分別對應編碼encode和解碼decode的option。

1. 編碼 NSDataBase64EncodingOptions
typedef NS_OPTIONS(NSUInteger, NSDataBase64EncodingOptions) {
    // Use zero or one of the following to control the maximum line length after which a line ending is inserted. No line endings are inserted by default.
    NSDataBase64Encoding64CharacterLineLength = 1UL << 0,
    NSDataBase64Encoding76CharacterLineLength = 1UL << 1,
    
    // Use zero or more of the following to specify which kind of line ending is inserted. The default line ending is CR LF.
    NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,
    NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,
    
} NS_ENUM_AVAILABLE(10_9, 7_0);

下面具體看一下這幾個枚舉的含義:

  • NSDataBase64Encoding64CharacterLineLength: 作用是將生成的Base64字符串按照64個字符長度進行等分換行。
  • NSDataBase64Encoding76CharacterLineLength:作用是將生成的Base64字符串按照76個字符長度進行等分換行。
  • NSDataBase64EncodingEndLineWithCarriageReturn:作用是將生成的Base64字符串以回車結束。
  • NSDataBase64EncodingEndLineWithLineFeed:作用是將生成的Base64字符串以換行結束
2. 解碼 NSDataBase64DecodingOptions
typedef NS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {
    // Use the following option to modify the decoding algorithm so that it ignores unknown non-Base64 bytes, including line ending characters.
    NSDataBase64DecodingIgnoreUnknownCharacters = 1UL << 0
} NS_ENUM_AVAILABLE(10_9, 7_0);

下面看一下枚舉的具體含義:

  • NSDataBase64DecodingIgnoreUnknownCharacters:表示在將解碼過程中忽略不能識別的字節

4. 代碼演練

下面我們就回到我們的領域,看一下我們ios領域OC版本的Base64應用舉例。

1. JJEncodeVC.m
#import "JJEncodeVC.h"

@interface JJEncodeVC ()

@property (nonatomic, assign) BOOL isEncode;
@property (nonatomic, copy) NSString *imageEncodeStr;

@end

@implementation JJEncodeVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.isEncode = YES;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (self.isEncode) {
        [self beginEncode];
    }
    else {
        [self beginDecode];
    }
}

#pragma mark - Object Private Function

- (void)beginEncode
{
    self.isEncode = NO;
    
    UIImage *image = [UIImage imageNamed:@"Base64"];
    
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    
    self.imageEncodeStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    
    NSLog(@"self.imageEncodeStr = %@", self.imageEncodeStr);
}

- (void)beginDecode
{
    self.isEncode = YES;
    
    NSData *decodeData = [[NSData alloc] initWithBase64EncodedString:self.imageEncodeStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
    
    UIImage *decodedImage = [UIImage imageWithData:decodeData];
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(60, 100, 300, 250)];
    imgView.contentMode = UIViewContentModeScaleAspectFit;
    imgView.image = decodedImage;
    [self.view addSubview:imgView];
}

@end

運行起來,我們先點擊一下屏幕進行編碼,看一下部分輸出結果,數據較多,只給部分。

2017-08-19 12:04:41.764 JJOC[3627:88745] self.imageEncodeStr = /9j/4AAQSkZJRgABAQAAAAAAAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAAB
AAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAAB
AAAAWgAAAAAAAAAAAAAAAQAAAAAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAA
AfSgAwAEAAAAAQAAAUAAAAAA/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAA
OEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/AABEIAUAB9AMBEQACEQEDEQH/
xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUE
BAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZ......

在點擊一下屏幕,進行解碼,看一下顯示效果。

效果展示

可見還是很好的解碼和顯示了,不過還需要注意:

  • Base64是一種數據編碼方式,目的是讓數據符合傳輸協議的要求。標準Base64編碼解碼無需額外信息即完全可逆,即使你自己自定義字符集設計一種類Base64的編碼方式用于數據加密,在多數場景下也較容易破解。

  • 對于數據加密應該使用專門的目前還沒有有效方式快速破解的加密算法。比如:對稱加密算法AES-128-CBC,對稱加密需要密鑰,只要密鑰沒有泄露,通常難以破解;也可以使用非對稱加密算法,如RSA,利用極大整數因數分解的計算量極大這一特點,使得使用公鑰加密的數據,只有使用私鑰才能快速解密。

  • 對于數據校驗,也應該使用專門的消息認證碼生成算法,如HMAC - 一種使用單向散列函數構造消息認證碼的方法,其過程是不可逆的、唯一確定的,并且使用密鑰來生成認證碼,其目的是防止數據在傳輸過程中被篡改或偽造。將原始數據與認證碼一起傳輸,數據接收端將原始數據使用相同密鑰和相同算法再次生成認證碼,與原有認證碼進行比對,校驗數據的合法性。

參考文章

1. iOS開發探索-Base64編碼
2. iOS base64 加密解密 通用類

后記

未完,待續~~~

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

推薦閱讀更多精彩內容