腳本,程序--->自動抓取
萬維網上信息的程序
。javascript
2.一、通用爬蟲html
通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將互聯網上的網頁下載到本地,造成一個互聯網內容的鏡像備份。前端
2.一、聚焦爬蟲java
是面向特定主題需求
的一種網絡爬蟲程序,它與通用搜索引擎爬蟲的區別在於: *聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘可能保證只抓取與需求相關的網頁信息。*python
搜索引擎的根基。作搜索引擎,必須使用爬蟲。web
能夠製做比較軟件。ajax
在解決web項目問題時,流程以下:正則表達式
前端---> javascript---> python---> sql查詢--->數據庫redis
瞭解什麼是Hash,會簡單地使用MD5,SHA1等算法對數據進行Hash一遍存儲算法
熟悉HTTP,HTTPS協議的基礎知識,瞭解GET,POST方法,瞭解HTTP頭中的信息,包括返回狀態碼,編碼,user-agent,cookie,session等
能設置user-agent進行數據爬取,設置代理等
知道什麼事Request,什麼事response,會使用Fiddler等工具抓取及分析簡單地網絡數據包;對於動態爬蟲,要學會分析ajax請求,模擬製造post數據包請求,抓取客戶端session等信息,對於一些簡單的網站,可以經過模擬數據包進行自動登陸。
對於一些難搞定的網站學會使用phantomjs+selenium抓取一些動態網頁信息
併發下載,經過並行下載加速數據爬取;多線程的使用。
多線程就是利用計算機的cpu,使cpu的利用變高,使程序運行速度加快。
搜索引擎就是運行一些策略和算法,從互聯網上獲取網頁信息,並將這些信息作一些處理以後保存起來,再爲用戶提供檢索服務的一種程序或系統。
主要組成就是通用爬蟲。
(1)、通用爬蟲的定義
就是將互聯網上的網頁【總體】爬取下來,保存到本地的程序。
(2)、搜索引擎能夠獲取全部網頁的緣由
搜索引擎經過不一樣url將全部網頁都保存到了本地。
(3)、搜索引擎網絡爬蟲的基本工做流程以下:
首先選取一部分的種子URL,將這些URL放入待抓取URL隊列;
取出待抓取URL,解析DNS獲得主機的IP,並將URL對應的網頁下載下來,存儲進已下載網頁庫中,而且將這些URL放進已抓取URL隊列。
分析已抓取URL隊列中的URL,分析其中的其餘URL,而且將URL放入待抓取URL隊列,從而進入下一個循環....
(4)、探索引擎搜索url來源:
新網站會主動向搜索引擎提交本身的網址。
搜索引擎和dns解析商合做,若是有新網站註冊,搜索引擎就能夠獲取網址。
可是搜索引擎蜘蛛的爬行是被輸入了必定的規則的,它須要聽從一些命令或文件的內容,如標註爲nofollow
的連接,或者是Robots
協議。
Robots協議(也叫爬蟲協議、機器人協議等),全稱是「網絡爬蟲排除標準」(Robots Exclusion Protocol),網站經過Robots協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取,例如:
(1)只能爬取原網頁,可是通常網頁中90%的內容都是無用的。
(2)不能知足不一樣行業、不一樣人員的不一樣需求。
(3)只能獲取文字,不能獲取視頻,音頻,文件等內容。
(4)只能經過關鍵字查詢,沒法支持語義查詢。
在實施網頁抓取時,會對內容進行篩選,儘可能保證之抓取與需求相關的數據。
HTTP協議
(HyperText Transfer Protocol,超文本傳輸協議):是一種發佈和接收 HTML頁面的方法。
HTTPS
(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層。
SSL
(Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡鏈接進行加密,保障在Internet上數據傳輸的安全。
HTTP
的端口號爲80
HTTPS
的端口號爲443
http的工做過程:
(1)地址解析:客戶端解析出url的每個部分
(2)分裝http請求數據包
(3)封裝tcp數據包,經過三次握手創建tcp鏈接。
(4)客戶端發送請求
(5)服務器發送響應。
(6)關閉tcp鏈接
http協議的特色:
基於應用層的協議。
無鏈接
在http1.0以前每次發送http都是單獨鏈接,自從http1.1以後,只需設置一個請求頭Connection,就能夠作到一個長鏈接。
無狀態。
http協議不記錄狀態,每次請求,若是想要到以前請求的內容,必須單獨發送。爲了解決這種問題,產生一種技術,就叫cookie和session。
HTTP通訊由兩部分組成: 客戶端請求消息 與 服務器響應消息
瀏覽器發送HTTP請求的過程:
Get
和Post
兩種方式。URL(Uniform / Universal Resource Locator的縮寫):統一資源定位符,是用於完整地描述Internet上網頁和其餘資源的地址的一種標識方法。
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
python的urllib下的parse模塊能夠幫助咱們解析一個url
from urllib import parse url = 'https://localhost:9999/bin/index.html?usename=zhangsanY&password=123#bottom' parse_result = parse.urlparse(url) print(parse_result) print(parse_result.netloc) print(parse_result.path) 運行結果: ParseResult( scheme='https', netloc='localhost:9999', path='/bin/index.html', params='', query='usename=zhangsanY&password=123', fragment='bottom') localhost:9999 /bin/index.html
URL只是標識資源的位置,而HTTP是用來提交和獲取資源。客戶端發送一個HTTP請求到服務器的請求消息,包括如下格式:
請求行
、請求頭部
、空行
、請求數據
四個部分組成,下圖給出了請求報文的通常格式。
一個典型的HTTP請求示例
GET https://www.baidu.com/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://www.baidu.com/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0
HTTP請求主要分爲Get
和Post
兩種方法
http://www.baidu.com/s?wd=Chinese
注意:避免使用Get方式提交表單,由於有可能會致使安全問題。 好比說在登錄表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。
一、Host (主機和端口號)
Host:對應網址URL中的Web名稱和端口號,用於指定被請求資源的Internet主機和端口號,一般屬於URL的一部分。
二、Connection (連接類型)
Connection:表示客戶端與服務鏈接類型
Connection:keep-alive
的請求,HTTP/1.1使用 keep-alive
爲默認值。Connection:keep-alive
的響應,向同一個鏈接發送下一個請求,直到一方主動關閉鏈接。keep-alive在不少狀況下可以重用鏈接,減小資源消耗,縮短響應時間,好比當瀏覽器須要多個文件時(好比一個HTML文件和相關的圖形文件),不須要每次都去請求創建鏈接。
三、Upgrade-Insecure-Requests (升級爲HTTPS請求)
Upgrade-Insecure-Requests:升級不安全的請求,意思是會在加載 http 資源時自動替換成 https 請求,讓瀏覽器再也不顯示https頁面中的http請求警報。
*HTTPS 是以安全爲目標的 HTTP 通道,因此在 HTTPS 承載的頁面上不容許出現 HTTP 請求,一旦出現就是提示或報錯。*
四、User-Agent (客戶端標識)
User-Agent:是客戶瀏覽器的名稱
五、Accept (傳輸文件類型)
Accept:指瀏覽器或其餘客戶端能夠接受的MIME(Multipurpose Internet Mail Extensions(多用途互聯網郵件擴展))文件類型,服務器能夠根據它判斷並返回適當的文件格式。
舉例:
Accept: */*
:表示什麼均可以接收。
Accept:image/gif
:代表客戶端但願接受GIF圖像格式的資源;
Accept:text/html
:代表客戶端但願接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8
:表示瀏覽器支持的 MIME 類型分別是 html文本、xhtml和xml文檔、全部的圖像格式資源。
*q是權重係數,範圍 0 =< q <= 1,q 值越大,請求越傾向於得到其「;」以前的類型表示的內容。若沒有指定q值,則默認爲1,按從左到右排序順序;若被賦值爲0,則用於表示瀏覽器不接受此內容類型。*
***Text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;Application:用於傳輸應用程序數據或者二進制數據。html文件類型
六、Referer (頁面跳轉處)
Referer:代表產生請求的網頁來自於哪一個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。這個屬性能夠用來跟蹤Web請求來自哪一個頁面,是從什麼網站來的等。
有時候遇到下載某網站圖片,須要對應的referer,不然沒法下載圖片,那是由於人家作了防盜鏈,原理就是根據referer去判斷是不是本網站的地址,若是不是,則拒絕,若是是,就能夠下載;
7. Accept-Encoding(文件編解碼格式)
Accept-Encoding:指出瀏覽器能夠接受的編碼方式。編碼方式不一樣於文件格式,它是爲了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應以後先解碼,而後再檢查文件格式,許多情形下這能夠減小大量的下載時間。
**舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0**
若是有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回通過gzip編碼的HTML頁面。 若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。
8. Accept-Language(語言種類)
Accept-Langeuage:指出瀏覽器能夠接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器可以提供一種以上的語言版本時要用到。
9. Accept-Charset(字符編碼)
Accept-Charset:指出瀏覽器能夠接受的字符編碼。
舉例:Accept-Charset:iso-8859-1,gb2312,utf-8
若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。
10. Cookie (Cookie)
Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它能夠記載和服務器相關的用戶信息,也能夠用來實現會話功能,之後會詳細講。
11. Content-Type (POST數據類型)
Content-Type:POST請求裏用來表示的內容類型。
舉例:Content-Type = Text/XML; charset=gb2312:
指明該請求的消息體中包含的是純文本的XML類型的數據,字符編碼採用「gb2312」。
12. content-length (POST數據長度)
post請求的請求數據的長度
13. x-requested-with:xmlhttprequest--xhr
當咱們發送一個ajax接口數據,想要獲取數據內容,必須封裝這個頭,這個頭就表示這個請求是一個ajax。
HTTP響應也由四個部分組成,分別是: 狀態行
、消息報頭
、空行
、響應正文
HTTP/1.1 200 OK Server: Tengine Connection: keep-alive Date: Wed, 30 Nov 2016 07:58:21 GMT Cache-Control: no-cache Content-Type: text/html;charset=UTF-8 Keep-Alive: timeout=20 Vary: Accept-Encoding Pragma: no-cache X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395 Content-Length: 180945 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....
一、Cache-Control:must-revalidate, no-cache, private。
這個值告訴客戶端,服務端不但願客戶端緩存資源,在下次請求資源時,必需要重新請求服務器,不能從緩存副本中獲取資源。
二、 Connection:keep-alive
這個字段做爲迴應客戶端的Connection:keep-alive,告訴客戶端服務器的tcp鏈接也是一個長鏈接,客戶端能夠繼續使用這個tcp鏈接發送http請求。
三、Content-Encoding:gzip
告訴客戶端,服務端發送的資源是採用gzip編碼的,客戶端看到這個信息後,應該採用gzip對資源進行解碼。
4.、Content-Type:text/html;charset=UTF-8
告訴客戶端,資源文件的類型,還有字符編碼,客戶端經過utf-8對資源進行解碼,而後對資源進行html解析。一般咱們會看到有些網站是亂碼的,每每就是服務器端沒有返回正確的編碼。
五、 Date:Sun, 21 Sep 2016 06:18:21 GMT
這個是服務端發送資源時的服務器時間,GMT是格林尼治所在地的標準時間。http協議中發送的時間都是GMT的,這主要是解決在互聯網上,不一樣時區在相互請求資源的時候,時間混亂問題。
六、 Expires:Sun, 1 Jan 2000 01:00:00 GMT
這個響應頭也是跟緩存有關的,告訴客戶端在這個時間前,能夠直接訪問緩存副本,很顯然這個值會存在問題,由於客戶端和服務器的時間不必定會都是相同的,若是時間不一樣就會致使問題。因此這個響應頭是沒有Cache-Control:max-age=*這個響應頭準確的,由於max-age=date中的date是個相對時間,不只更好理解,也更準確。
七、 Pragma:no-cache
這個含義與Cache-Control等同。
八、Server:Tengine/1.4.6
這個是服務器和相對應的版本,只是告訴客戶端服務器的信息。
九、Transfer-Encoding:chunked
這個響應頭告訴客戶端,服務器發送的資源的方式是分塊發送的。通常分塊發送的資源都是服務器動態生成的,在發送時還不知道發送資源的大小,因此採用分塊發送,每一塊都是獨立的,獨立的塊都能標示本身的長度,最後一塊是0長度的,當客戶端讀到這個0長度的塊時,就能夠肯定資源已經傳輸完了。
十、Vary: Accept-Encoding
告訴緩存服務器,緩存壓縮文件和非壓縮文件兩個版本,如今這個字段用處並不大,由於如今的瀏覽器都是支持壓縮的。
Cookie 和 Session:
服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求時,服務器會認爲新的客戶端。
爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。
Cookie:經過在 客戶端 記錄的信息肯定用戶的身份。
Session:經過在 服務器端 記錄的信息肯定用戶的身份。
響應狀態代碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。
常見狀態碼:
100~199
:表示服務器成功接收部分請求,要求客戶端繼續提交其他請求才能完成整個處理過程。200~299
:表示服務器成功接收請求並已完成整個處理過程。經常使用200(OK 請求成功)。300~399
:爲完成請求,客戶需進一步細化請求。例如:請求的資源已經移動一個新地址、經常使用302(所請求的頁面已經臨時轉移至新的url)、307和304(使用緩存資源)。400~499
:客戶端的請求有錯誤,經常使用404(服務器沒法找到被請求的頁面)、403(服務器拒絕訪問,權限不夠)。500~599
:服務器端出現錯誤,經常使用500(請求未完成。服務器遇到不可預知的狀況)。http://www.javashuo.com/article/p-zikdnfpi-ct.html
HTTP響應狀態碼參考:
1xx:信息 100 Continue 服務器僅接收到部分請求,可是一旦服務器並無拒絕該請求,客戶端應該繼續發送其他的請求。 101 Switching Protocols 服務器轉換協議:服務器將聽從客戶的請求轉換到另一種協議。 2xx:成功 200 OK 請求成功(其後是對GET和POST請求的應答文檔) 201 Created 請求被建立完成,同時新的資源被建立。 202 Accepted 供處理的請求已被接受,可是處理未完成。 203 Non-authoritative Information 文檔已經正常地返回,但一些應答頭可能不正確,由於使用的是文檔的拷貝。 204 No Content 沒有新文檔。瀏覽器應該繼續顯示原來的文檔。若是用戶按期地刷新頁面,而Servlet能夠肯定用戶文檔足夠新,這個狀態代碼是頗有用的。 205 Reset Content 沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。 206 Partial Content 客戶發送了一個帶有Range頭的GET請求,服務器完成了它。 3xx:重定向 300 Multiple Choices 多重選擇。連接列表。用戶能夠選擇某連接到達目的地。最多容許五個地址。 301 Moved Permanently 所請求的頁面已經轉移至新的url。 302 Moved Temporarily 所請求的頁面已經臨時轉移至新的url。 303 See Other 所請求的頁面可在別的url下被找到。 304 Not Modified 未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。 305 Use Proxy 客戶請求的文檔應該經過Location頭所指明的代理服務器提取。 306 Unused 此代碼被用於前一版本。目前已再也不使用,可是代碼依然被保留。 307 Temporary Redirect 被請求的頁面已經臨時移至新的url。 4xx:客戶端錯誤 400 Bad Request 服務器未能理解請求。 401 Unauthorized 被請求的頁面須要用戶名和密碼。 401.1 登陸失敗。 401.2 服務器配置致使登陸失敗。 401.3 因爲 ACL 對資源的限制而未得到受權。 401.4 篩選器受權失敗。 401.5 ISAPI/CGI 應用程序受權失敗。 401.7 訪問被 Web 服務器上的 URL 受權策略拒絕。這個錯誤代碼爲 IIS 6.0 所專用。 402 Payment Required 此代碼尚沒法使用。 403 Forbidden 對被請求頁面的訪問被禁止。 403.1 執行訪問被禁止。 403.2 讀訪問被禁止。 403.3 寫訪問被禁止。 403.4 要求 SSL。 403.5 要求 SSL 128。 403.6 IP 地址被拒絕。 403.7 要求客戶端證書。 403.8 站點訪問被拒絕。 403.9 用戶數過多。 403.10 配置無效。 403.11 密碼更改。 403.12 拒絕訪問映射表。 403.13 客戶端證書被吊銷。 403.14 拒絕目錄列表。 403.15 超出客戶端訪問許可。 403.16 客戶端證書不受信任或無效。 403.17 客戶端證書已過時或還沒有生效。 403.18 在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼爲 IIS 6.0 所專用。 403.19 不能爲這個應用程序池中的客戶端執行 CGI。這個錯誤代碼爲 IIS 6.0 所專用。 403.20 Passport 登陸失敗。這個錯誤代碼爲 IIS 6.0 所專用。 404 Not Found 服務器沒法找到被請求的頁面。 404.0 沒有找到文件或目錄。 404.1 沒法在所請求的端口上訪問 Web 站點。 404.2 Web 服務擴展鎖定策略阻止本請求。 404.3 MIME 映射策略阻止本請求。 405 Method Not Allowed 請求中指定的方法不被容許。 406 Not Acceptable 服務器生成的響應沒法被客戶端所接受。 407 Proxy Authentication Required 用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。 408 Request Timeout 請求超出了服務器的等待時間。 409 Conflict 因爲衝突,請求沒法被完成。 410 Gone 被請求的頁面不可用。 411 Length Required "Content-Length" 未被定義。若是無此內容,服務器不會接受請求。 412 Precondition Failed 請求中的前提條件被服務器評估爲失敗。 413 Request Entity Too Large 因爲所請求的實體的太大,服務器不會接受請求。 414 Request-url Too Long 因爲url太長,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種狀況。 415 Unsupported Media Type 因爲媒介類型不被支持,服務器不會接受請求。 416 Requested Range Not Satisfiable 服務器不能知足客戶在請求中指定的Range頭。 417 Expectation Failed 執行失敗。 423 鎖定的錯誤。 5xx:服務器錯誤 500 Internal Server Error 請求未完成。服務器遇到不可預知的狀況。 500.12 應用程序正忙於在 Web 服務器上從新啓動。 500.13 Web 服務器太忙。 500.15 不容許直接請求 Global.asa。 500.16 UNC 受權憑據不正確。這個錯誤代碼爲 IIS 6.0 所專用。 500.18 URL 受權存儲不能打開。這個錯誤代碼爲 IIS 6.0 所專用。 500.100 內部 ASP 錯誤。 501 Not Implemented 請求未完成。服務器不支持所請求的功能。 502 Bad Gateway 請求未完成。服務器從上游服務器收到一個無效的響應。 502.1 CGI 應用程序超時。 · 502.2 CGI 應用程序出錯。 503 Service Unavailable 請求未完成。服務器臨時過載或當機。 504 Gateway Timeout 網關超時。 505 HTTP Version Not Supported 服務器不支持請求中指明的HTTP協議版本
定義:網絡爬蟲排除標準
做用:告訴搜索引擎哪些能夠爬哪些不能爬。
網站地圖,能夠幫助咱們瞭解一個網站的結構。
site:www.taobao.com
Hash :散列,經過關於鍵值(key)的函數,將數據映射到內存存儲中一個位置來訪問。這個過程叫作Hash,這個映射函數稱作散列函數,存放記錄的數組稱作散列表(Hash Table),又叫哈希表。
簡單地說,它是密碼學中的一個重要的函數,通常以 表示 。這個函數能夠將任意一段數據(通常稱這段數據爲「消息」)壓縮成固定長度的字符串(通常稱輸出的字符串爲「摘要」)。哈希函數須要知足下述條件:
先分類,再查找,經過計算,縮小範圍,加快查找速度
數字簽名:給數據打指紋
好比咱們下載一個文件,文件的下載過程當中會通過不少網絡服務器、路由器的中轉,如何保證這個文件就是咱們所須要的呢?咱們不可能去一一檢測這個文件的每一個字節,也不能簡單地利用文件名、文件大小這些極容易假裝的信息,這時候,咱們就須要一種指紋同樣的標誌來檢查文件的可靠性,這種指紋就是咱們如今所用的Hash算法(也叫散列算法)。
密碼存儲
在用戶進行網站登陸時,若是服務器直接存儲用戶密碼,則若是服務器被攻擊者所攻擊,用戶的密碼就會遭到泄露。最典型的事件就是CSDN的密碼明文存儲事件了。爲了解決這個問題,服務器能夠僅存儲用戶密碼的哈希結果。當用戶輸入登陸信息後,服務器端能夠計算密碼的哈希結果,並與存儲的哈希結果進行對比,若是結果相同,則容許用戶登陸。因爲服務器不直接存儲用戶密碼,所以即便服務器被攻擊者攻擊,用戶的密碼也不會被泄露。這也是爲何咱們在使用【找回密碼】功能時,服務器直接請求輸入新的密碼,而不是把原始密碼發送給咱們。
正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。
逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不一樣。
衝突避免:很難找到兩段內容不一樣的明文,使得它們的 hash 值一致(發生衝突)。
即對於任意兩個不一樣的數據塊,其hash值相同的可能性極小;對於一個給定的數據塊,找到和它hash值相同的數據塊極爲困難。因此由於他的不可逆性,hash算法經常用來給一些信息加密,由於這種不可逆性,你不只不可能根據一段經過散列算法獲得的指紋來得到原有的文件,也不可能簡單地創造一個文件並讓它的指紋與一段目標指紋相一致。
(1)直接定值法:取Key或者Key的某個線性函數值爲散列地址。
(2)數字分析法:須要知道Key的集合,而且Key的位數比地址位數多,選擇Key數字分佈均勻的位。
Hash(Key) 取六位: 列數 : 1 (2) 3 (4) 5 (6) (7) 8 (9) 10 11 12 (13) key1: 5 2 4 2 7 5 8 5 3 6 5 1 3 key2: 5 4 4 8 7 7 7 5 4 8 9 5 1 key3: 3 1 5 3 7 8 5 4 6 3 5 5 2 key4: 5 3 6 4 3 2 5 4 5 3 2 6 4 其中(二、四、六、七、九、13) 這6列數字無重複,分佈較均勻,取此六列做爲Hash(Key)的值。 Hash(Key1) :225833 Hash(Key2):487741 Hash(Key3):138562 Hash(Key4):342554
(3)平方取中法:取Key平方值的中間幾位做爲Hash地址。
(4)摺疊法:將關鍵字分割成位數相同的幾部分(最後一部分的位數能夠不一樣),而後 取這幾部分的疊加和(捨去進位)做爲哈希地址。 當Key的位數較多的時候數字分佈均勻適合採用這種方案.
(5)隨機數法:僞隨機探測再散列。
具體實現:創建一個僞隨機數發生器,Hash(Key) = random(Key). 以此僞隨機數做爲哈希地址。
(6)除留餘數法:取關鍵字被某個除數 p 求餘,獲得的做爲散列地址。
即 H(Key) = Key % p;
目前流行的 Hash 算法包括 MD五、SHA-1 和 SHA-2。
SHA (Secure Hash Algorithm)是一個 Hash 函數族,由 NIST(National Institute of Standards and Technology)於 1993 年發佈第一個算法。目前知名的 SHA-1 在 1995 年面世,它的輸出爲長度 160 位的 hash 值,所以抗窮舉性更好。SHA-1 設計時基於和 MD4 相同原理,而且模仿了該算法。SHA-1 已被證實不具」強抗碰撞性」。
爲了提升安全性,NIST 還設計出了 SHA-22四、SHA-25六、SHA-384,和 SHA-512 算法(統稱爲 SHA-2),跟 SHA-1 算法原理相似。SHA-3 相關算法也已被提出。
若是兩個key經過hash函數處理以後獲得的散列值相同,這種狀況就叫作散列算法的碰撞(collision)。
現代散列算法所存在的理由就是,它的不可逆性能在較大機率上獲得實現,也就是說,發現碰撞的機率很小,這種碰撞能被利用的機率更小。
(1) MD5碰撞案例
import hashlib # 兩段HEX字節串,注意它們有細微差異 a = bytearray.fromhex("0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef") b = bytearray.fromhex("0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef") # 輸出MD5,它們的結果一致 print(hashlib.md5(a).hexdigest()) print(hashlib.md5(b).hexdigest())
這樣的例子還有不少。所以,MD5在數年前就已經不被推薦做爲應用中的散列算法方案,取代它的是SHA家族算法,也就是安全散列算法(Secure Hash Algorithm,縮寫爲SHA)。
(2) SHA家族算法以及SHA1碰撞
SHA家族算法的種類不少,有SHA0、SHA一、SHA25六、SHA384等等,它們的計算方式和計算速度都有差異。其中SHA1是如今用途最普遍的一種算法。包括GitHub在內的衆多版本控制工具以及各類雲同步服務都是用SHA1來區別文件,不少安全證書或是簽名也使用SHA1來保證惟一性。長期以來,人們都認爲SHA1是十分安全的,至少你們尚未找到一次碰撞案例。
hash在知乎上的一遍經典文章:https://www.zhihu.com/question/56234281/answer/148349930