你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS網絡安全相關&加密

iOS網絡安全相關&加密

編輯:IOS開發綜合

base64編碼解碼原理

base64簡介

  • 是網絡上使用最廣泛的編碼系統,能夠將任何二進制數據,轉換成只有 65 個字符組成的文本文件.
  • 編碼後的數據由a-z A-Z 0-9 + / =表示.
  • base64 編碼後的結果能夠反算,不夠安全.
  • base64 是所有現代加密算法的基礎算法.

Base64編碼演示 = 終端命令

  • 編碼文件
# 將 10.jpg 進行 base64 編碼,生成 10.txt 文件
$ base64 10.jpg -o 10.txt

# 將 10.txt 解碼生成 10.jpg 文件
$ base64 10.txt -o 10.jpg -D

  • 編碼字符串
# 將字符串 Man 進行 base64 編碼
$ echo -n "Man" | base64

# 將字符串 TWFu 解碼
$ echo -n "TWFu" | base64 -D

base64編碼的原理

  • 把一個字符轉換成二進制取出前6位查表.
  • 不夠6位的時候補0,如果是8位,則補4個0,編碼後連接兩個==.
  • 如果最後是4位,補2個0,編碼後連接一個=.
  • 編碼之後文件會變大,因為有補0.
 

base64編碼解碼模擬加密解密

提示 :此處使用base64編碼解碼來模擬數據的加密和解密.

加密和解密

發送隱私信息時需要加密

提示 :服務器上保存的私密信息是機密之後的數據

保存隱私信息時也需要加密

讀取保存的隱私信息時需要解密

網絡應用程序的數據安全
  • 網絡上不允許傳輸用戶隱私數據的"明文".
  • 在本地不允許保存用戶隱私數據的"明文".

base64編碼解碼模擬加密解密代碼實現

提示 :base64編碼的本質是編碼不是加密.此處只是一個模擬加密

base64編碼 ===>模擬加密

/// base64編碼---加密 : 傳入需要"加密"的字符串,返回"加密"之後的字符串
- (NSString *)base64Encode:(NSString *)str
{
    // 1.將需要加密的數據轉成二進制,因為Base64的編碼和解碼都是針對二進制的
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    // 2.把二進制數據編碼之後,直接轉成字符串
    NSString *encodeStr = [data base64EncodedStringWithOptions:0];
    // 3.返回結果
    return encodeStr;
}

base64解碼 ===>模擬解密
/// base64解碼---解密
- (NSString *)base64Decode:(NSString *)encodeStr
{
    if (encodeStr.length == 0) {
        return nil;
    }

    // 1.把編碼之後的字符串解碼成二進制
    NSData *data = [[NSData alloc] initWithBase64EncodedString:encodeStr options:0];
    // 2.把解碼之後的二進制轉換成字符串
    NSString *decodeStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    // 3. 返回結果
    return decodeStr;
}

發送用戶信息時先"加密".
NSString *psd = self.psdTextField.text;

// 密碼加密之後再發送出去
psd = [self base64Encode:psd];

保存用戶信息之前"加密"處理.
/// 保存"加密"後的用戶信息到偏好設置
- (void)saveUserInfo
{
    [[NSUserDefaults standardUserDefaults] setObject:self.userNameTextField.text forKey:userNameKey];

    // 保存之前先加密
    NSString *userName = [self base64Encode:self.psdTextField.text];
    [[NSUserDefaults standardUserDefaults] setObject:userName forKey:psdKey];
}

讀取本地"加密"的用戶信息時需要"解密".
/// 讀取保存到本地的"加密"的用戶信息
- (void)readUserInfo
{
    self.userNameTextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:userNameKey];

    // 讀取時先解密
    NSString *psd = [self base64Decode:[[NSUserDefaults standardUserDefaults] objectForKey:psdKey]];
    self.psdTextField.text = psd;
}

base64編碼的好處

使用Base64編碼之後,不能直接看到用戶密碼的明文.

存在的問題

但是Base64編碼解碼的算法是公開的,並且算法可逆,安全性並不好.    

MD5

MD5簡介

  • 對任意的數據進行計算,生成固定長度的字符串.32個字符.
  • 一般用來加密密碼.
  • 有時候也用來驗證文件下載時,是否被篡改過.
  • 文件下載完成之後計算文件的md5值,與服務器計算的MD5值比較,如果不一樣那麼這個文件在下載的過程中被篡改了.

MD5終端命令

# 得到文件的MD5值
$ md5 文件名

# 得到字符串的MD5值
md5 -s "string"

MD5加密方案

先導入分類#import "NSString+Hash.h"

方案一 : 直接MD5計算

psd = [psd md5String];

Base64與MD5對比
  • Base64編碼 : "加密"簡單,算法可逆.毫無安全性可言.不能用來加密密碼.
  • MD5 : 加密過程復雜,算法不可逆,安全性高,常用來加密密碼等用戶的敏感信息.但是簡單的密碼MD5加密之後可以暴力破解.
  • 暴力破解網站 :http://www.cmd5.com/

方案二 : 密碼加鹽

  • 如果原始密碼過於簡單,直接進行MD5加密是很容易被暴力破解的.
  • 為了增強密碼的安全性,防止加密的密碼被暴力破解,可以向原始密碼中加鹽.
  • 鹽 : 服務器端和客戶端約定的一個字符串.
  • MD5+鹽 : 原始密碼+鹽拼接出新的密碼字符串,再進行MD加密.
  • 以上為加一勺鹽,比單純的直接MD5加密安全性要高.
  • 鹽要足夠的鹹,越鹹越安全.
// 鹽
NSString *salt = @"123zxcASD!@#";
psd = [[psd stringByAppendingString:salt] md5String];

方案三 : HMAC

  • HMAC : 加兩勺鹽.加兩勺鹽的密碼加密強度比加一勺鹽要高.
  • 原理 : 原始密碼+鹽進行MD5計算,結算的結果+原始密碼再進行MD5計算.
// 鹽
NSString *salt = @"123zxcASD!@#";
psd = [psd hmacMD5StringWithKey:salt];

注意

  • 不能用不可逆的加密算法加密密碼並保存到本地.因為不可逆的加密算法加密的數據幾乎不能還原回來.
  • 蘋果提供了鑰匙串專門保存用戶的私密信息到本地.
 

鑰匙串

safari 偏好設置裡面可以讀取到保存到鑰匙串中的密碼.
使用 AES 256 加密算法,能夠保證用戶密碼的安全.
鑰匙串訪問SDK,是蘋果在 iOS 7.0.3 版本以後公布的.鑰匙串訪問的SDK是純 C 語言的.
鑰匙串訪問的密碼保存在哪裡?
  • 只有蘋果知道!是為了進一步保障用戶的密碼安全!
  • 鑰匙串訪問的第三方框架,是對 C 框架的封裝,可以不用看源代碼.
  • 框架地址 :https://github.com/soffes/sskeychain

sskeychain提供的常用的方法

/// 所有賬戶
+ (NSArray *)allAccounts;
/// 獲取所有賬戶信息
+ (NSArray *)accountsForService:(NSString *)serviceName;
/// 獲取賬號密碼
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
/// 刪除賬號密碼
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
/// 將賬號密碼保存在鑰匙串
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;

密碼保存到鑰匙串

先導入頭文件 :#import "SSKeychain.h"
/*
參數1 : 要保存到鑰匙串的密碼
參數2 : 保存哪個應用的密碼
參數3 : 保存哪個賬號的密碼
*/
[SSKeychain setPassword:self.psdTextField.text forService:[NSBundle mainBundle].bundleIdentifier account:self.userNameTextField.text];

從鑰匙串讀取密碼

self.psdTextField.text=[SSKeychainpasswordForService:[NSBundlemainBundle].bundleIdentifieraccount:self.userNameTextField.text];
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved