1. 程式人生 > >iOS開發常用的加密方式介紹和使用

iOS開發常用的加密方式介紹和使用

  • 普通加密方法是講密碼進行加密後儲存到使用者偏好設定中
  • 鑰匙串是以明文形式儲存,但是不知道存放的具體位置

一. base64加密

  • base64 編碼是現代密碼學的基礎
  • 基本原理:
    • 原本是 8個bit 一組表示資料,改為 6個bit一組表示資料,不足的部分補零,每 兩個0 用 一個 = 表示
    • 用base64 編碼之後,資料長度會變大,增加了大約 1/3 左右.(8-6)/6
  • 可進行反向解密
  • Xcode7.0 之後出現的
  • 編碼有個非常顯著的特點,末尾有個 = 號

將檔案進行加密

    // 獲取需要加密檔案的二進位制資料
    NSData *data = [NSData dataWithContentsOfFile:
@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"]; // 或 base64EncodedStringWithOptions NSData *base64Data = [data base64EncodedDataWithOptions:0]; // 將加密後的檔案儲存到桌面 [base64Data writeToFile:@"/Users/wangpengfei/Desktop/123" atomically:YES];

將檔案進行解密

    // 獲得加密後的二進位制資料
    NSData *base64Data = [NSData dataWithContentsOfFile:
@"/Users/wangpengfei/Desktop/123"]; // 解密 base64 資料 NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0]; // 寫入桌面 [baseData writeToFile:@"/Users/wangpengfei/Desktop/IMG_5551.jpg" atomically:YES];

利用終端命令進行base64運算:

    // 將檔案 meinv.jpg 進行 base64運算之後儲存為 meinv.txt
    base64
meinv.jpg -o meinv.txt // 講meinv.txt 解碼生成 meinv.png base64 -D meinv.txt -o meinv.png // 將字串 "hello" 進行 base 64 編碼 結果:aGVsbG8=cho "hello" | base64 // 將 base64編碼之後的結果 aGVsbG8= 反編碼為字串 echo aGVsbG8= | base64 -D

二. POST加密

A. 搭建UI框架

  • Login.storyboard
    • 兩個UItextFiled : 分別輸入使用者名稱和密碼
    • UIButton : 登入按鈕
  • Main.storyboard
    • 直接拖一個navigationController->tableViewController
    • navigationItem + 登出按鈕

B. 實現基本加密

  • 抽取出讀取資料的方法

      - (void)readLocalUserInfo {
          // 1. 例項化偏好設定物件
          NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
          // 2. 取出資料進行賦值
          self.userName.text = [userDefaults objectForKey:kUserNameKey];
    
          // 此時讀取的是加密後的密碼
          self.password.text = [userDefaults objectForKey:kPasswordKey];
    }
  • 抽取出儲存資料的方法

      - (void)saveLocalUserInfo {
          // 1. 例項化偏好設定物件
          NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
          // 2. 儲存使用者名稱
          [userDefaults setObject:self.userName.text forKey:kUserNameKey];
    
          // 3. 將密碼進行base64 加密
          // 將密碼轉化為二進位制資料
          NSData *data = [self.password.text dataUsingEncoding:NSUTF8StringEncoding];
    
          // 進行加密
          NSString *base64Str = [data base64EncodedStringWithOptions:0];
    
          // 4. 將加密後的密碼儲存到偏好設定
          [userDefaults setObject:base64Str forKey:kPasswordKey];
    
          // 5. 為了保證執行緒的一致性,無論是儲存還是讀取資料,都要進行同步
          [userDefaults synchronize];
    }
  • 在點選事件中進行登入操作

      - (IBAction)btnLoginDidClick:(UIButton *)sender {
          // 如果兩個文字框均不為空,則進行登入操作
          if (self.userName.text.length && self.password.text.length) {
    
              // 1. 建立請求
              NSString *urlString = @"http://localhost/login/login.php";
    
              NSURL *url = [NSURL URLWithString:urlString];
    
              // POST 請求需要手動設定請求方法,因此為可變請求
              NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
              // 設定請求方法
              request.HTTPMethod = @"POST";
    
              // 設定請求引數
              NSString *body = [NSString stringWithFormat:@"username=%@&password=%@", self.userName.text, self.password.text];
    
              // 將字串轉為二進位制資料
              NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];
    
              // 設定請求主體(二進位制資料)
              request.HTTPBody = bodyData;
    
              // 2. 傳送請求
              [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
                  // 列印請求結果
                  NSLog(@"data:%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    
                  // 判斷是否登入成功
                  if (data && !error) {
                      NSLog(@"網路請求成功!");
    
                      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    
                      if (dict[@"userID"]) {
                          [self saveLocalUserInfo];
                      }
                      //跳轉到app主介面,在主執行緒中傳送通知
                      dispatch_async(dispatch_get_main_queue(), ^{
                          [[NSNotificationCenter defaultCenter] postNotificationName:@"loginSuccess" object:nil];
                      });
                  } else {
                      NSLog(@"網路請求失敗!");
                  }
              }] resume];
          } else {
              NSLog(@"使用者名稱或密碼不能為空!");
          }
      }

    C. 實現頁面間跳轉

  • AppDelegate.m檔案中利用通知設定頁面的跳轉

    • 切換的主方法

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      
          // 1. 註冊登入成功的通知觀察者
          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess) name:@"loginSuccess" object:nil];
      
          // 2. 註冊登入成功的通知觀察者
          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutSuccess) name:@"logoutSuccess" object:nil];
      
          // 每次app開啟後,應該展示給使用者哪個介面
          // 3. 利用偏好設定中使用者儲存的資訊來判斷使用者的登入狀態
          NSString *userName = [[NSUserDefaults standardUserDefaults] objectForKey:kUserNameKey];
      
          NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:kPasswordKey];
      
          if (userName && password) {
              // 顯示app 主介面
              [self loginSuccess];
          } else {
      
              [self logoutSuccess];
          }
      
          return YES;
      }
    • 登入成功

      - (void)loginSuccess {
      
          NSLog(@"登入成功!");
      
          // 獲取主介面
          UIStoryboard *mainSb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
      
          // 切換控制器
          self.window.rootViewController = mainSb.instantiateInitialViewController;
      }
    • 登出成功

      - (void)logoutSuccess {
          NSLog(@"登出成功!");
      
          // 獲取登入介面
          UIStoryboard *loginSb = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
      
          // 切換控制器
          self.window.rootViewController = loginSb.instantiateInitialViewController;
      }
  • Main.storyboard關聯的控制器中設定登出按鈕的點選事件

      // 1. 清除本地資訊
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUserNameKey];
    
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:kPasswordKey];
    
      // 同步資訊
      [[NSUserDefaults standardUserDefaults] synchronize];
    
      // 2. 傳送資訊,切換控制器
      [[NSNotificationCenter defaultCenter] postNotificationName:@"logoutSuccess" object:nil];

三. Token值介紹

  • token 值: 登入令牌.利用 token 值來判斷使用者的登入狀態.類似於 MD5 加密之後的長字串.

  • 使用者登入成功之後,在後端(伺服器端)會根據使用者資訊生成一個唯一的值.這個值就是 token 值.

  • 基本使用:

    • 在伺服器端(資料庫)會儲存這個 token 值,以後利用這個 token 值來檢索對應的使用者資訊,並且判斷使用者的登入狀態.

    • 使用者登入成功之後,伺服器會將生成的 token 值返回給 客戶端,在客戶端也會儲存這個 token 值.(一般可以儲存在 cookie 中,也可以自己手動確定儲存位置(比如偏好設定.)).

    • 以後客戶端在傳送新的網路請求的時候,會預設自動附帶這個 token 值(作為一個引數傳遞給伺服器.).伺服器拿到客戶端傳遞的 token 值跟儲存在 資料庫中的 token 值做對比,以此來判斷使用者身份和登入狀態.

  • 判斷登入狀態:

    • 如果客戶端沒有這個 token 值,意味著沒有登入成功過,提示使用者登入.

    • 如果客戶端有 token 值,一般會認為登入成功.不需要使用者再次登入(輸入賬號和密碼資訊).

  • token 值擴充套件:

    • token 值有失效時間:

      • 一般的 app ,token值得失效時間都在 1 年以上.
      • 特殊的 app :銀行類 app /支付類 app :token值失效時間 15 分鐘左右.
    • 一旦使用者資訊改變(密碼改變),會在伺服器生成新的 token 值,原來的 token值就會失效.需要再次輸入賬號和密碼,以得到生成的新的 token 值.

    • 唯一性判斷: 每次登入,都會生成一個新的token值.原來的 token 值就會失效.利用時間來判斷登入的差異性.

四. MD5加密--(資訊-摘要演算法) 雜湊演算法之一

把一個任意長度的位元組串變換成一定長度的十六進位制的大整數.

注意,字串的轉換過程是不可逆的,不能通過加密結果,反向推匯出原始內容

基本介紹

  • 需要匯入第三方框架: NSString+Hash

  • MD5特點:

    • 壓縮性 : 任意長度的資料,算出的 MD5 值長度都是固定的.

    • 容易計算 : 從原資料計算出 MD5 值很容易.

    • 抗修改性 : 對原資料進行任何改動,哪怕只修改一個位元組,所得到的 MD5 值都有很大區別.

    • 弱抗碰撞 : 已知原資料和其 MD5 值,想找到一個具有相同 MD5 值的資料(即偽造資料)是非常困難的.

    • 5.強抗碰撞: 想找到兩個不同資料,使他們具有相同的 MD5 值,是非常困難的

  • MD5 應用:

    • 一致性驗證:MD5將整個檔案當做一個大文字資訊,通過不可逆的字串變換演算法,產生一個唯一的MD5資訊摘要.就像每個人都有自己獨一無二的指紋,MD5對任何檔案產生一個獨一無二的數字指紋.

      利用 MD5 來進行檔案校驗,被大量應用在軟體下載站,論壇資料庫,系統檔案安全等方面(是否認為新增木馬,篡改檔案內容等).百度‘MD5’第一個網站進去,利用資料庫偽解密,即反查詢

    • 數字簽名;

    • 安全訪問認證;

使用方法

  • 利用 MD5 對字串進行加密

      NSString *password = @"WangPengfei";
    
      password = [password md5String];
    
      NSLog(@"password1:%@", password);
  • 加鹽:可以保證 MD5加密之後更加安全

      NSString *salt = @"[email protected]#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";
    
      [password stringByAppendingString:salt];
    
      password = [password md5String];
    
      NSLog(@"password2:%@", password);

    每一個公司都有自己的“鹽值”,鹽值越複雜,越安全

五. 時間戳密碼

基本介紹

  • 動態密碼:相同的密碼明文+相同的加密演算法-->因為每次登陸時間都不同,所以每次計算出的結果也都不相同.可以充分保證密碼的安全性.

  • 伺服器會計算兩個時間值,當期時間和前一分鐘的時間(比如:第59S傳送的網路請求,一秒鐘後伺服器收到並作出響應,這時伺服器當前時間比客戶端傳送時間晚一分鐘,仍然能夠判斷準確的值)

使用步驟

  • 獲取MD5 首次加密的密碼

      // 1. 當前密碼
      NSString *password = @"zhang";
    
      // 2. hmacKey值,是對“WangPengfei” 進行 MD5加密之後的值(動態生成的)
      NSString *hmacKey = @"d3bba33b51acaa0a272de7a2f6dfa233";
  • 加密過程

      // 1. 第一次加密:第一次 HMAC 運算
      password = [password hmacMD5StringWithKey:hmacKey];
    
      // 2.1 獲得當前的時間
      NSDate *date = [NSDate date];
    
      // 2.2 獲得當前時間的字串
      // 例項化時間格式器
      NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
      // 設定時間格式
      formatter.dateFormat = @"yyyy-MM-dd HH:mm";
    
      // 獲取當前時間(要和伺服器保持一致)
      NSString *dateStr = [formatter stringFromDate:date];
    
      // 3. 將第一次加密後的密碼與當前時間的字串拼接在一起
      password = [password stringByAppendingString:dateStr];
    
      // 4. 進行第二次 HMAC 加密
      password = [password hmacMD5StringWithKey:hmacKey];
  • 訪問 loginhmac.php 介面,傳送請求

    • 建立請求

      NSURL *url = [NSURL URLWithString:@"http://localhost/login/loginhmac.php"];
      
      // POST 要手動設定方法,因此為可變
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
      
      // 設定請求方法
      request.HTTPMethod = @"POST";
      
      // 設定請求體內容
      NSString *body = [NSString stringWithFormat:@"username=zhangsan&password=%@", password];
      request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    • 傳送請求

      [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
      
          NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
      }] resume];

六. 鑰匙串訪問

基本介紹

  • 蘋果在 iOS 7.0.3版本以後公佈鑰匙串訪問的SDK.鑰匙串訪問介面是純C語言的.

  • 鑰匙串使用 AES 256加密演算法,能夠保證使用者密碼的安全.

  • 鑰匙串訪問的第三方框架SSKeychain,是對C語言框架的封裝.注意:不需要看原始碼.

  • 鑰匙串訪問的密碼儲存在哪裡?只有蘋果才知道.這樣進一步保障了使用者的密碼安全.

簡單使用

  • 引數介紹
    • Password :需要儲存的密碼資訊.
    • Service :用來標識 app ,app的唯一識別符號.
    • account :賬戶資訊,當前密碼所對應的賬號.
  • 利用鑰匙串進行加密

      // 獲取應用程式唯一標識.
      NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
    
      // 利用第三方框架,將使用者密碼儲存在鑰匙串
      [SSKeychain setPassword:self.pwdText.text forService:bundleId account:@"wpf"];
  • 從鑰匙串載入密碼

    self.pwdText.text = [SSKeychain passwordForService:bundleId account:@"wpf"];

七. 指紋識別

簡單介紹

  • 指紋識別功能是 iphone 5S之後推出的.SDK是 iOS 8.0 推出!

  • 推出指紋識別功能的目的,是為了簡化移動支付環節,佔領移動支付市場.

使用步驟

  • 匯入框架

      #import <LocalAuthentication/LocalAuthentication.h>
  • 獲得當前系統版本號

      float version = [UIDevice currentDevice].systemVersion.floatValue;
    
      if (version < 8.0 ) // 判斷當前系統版本 {
          NSLog(@"系統版本太低,請升級至最新系統");
          return;
      }
  • 例項化指紋識別物件,判斷當前裝置是否支援指紋識別功能(是否帶有TouchID)

      // 1> 例項化指紋識別物件
      LAContext *laCtx = [[LAContext alloc] init];
    
      // 2> 判斷當前裝置是否支援指紋識別功能.
      if (![laCtx canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:NULL]) {
    
          // 如果裝置不支援指紋識別功能
          NSLog(@"該裝置不支援指紋識別功能");
    
          return;
      };
  • 指紋登陸(預設是非同步方法)

      [laCtx evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"指紋登陸" reply:^(BOOL success, NSError *error) {
          // 如果成功,表示指紋輸入正確.
          if (success) {
              NSLog(@"指紋識別成功!");
    
          } else {
              NSLog(@"指紋識別錯誤,請再次嘗試");
          }
      }];

相關推薦

iOS開發常用加密方式介紹使用

普通加密方法是講密碼進行加密後儲存到使用者偏好設定中鑰匙串是以明文形式儲存,但是不知道存放的具體位置 一. base64加密 base64 編碼是現代密碼學的基礎基本原理: 原本是 8個bit 一組表示資料,改為 6個bit一組表示資料,不足的部分補零,每 兩個0 用 一個 = 表示用base64 編碼之後

iOS開發各種加密方式

這裡封裝的是iOS使用到的各種加密方法,MD5加密,AES加密,Base64加密,DES加密,生成32UUID,類需要繼承 <Foundation/Foundation.h>框架 注意:.m檔案需要匯入 #import <CommonCrypto/

iOS開發-常用第三方開源框架介紹(絕對夠你用了)

影象: 1.圖片瀏覽控制元件MWPhotoBrowser        實現了一個照片瀏覽器類似 iOS 自帶的相簿應用,可顯示來自手機的圖片或者是網路圖片,可自動從網路下載圖片並進行快取。可對圖片進行縮放等操作。       下載:https:

iOS開發RSA加密 解密

在iOS中使用RSA加密解密,需要用到.der和.p12字尾格式的檔案,其中.der格式的檔案存放的是公鑰(Public key)用於加密,.p12格式的檔案存放的是私鑰(Private key)用於解密. 首先需要先生成這些檔案,然後再將檔案匯入工程使用,不多說,開始做! 一、使用openssl生成所需祕鑰

ios開發常用的宏

sso dex osi comm ignore scac va_arg pragma weakself 轉自 http://www.cocoachina.com/bbs/read.php?tid=1719540 #define NavigationBa

iOS多線程---NSOperation介紹使用

star cati log 對象 sop exec 使用 sin 方式 1. NSOperation實現多線程編程,需要和NSOperationQueue一起使用。 (1)先將要執行的操作封裝到NSOperation中 (2)將NSOperation對象添加到NSOper

iOS開發----操作系統----進程線程的區別

實體 基本 寄存器和棧 多個 尺度 獨立 部分 應用程序 分配 進程和線程的主要差別在於它們是不同的操作系統資源管理方式。 進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。 線程有自己的堆棧和局部變量,但線程之間

iOS開發常用宏定義

face 4.0 zone 定義 sel color type main def p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0p

iOS開發-MD5加密、SHA1加密

digest ons size encoding gen nco inpu style data 1.MD5加密 ///MD5加密 + (NSString *)md5:(NSString *)inputString{ const char *cStr = [inpu

ios開發-常用三方工具

helper alertview ability ive ref auto progress afnetwork work #菜單 pod ‘LGSideMenuController‘ # 刷新 pod ‘MJRefresh‘ # 網

2018 6年iOS開發常用的三方庫

上拉 res ios 開發 keyboard fresh 鍵盤 font network 開發一般APP必備三方庫,省力秘籍!!!本篇文章會經常更新最新常用的三方。 1.網絡請求庫 AFNetworking https://github.com/AFNetworking/A

Android OpenSL ES 開發:Android OpenSL 介紹開發流程說明

ror logic ogr activity engine eid 優化 als 分享 一、Android OpenSL ES 介紹 OpenSL ES (Open Sound Library for Embedded Systems)是無授權費、跨平臺、針對嵌入式系統精心

Concurrent.util 常用類的介紹使用

Concurrent.util 常用類的介紹和使用 Concurrentutil 常用類的介紹和使用 CyclicBarrier CountDownLacth Callable 和 Future

iOS開發 常用的框架demo

  總結了一些常用的demo,包括獲取驗證碼、AVPlayer、AFNetworking、Masonry、高仿微信、高仿網易、K線圖、折線圖、柱狀圖、手勢解鎖、TouchID、直播、動畫等,大家可以根據需要自取,大部分都是來自GitHub。 1、獲取驗證碼 http://

java開發常用jar包介紹(轉載)

jta.jar 標準JTA API必要 commons-collections.jar 集合類 必要 antlr.jar ANother Tool for Language Recognition 必要 asm.jar ASM位元組碼庫 如果使用“cglib” 則必要 asm

iOS開發-聊天氣泡的繪製聊天訊息列表

iOS開發中什麼最重要?流媒體?即時通訊?還是其他什麼技術?其實都不是,最重要的東西誠然只是iOS的基礎,比如畫一個按鈕,封裝一個控制元件,擴充套件一個類等等。這些東西看似簡單,實則很難,所有的技術都基於這些最基礎的東西,今天要說的是聊天氣泡的繪製,和做一個簡單

iOS開發常用的第三方類庫

轉自:https://blog.csdn.net/pleasecallmewhy/article/details/17149623 在iOS開發中不可避免的會用到一些第三方類庫,它們提供了很多實用的功能,使我們的開發變得更有效率;同時,也可以從它們的原始碼中學習到很多有用的東西。 Reach

iOS開發 RSA加密解密與後臺之間的雙向加密詳解

序言 因為專案中需要用到RSA加密,剛開始也是有點亂,這兩天也整理的差不多了,希望能幫到大家。 這次先上程式碼,我想大部分人肯定是著急解決問題,所以不要廢話太多。 iOS端 後臺是PHP,給我了一段公鑰和他用私鑰加密後的base64編碼,讓我先解一下,看看能否解出(請先不要糾結為什麼給我公鑰解密,公鑰私鑰都

iOS開發(Swift)——SwiftOC的互用

新建Briding-header.h Briding-header.h是Swift和OC的橋接檔案,沒有是不行的 如何新建:一般情況,在Swift工程中新建一個OC類,或者在OC工程新建一個Swift類,系統就會提示你是否建立,選擇是就行了,然後再刪除你剛

ios開發常用第三方庫收集以及整理

1、RESideMenu 實現側邊欄選單 2、AFNetworking 實現網路通訊的第三方庫 3、一個有用的服務網站,提供各種JSON資料,包括天氣、電話號碼、身份證查詢等。。 4、Masony一個用來對VIEW進行佈局的三方庫 5、MBProgressHUD一個