HTTP請求和數據安全

来源:http://www.cnblogs.com/zouhengwei/archive/2016/03/13/5273230.html
-Advertisement-
Play Games

/* 01 HTTP請求 */ 重點:1.超文本傳輸協議. 2.http請求過程. {     1> http協議: 超文本傳輸協議(Hypertext Transfer Protocol)     {         http協議規定了客戶端和伺服器之間的數據傳輸格式.           


/*------------------------------------- 01 HTTP請求 ---------------------------------------*/

重點:1.超文本傳輸協議. 2.http請求過程.

{

    1> http協議: 超文本傳輸協議(Hypertext Transfer Protocol)

    {

        http協議規定了客戶端和伺服器之間的數據傳輸格式.

        

        http協議是在網路開發中最常用的協議.不管是移動客戶端還是PC,訪問網路資源經常使用http協議.

        

        http優點:

        

        <1> 簡單快速:

            http協議簡單,通信速度很快.

        

        <2> 靈活:

            http協議允許傳輸任意類型的數據.

        

        <3> http協議是短連接(非持續性連接) (TCP/IP  UDP/IP)

            http協議限制每次連接只處理一個請求,伺服器對客戶端的請求作出響應後,馬上斷開連接.這種方式可以節省傳輸時間.

    }

    

    2> http協議的使用;

    

    完整的http通信分為兩步:

    

    <1> 請求:客戶端向伺服器索要數據.

    {

        http協議規定:一個完整的http請求包含'請求行','請求頭','請求體'三個部分;

        

        '請求行':包含了請求方法,請求資源路徑,http協議版本.

        

        "GET /resources/images/ HTTP/1.1"

        

        '請求頭':包含了對客戶端的環境描述,客戶端請求的主機地址等信息.

        

        Accept: text/html // 客戶端所能接收的數據類型

        Accept-Language: zh-cn // 客戶端的語言環境

        Accept-Encoding: gzip // 客戶端支持的數據壓縮格式

        Host: m.baidu.com // 客戶端想訪問的伺服器主機地址

        User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0 // 客戶端的類型,客戶端的軟體環境

       

        '請求體':客戶端發給伺服器的具體數據,比如文件/圖片等.

    }

    

    <2> 響應:伺服器返回客戶端想要的數據.

    {

        http協議規定:一個完整的http響應包含'狀態行','響應頭','實體內容'三個部分;

        

        '狀態行':包含了http協議版本,狀態嗎,狀態英文名稱.

        

        "HTTP/1.1 200 OK"

        

        '響應頭':包含了對伺服器的描述,對返回數據的描述.

    

        Content-Encoding: gzip // 伺服器支持的數據壓縮格式

        Content-Length:  1528 // 返回數據的長度

        Content-Type:  application/xhtml+xml;charset=utf-8 // 返回數據的類型

        Date: Mon, 15 Jun 2015 09:06:46 GMT // 響應的時間

        Server: apache  // 伺服器類型

        

        '實體內容':伺服器返回給客戶端的具體數據(圖片/html/文件...).

    }

    

    3> 發送http請求:

    {

        iOS開發中,發送http請求的方案有很多,常見的有如下幾種:

        <1> 蘋果原生:

        {

            * NSURLConnection:用法簡單,古老經典的一種方案.

        

            * NSURLSession:iOS7以後推出的技術,功能比NSURLConnection更加強大.

        

            * CFNetWork:NSURL 的底層,C語言,一般不用.

        }

        

        <2> 第三方框架:

        {

            * ASIHttpRequest:http終結者,功能很強大,可惜作者已停止更新.

            

            * AFNetWorking:簡單易用,提供了基本夠用的常用功能,維護和使用者多.

            

            * MKNetWorkKit:簡單易用,產自印度,維護和使用者少.

        }

        

        在開發中,一般使用第三方框架.

    }

}

/*------------------------------------- 02 GET POST ------------------------------------*/

重點:1.GET POST的區別? 2.POST方法發送登陸請求.

{

    <1> http方法:

    http協議定義了很多方法對應不同的資源操作,其中最常用的是GET POST 方法.

    {

        { GETPOSTOPTIONSHEADPUTDELETETRACECONNECTPATCH }

        

        :PUT

        :DELETE

        :POST

        :GET

    }

    

    <2> 參數

    {

        因為 GET POST 可以實現上述所有操作,所以,在現實開發中,我們只要會用GET POST 方法就可以了.

        

        在與伺服器交互時,有時候需要給伺服器發送一些數據,比如登錄時需要發送用戶名和密碼.

        

        參數:就是指傳遞給伺服器的具體數據.

    }

 

    <3> GET POST 的主要區別表現在參數的傳遞上.

    

    "GET":

    {

        GET的本質是從伺服器得到數據,效率更高.並且GET請求可以被緩存.

        

        '註意': 網路緩存數據,保存在SQLite的資料庫中(路徑:NSHomeDirectory()).

        查看緩存數據命令行:

        'cd 文件目錄'   (打開文件目錄)

        'ls'   查看當前文件下目錄

        'sqlite3 Cache.db'   打開資料庫

        '.tables'    查看資料庫中的表單

        'select * from cfurl_cache_response;'   查看伺服器響應緩存

        'select * from cfurl_cache_receiver_data;'   查看伺服器返回的數據緩存

    

        在請求 URL 後面以 ? 的形式跟上發給伺服器的參數,參數以 "參數名"="參數值"的形式拼接,多個參數之間用 & 分隔.

    

        註意:GET的長度是有限制的,不同的瀏覽器有不同的長度限制,一般在2~8K之間.

    }

    

    "POST":

    {

        POST的本質是向伺服器發送數據,也可以獲得伺服器處理之後的結果,效率不如GET.POST請求不可以被緩存,每次刷新之後都需要重新提交表單.

    

        發送給伺服器的參數全部放在'請求體';

    

        理論上,POST傳遞的數據量沒有限制.

    

        註意:所有涉及到用戶隱私的數據(密碼/銀行卡號等...)都要用POST的方式傳遞.

    }

    

    <4>註意:URL中不能出現空格以及中文等特殊符號.

    

    1>URL,所有的字元都必須是 ASCII ;

    

    2>URL中不能出現中文和特殊符號(如空格);

    

    所以,如果 URL 中出現了中文,需要添加百分號轉譯.

    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    

    <5> POST 發送登陸請求:

    

    註意:

    

    1> 用可變請求: NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    

    2> 指定請求方法: request.HTTPMethod = @"POST";

    

    3> 設置請求體數據: request.HTTPBody = data;

    

    // 實例化請求體字元串

    NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.userName.text,self.password.text];

    // 將字元串轉換成二進位數據

    NSData *data = [body dataUsingEncoding:NSUTF8StringEncoding];

    

    4> 發送非同步網路請求.

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        

        // NSURLResponse *response: 伺服器響應

        

        // NSData *data: 伺服器返回的數據

        

        // NSError *connectionError: 連接錯誤處理

        

        // 網路請求的回調.

    }]

}

/*------------------------------------- 03 保存用戶信息 -------------------------------------*/

重點:1.偏好設置保存用戶信息.

{

    <1>如果用戶登陸成功,就保存用戶信息.下次直接從偏好設置中讀取用戶信息,以此做到用戶只需要輸入一次賬號和密碼,以後登陸就可以不用再次輸入.

    

    1>.登陸成功,保存用戶信息(偏好設置)

    2>.再次進入,直接顯示用戶之前保存的信息.避免用戶重覆輸入.

    

    // 偏好設置存儲用戶信息

    -(void)savaUserInfo

    {

        // 實例化偏好設置對象(單例)

        NSUserDefaults *User = [NSUserDefaults standardUserDefaults];

        // 保存用戶名

        [User setObject:self.userName.text forKey:kITUSERNAMEKEY];

        // 保存用戶密碼

        [User setObject:pass forKey:kITUSERPASSKEY];

        // 同步保存用戶信息

        [User synchronize];

    }

    

    // 載入偏好設置中的用戶信息

    - (void)loadUserInfo

    {

        NSUserDefaults *User = [NSUserDefaults standardUserDefaults];

        

        if ([User objectForKey:ITUSERNAMEKEY]) {

            

            self.userName.text = [User objectForKey:ITUSERNAMEKEY];

            

        }if ([User objectForKey:ITUSERPASSKEY]) {

            

            self.password.text = [User objectForKey:ITUSERPASSKEY];

            

        };

    }

    

    <2> 用戶登陸業務邏輯

    {

        // <1> 用戶登陸需要一個單獨的控制器,因為只需要登陸一次(Login.storyboard). 應用程式需要有一個入口:main.storyboard: app 主頁面

        

        // <2> 判斷用戶是否登陸成功過(通過偏好設置中存儲的用戶信息判斷)

        // 1> 如果偏好設置中存有用戶信息(說明之前登陸成功過),直接進入 app 主頁面 :main.storyboard

        // 2> 如果偏好設置中不存在用戶信息(第一次登陸或者之前註銷了用戶信息),進入登陸界面 :Login.storyboard

        

        // <3> 如果用戶登陸成功,跳轉到 app 主頁面:main.storyboard.並且在偏好設置中保存用戶信息.

        

        // <4> 如果用戶點擊註銷按鈕,註銷用戶信息,返回到登陸頁面.

    }

    

 

    <3> 問題: 用戶密碼不能以明文的形式保存,需要對用戶密碼加密之後再保存!

    

    密碼的安全原則:

    

    1> 本地和伺服器都不允許保存用戶的密碼明文.

    

    2> 在網路上,不允許傳輸用戶的密碼明文.

    

    現代密碼學趣聞! 中途島海戰(AF)

    

    <4> 數據加密演算法:

    

    1> 對稱加密演算法:加密和解密使用同一密鑰.加密解密速度快,要保證密鑰安全.適合給大數據加密.

    

    2> 非對稱加密演算法:使用公鑰加密,私鑰解密.或者使用私鑰加密,公鑰解密.更加安全,但是加密解密速度慢,適合給小數據加密.

    

    <5> 小技巧:

    

    openssl :是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法,常用的密鑰和證書封裝管理功能以及 SSL 協議.提供豐富的應用程式測試功能.

    

    終端命令:

    

        echo hello |openssl md5

        echo hello |openssl sha1

        echo hello |openssl sha -sha256

        echo hello |openssl sha -sha512

}

 

 

/*------------------------------------- 04 信息安全加密 -------------------------------------*/

常用加密方法: 1> base64  2> MD5  3> MD5加鹽  4> HMAC  5> 時間戳密碼(用戶密碼動態變化)

{

    1> base64

    {

        base64 編碼是現代密碼學的基礎.

        

        原本是 8bit 一組表示數據,改為 6bit一組表示數據,不足的部分補零, 兩個0 一個 = 表示.

        base64 編碼之後,數據長度會變大,增加了大約 1/3 左右.

        

        base64 基本能夠達到安全要求,但是,base64能夠逆運算,非常不安全!

        base64 編碼有個非常顯著的特點,末尾有個 '=' .

        

        利用終端命令進行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=

            echo "hello" | base64

        

            // base64編碼之後的結果 aGVsbG8= 反編碼為字元串

            echo aGVsbG8= | base64 -D

    }

    

    2> MD5 -- (信息-摘要演算法) 哈希演算法之一.

    {

    

        把一個任意長度的位元組串變換成一定長度的十六進位的大整數. 註意,字元串的轉換過程是不可逆的.

    

        用於確保'信息傳輸'完整一致.

    

        MD5特點:

        

        *1.壓縮性:   任意長度的數據,算出的 MD5 值長度都是固定的.

        *2.容易計算: 從原數據計算出 MD5 值很容易.

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

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

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

        

        MD5 應用:

        

        *1. 一致性驗證: MD5 將整個文件當做一個大文本信息,通過不可逆的字元串變換演算法,產生一個唯一的 MD5 信息摘要.就像每個人都有自己獨一無二的指紋,MD5 對任何文件產生一個獨一無二的"數字指紋".

        

            利用 MD5 來進行文件校驗, 被大量應用在軟體下載站,論壇資料庫,系統文件安全等方面.

        

        *2. 數字簽名;

        

        *3. 安全訪問認證;

    

    }

    

    3> MD5加鹽

    {

        MD5 本身是不可逆運算,但是,目前網路上有很多資料庫支持反查詢.

        

        MD5加鹽 就是在密碼哈希過程中添加的額外的隨機值.

        

        註意:加鹽要足夠長,足夠複雜.

    }

    

    4> HMAC

    {

        HMAC 利用哈希演算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出.

        

        HMAC 主要使用在身份認證中;

        

        認證流程:

        

            *1. 客戶端向伺服器發送一個請求.

            *2. 伺服器接收到請求後,生成一個'隨機數'並通過網路傳輸給客戶端.

            *3. 客戶端將接收到的'隨機數''密鑰'進行 HMAC-MD5 運算,將得到的結構作為認證數據傳遞給伺服器.

            (實際是將隨機數提供給 ePass,密鑰也是存儲在 ePass中的)

            *4. 與此同時,伺服器也使用該'隨機數'與存儲在伺服器資料庫中的該客戶'密鑰'進行 HMAC-MD5 運算,如果

            伺服器的運算結果與客戶端傳回的認證數據相同,則認為客戶端是一個合法用法.

        

    }

    

    5> 時間戳密碼(用戶密碼動態變化)

    {

        相同的密碼明文 + 相同的加密演算法 === 每次計算都得出不同的結果.可以充分保證密碼的安全性.

        

        原理:將當前時間加入到密碼中;

        

        因為每次登陸時間都不同,所以每次計算出的結果也都不相同.

        

        伺服器也需要採用相同的演算法.這就需要伺服器和客戶端時間一致.

        

        註意:伺服器端時間和客戶端時間,可以有一分鐘的誤差(比如:59S發送的網路請求,一秒鐘後伺服器收到並作出響應,這時伺服器當前時間比客戶端發送時間晚一分鐘).

        

        這就意味著,伺服器需要計算兩次(當前時間和一分鐘之前兩個時間點各計算一次).只要有一個結果是正確的,就可以驗證成功!

        

    }

    

    // IP輔助/手機綁定...

 

}

/*-------------------------------------- 05 鑰匙串訪問 -------------------------------------*/

重點: 1.鑰匙串訪問

{

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

    

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

    

    鑰匙串訪問的第三方框架(SSKeychain),是對 C語言框架 的封裝.註意:不需要看源碼.

    

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

    

    使用步驟:

    {

        // 獲取應用程式唯一標識.

        

        NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;

        

        // 1.利用第三方框架,將用戶密碼保存在鑰匙串

        

        [SSKeychain setPassword:self.pwdText.text forService:bundleId account:self.usernameText.text];

        

        "註意"三個參數:

        

        1.密碼:可以直接使用明文.鑰匙串訪問本身是使用 AES 256加密,就是安全的.所以使用的時候,直接傳遞密碼明文就可以了.

        

        2.服務名:可以隨便亂寫,建議唯一! 建議使用 bundleId.

        

        bundleId是應用程式的唯一標識,每一個上架的應用程式都有一個唯一的 bundleId

        

        3.賬戶名:直接用用戶名稱就可以.

        

        // 2.從鑰匙串載入密碼

        

        self.pwdText.text = [SSKeychain passwordForService:bundleId account:self.usernameText.text];

    }

}

/*-------------------------------------- 06 指紋識別 ---------------------------------------*/

重點: 1.指紋識別用法

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  •   第一節 搭建開發環境 第二節 顯示頁面標題 第三節 實現頁面佈局      React Native,是顛覆性的移動開發技術。它使用js開發,又是原生應用,不同於Hybrid. 簡單的理解:它提供一個原生項目,然後規定js與原生項目的介面,編譯原生項目,打包程式員編寫的js, 共同形成一個完整的
  • 單擊,顯示警告框。onclick特性的值不能使用未經轉移的HTML語法字元:&,",<,>。若想使用雙引號: 通過event變數,可以直接訪問事件對象,且,在函數內部,this值等於事件的目標元素,例: 還可以使用擴展作用域,在函數內部可以像訪問局部對象一樣訪問document及該元素本身,so可以
  • 第一次玩codewars,選了個最簡單的題目 要求是: You have to write a function that describe Leo: if oscar was (integer) 88, you have to return "Leo finally won the oscar!
  • 在西方國家羅馬字母陣營中,字體分為兩大種類:Sans Serif和Serif,打字機體雖然也屬於Sans Serif,但由於是等寬字體,所以另外獨立出Monospace這一種類,例如在Web中,表示代碼時常常要使用等寬字體。  Serif的意思是,在字的筆劃開始及結束的地方有額外的裝飾,而且筆劃的粗
  • 由於在工作中需要使用AJAX請求其他功能變數名稱下的請求,但是會出現拒絕訪問的情況,這是因為基於安全的考慮,AJAX只能訪問本地的資源,而不能跨域訪問。 比如說你的網站功能變數名稱是aaa.com,想要通過AJAX請求bbb.com功能變數名稱中的內容,瀏覽器就會認為是不安全的,所以拒絕訪問。 會出現跨域問題的幾種情況:
  • 我不喜歡一開始就去討論某某有多強大,因為我覺得那樣沒意思,首先我們的知道它是乾什麼,對我們有啥用,再去討論它的強大之處也不遲。那和往常一樣我們先來看幾個例子。 又比如我們想提取var str = 'eignwererherhtml5ewrqrpasfnh' ;這段文本裡面的html5,又應該怎麼做,
  • [1]line-height [2]vertical-align [3]應用
  • <!DOCTYPE> 聲明不是 HTML 標簽;它是指示 web 瀏覽器關於頁面使用哪個 HTML 版本進行編寫的指令。 在 HTML 4.01 中,<!DOCTYPE> 聲明引用 DTD,因為 HTML 4.01 基於 SGML。DTD 規定了標記語言的規則,這樣瀏覽器才能正確地呈現內容。 HTM
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...