精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

數字指紋有什么用?趕緊來了解一下

開發 前端
在大文件上傳的場景中,為了提高大文件上傳的用戶體驗,我們會支持斷點續傳。在上傳過程中,我們會對大文件進行分片處理,然后使用 md5 算法計算分片的哈希值,再把該分片的內容和其對應的哈希值一起提交到服務器。

[[376474]]

本文轉載自微信公眾號「 全棧修仙之路」,作者 阿寶哥 。轉載本文請聯系 全棧修仙之路公眾號。

在大文件上傳的場景中,為了提高大文件上傳的用戶體驗,我們會支持斷點續傳。在上傳過程中,我們會對大文件進行分片處理,然后使用 md5 算法計算分片的哈希值,再把該分片的內容和其對應的哈希值一起提交到服務器。

當服務器接收到分片對應的哈希值時,會先查詢該哈希值是否已經存在。如果存在,則表示該分片已經上傳過。這時可以返回大文件已上傳的字節數,從而讓客戶端可以繼續上傳剩余的內容。

其實分片對應的哈希值也可以被稱為分片的 “數字指紋”,那么什么是 “數字指紋” 呢?要理解 “數字指紋”,我們需要先來了解一下什么是消息摘要算法。

一、什么是消息摘要算法

消息摘要算法是密碼學算法中非常重要的一個分支,它通過對所有數據提取指紋信息以實現數據簽名、數據完整性校驗等功能,由于其不可逆性,有時候會被用做敏感信息的加密。消息摘要算法也被稱為哈希(Hash)算法或散列算法。

任何消息經過散列函數處理后,都會獲得唯一的散列值,這一過程稱為 “消息摘要”,其散列值稱為 “數字指紋”,其算法自然就是 “消息摘要算法” 了。換句話說,如果其數字指紋一致,就說明其消息是一致的。

(圖片來源 —— https://zh.wikipedia.org/wiki/散列函數)

消息摘要算法不存在密鑰的管理與分發問題,適合于分布式網絡上使用。消息摘要算法主要應用在 “數字簽名” 領域,作為對明文的摘要算法。著名的摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的變體。

1.1 消息摘要算法的特點

  • 無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用 MD5 算法摘要的消息有 128 個比特位,用 SHA-1 算法摘要的消息最終有 160 個比特位的輸出,SHA-1的變體可以產生 192 個比特位和 256 個比特位的消息摘要。一般認為,摘要的最終輸出越長,該摘要算法就越安全。
  • 消息摘要看起來是 “隨機的”。這些比特看上去是胡亂的雜湊在一起的,可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要消息可以通過隨機性檢驗。一般地,只要輸入的消息不同,對其進行摘要以后產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。
  • 消息摘要函數是單向函數,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的消息,甚至根本就找不到任何與原信息相關的信息。
  • 好的摘要算法,沒有人能從中找到 “碰撞” 或者說極度難找到,雖然 “碰撞” 是肯定存在的(碰撞即不同的內容產生相同的摘要)。

1.2 消息摘要算法的家譜

消息摘要算法主要分為三大類:MD(Message Digest,消息摘要算法)、SHA-1(Secure Hash Algorithm,安全散列算法)和 MAC(Message Authentication Code,消息認證碼算法)。

MD 系列算法包括 MD2、MD4 和 MD5 共 3 種算法;SHA 算法主要包括其代表算法 SHA-1 和 SHA-1 算法的變種 SHA-2 系列算法(包含 SHA-224、SHA-256、SHA-384 和 SHA-512);MAC 算法綜合了上述兩種算法,主要包括 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384 和 HmacSHA512 算法。

盡管上述內容列舉了各種消息摘要算法,但仍不能滿足應用需要。基于這些消息摘要算法,又衍生出了 RipeMD 系列(包含 RipeMD128、RipeMD160、RipeMD256、RipeMD320)、Tiger、GOST3411 和 Whirlpool 算法。

對于大多數前端開發者來說,接觸得比較多的應該是 MD5 算法。所以,接下來阿寶哥將重點介紹 MD5 算法。

二、什么是 MD5 算法

MD5(Message Digest Algorithm 5,消息摘要算法版本5),它由 MD2、MD3、MD4 發展而來,由 Ron Rivest(RSA 公司)在 1992 年提出,目前被廣泛應用于數據完整性校驗、數據(消息)摘要、數據簽名等。MD2、MD4、MD5 都產生 16 字節(128 位)的校驗值,一般用 32 位十六進制數表示。MD2 的算法較慢但相對安全,MD4 速度很快,但安全性下降,MD5 比 MD4 更安全、速度更快。

隨著計算機技術的發展和計算水平的不斷提高,MD5 算法暴露出來的漏洞也越來越多。1996 年后被證實存在弱點,可以被加以破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如 SHA-2。2004 年,證實 MD5 算法無法防止碰撞(collision),因此不適用于安全性認證,如 SSL 公開密鑰認證或是數字簽名等用途。

2.1 MD5 特點

  • 穩定、運算速度快。
  • 壓縮性:輸入任意長度的數據,輸出長度固定(128 比特位)。
  • 運算不可逆:已知運算結果的情況下,無法通過通過逆運算得到原始字符串。
  • 高度離散:輸入的微小變化,可導致運算結果差異巨大。

2.2 MD5 散列

128 位的 MD5 散列在大多數情況下會被表示為 32 位十六進制數字。以下是一個 43 位長的僅 ASCII 字母列的 MD5 散列:

  1. MD5("The quick brown fox jumps over the lazy dog"
  2. = 9e107d9d372bb6826bd81d3542a419d6 

即使在原文中作一個小變化(比如把 dog 改為 cog,只改變一個字符)其散列也會發生巨大的變化:

  1. MD5("The quick brown fox jumps over the lazy cog"
  2. = 1055d3e698d289f2af8663725127bd4b 

接著我們再來舉幾個 MD5 散列的例子:

  1. MD5("") -> d41d8cd98f00b204e9800998ecf8427e  
  2. MD5("semlinker") -> 688881f1c8aa6ffd3fcec471e0391e4d 
  3. MD5("kakuqo") -> e18c3c4dd05aef020946e6afbf9e04ef 

三、MD5 算法的用途

3.1 防止被篡改

3.1.1 文件分發防篡改

在互聯網上分發軟件安裝包時,出于安全性考慮,為了防止軟件被篡改,比如在軟件安裝程序中添加木馬程序。軟件開發者通常會使用消息摘要算法,比如 MD5 算法產生一個與文件匹配的數字指紋,這樣接收者在接收到文件后,就可以利用一些現成的工具來檢查文件完整性。

(圖片來源 —— https://en.wikipedia.org/wiki/MD5)

這里我們來舉一個實際的例子,下圖是 MySQL Community Server 8.0.19 版本的下載頁,該下載頁通過 MD5 算法分別計算出不同軟件包的數字指紋,具體如下圖所示:

(圖片來源 —— https://dev.mysql.com/downloads/mysql/)

當用戶從官網上下載到對應的安裝包之后,可以利用一些 MD5 校驗工具對已下載的文件進行校驗,然后比對最終的 MD5 數字指紋。若結果與官網公布的數字指紋一致,則表示該安裝包未經過任何修改是安全的,基本可以放心安裝。

3.1.2 消息傳輸防篡改

假設在網絡上你需要發送電子文檔給你的朋友,在文件發送前,先對文檔的內容進行 MD5 運算,得出該電子文檔的 “數字指紋”,并把該 “數字指紋” 隨電子文檔一同發送給對方。當對方接收到電子文檔之后,也使用 MD5 算法對文檔的內容進行哈希運算,在運算完成后也會得到一個對應 “數字指紋”,當該指紋與你所發送文檔的 “數字指紋” 一致時,表示文檔在傳輸過程中未被篡改。

3.2 信息保密

在互聯網初期很多網站在數據庫中以明文的形式存儲用戶的密碼,這存在很大的安全隱患,比如數據庫被黑客入侵,從而導致網站用戶信息的泄露。針對這個問題,一種解決方案是在保存用戶密碼時,不再使用明文,而是使用消息摘要算法,比如 MD5 算法對明文密碼進行哈希運算,然后把運算的結果保存到數據庫中。使用上述方案,避免了在數據庫中以明文方式保存密碼,提高了系統的安全性,不過這種方案并不安全,后面我們會詳細分析。

當用戶登錄時,登錄系統對用戶輸入的密碼執行 MD5 哈希運算,然后再使用用戶 ID 和密碼對應的 MD5 “數字指紋” 進行用戶認證。若認證通過,則當前的用戶可以正常登錄系統。用戶密碼經過 MD5 哈希運算后存儲的方案至少有兩個好處:

防內部攻擊:因為在數據庫中不會以明文的方式保存密碼,因此可以避免系統中用戶的密碼被具有系統管理員權限的人員知道。

防外部攻擊:網站數據庫被黑客入侵,黑客只能獲取經過 MD5 運算后的密碼,而不是用戶的明文密碼。

四、MD5 算法使用示例

在 Node.js 環境中,我們可以使用 crypto 原生模塊提供的 md5 實現,當然也可以使用主流的 MD5 第三方庫,比如 md5 這個可以同時運行在服務端和客戶端的第三方庫。在介紹具體使用前,我們需要提前安裝 md5 這個第三方庫,具體安裝方式如下:

  1. $ npm install md5 --save 

4.1 crypto 模塊使用示例

  1. const crypto = require("crypto"); 
  2.  
  3. const msg = "阿寶哥"
  4. function md5(data) { 
  5.   const hash = crypto.createHash("md5"); 
  6.   return hash.update(data).digest("hex"); 
  7.  
  8. console.log("Node.js Crypto MD5: " + msg + " -> " + md5(msg)); 

4.2 MD5 庫使用示例

  1. const md5 = require('md5'); 
  2. const msg = "阿寶哥"
  3.  
  4. console.log("MD5 Lib MD5: " + msg + " -> " + md5(msg)); 

以上示例代碼正常運行后,在控制臺中會輸出以下結果:

  1. Node.js Crypto MD5: 阿寶哥 -> 8eec7fcf817f7340b791b32ecdbed570 
  2. MD5 Lib MD5: 阿寶哥 -> 8eec7fcf817f7340b791b32ecdbed570 

五、MD5 算法的缺陷

哈希碰撞是指不同的輸入卻產生了相同的輸出,好的哈希算法,應該沒有人能從中找到 “碰撞” 或者說極度難找到,雖然 “碰撞” 是肯定存在的。

2005 年山東大學的王小云教授發布算法可以輕易構造 MD5 碰撞實例,此后 2007 年,有國外學者在王小云教授算法的基礎上,提出了更進一步的 MD5 前綴碰撞構造算法 “chosen prefix collision”,此后還有專家陸續提供了MD5 碰撞構造的開源的庫。

2009 年,中國科學院的謝濤和馮登國僅用了 220.96 的碰撞算法復雜度,破解了 MD5 的碰撞抵抗,該攻擊在普通計算機上運行只需要數秒鐘。

MD5 碰撞很容易構造,基于 MD5 來驗證數據完整性已不可靠,考慮到近期谷歌已成功構造了 SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)的碰撞實例,對于數據完整性,應使用 SHA256 或更強的算法代替。

5.1 MD5 碰撞樣本

下面我們先來看一下 MD5 碰撞的樣本:

5.1.1 HEX(十六進制)樣本 A1

  1. 4dc968ff0ee35c209572d4777b721587 
  2. d36fa7b21bdc56b74a3dc0783e7b9518 
  3. afbfa200a8284bf36e8e4b55b35f4275 
  4. 93d849676da0d1555d8360fb5f07fea2 

5.1.2 HEX(十六進制)樣本 A2

  1. 4dc968ff0ee35c209572d4777b721587 
  2. d36fa7b21bdc56b74a3dc0783e7b9518 
  3. afbfa202a8284bf36e8e4b55b35f4275 
  4. 93d849676da0d1d55d8360fb5f07fea2 

兩個樣本之間的差異如下圖所示:

5.2 驗證 MD5 碰撞

下面我們來使用 Node.js 實際驗證一下樣本 A1 和樣本 A2 經過 MD5 運算后輸出的結果是否一致:

5.2.1 設置樣本數據

  1. let sample1 = ` 
  2. 4dc968ff0ee35c209572d4777b721587 
  3. d36fa7b21bdc56b74a3dc0783e7b9518 
  4. afbfa200a8284bf36e8e4b55b35f4275 
  5. 93d849676da0d1555d8360fb5f07fea2`; 
  6.  
  7. let sample2 = ` 
  8. 4dc968ff0ee35c209572d4777b721587 
  9. d36fa7b21bdc56b74a3dc0783e7b9518 
  10. afbfa202a8284bf36e8e4b55b35f4275 
  11. 93d849676da0d1d55d8360fb5f07fea2 
  12. `; 

5.2.2 定義 getHashResult 方法

  1. function getHashResult(hexString) { 
  2.   const hash = crypto.createHash("md5"); 
  3.   const buffer = Buffer.from(hexString.replace(/\s/g, ""), "hex"); 
  4.   return hash.update(buffer).digest("hex"); 

5.2.3 執行碰撞檢測

  1. let sample1Md5 = getHashResult(sample1); 
  2. let sample2Md5 = getHashResult(sample2); 
  3.  
  4. if (sample1Md5 === sample2Md5) { 
  5.   console.log(`出現 MD5 碰撞: ${sample1Md5}`); 
  6. else { 
  7.   console.log(`未出現 MD5 碰撞`); 

以上代碼成功運行后,在控制臺中會輸出以下結果:

  1. 出現 MD5 碰撞: 008ee33a9d58b51cfeb425b0959121c9 

如果你對其它 MD5 碰撞的樣本感興趣,可以查看 MD5碰撞的一些例子 這篇文章。由于基于 MD5 來驗證數據完整性不太可靠,所以 Node.js 使用了 SHA256 算法來確保數據的完整性。

(圖片來源 —— https://nodejs.org/download/release/v15.6.0/SHASUMS256.txt.asc)

六、MD5 密碼安全性

6.1 MD5 密文反向查詢

前面我們已經提到通過對用戶密碼進行 MD5 運算可以提高系統的安全性。但實際上,這樣的安全性還是不高。為什么呢?因為只要輸入相同就會產生相同的輸出。接下來我們來舉一個示例,字符串 123456789 是一個很常用的密碼,它經過 MD5 運算后會生成一個對應的哈希值:

  1. MD5("123456789") -> 25f9e794323b453885f5181f1b624d0b 

由于輸入相同就會產生相同的結果,因此攻擊者就可以根據哈希結果反推輸入。其中一種常見的破解方式就是使用彩虹表。彩虹表是一個用于加密散列函數逆運算的預先計算好的表,常用于破解加密過的密碼散列。 查找表常常用于包含有限字符固定長度純文本密碼的加密。這是以空間換時間的典型實踐,在每一次嘗試都計算的暴力破解中使用更少的計算能力和更多的儲存空間,但卻比簡單的每個輸入一條散列的翻查表使用更少的儲存空間和更多的計算性能。

目前網上某些站點,比如 cmd5.com 已經為我們提供了 MD5 密文的反向查詢服務,我們以 MD5("123456789") 生成的結果,做個簡單的驗證,具體如下圖所示:

因為 123456789 是很常見的密碼,因此該網站能夠反向得出正確結果那就不足為奇了。以下是 cmd5 網站的站點說明,大家可以參考一下,感興趣的小伙伴可以親自驗證一下。

現在我們已經知道如果用戶的密碼相同 MD5 的值就會一樣,通過一些 MD5 密文的反向查詢網站,密碼大概率會被解析出來,這樣使用相同密碼的用戶就會受到影響。那么該問題如何解決呢?答案是密碼加鹽。

6.2 密碼加鹽

鹽(Salt),在密碼學中,是指在散列之前將散列內容(例如:密碼)的任意固定位置插入特定的字符串。這個在散列中加入字符串的方式稱為 “加鹽”。其作用是讓加鹽后的散列結果和沒有加鹽的結果不相同,在不同的應用情景中,這個處理可以增加額外的安全性。

在大部分情況,鹽是不需要保密的。鹽可以是隨機產生的字符串,其插入的位置可以也是隨意而定。如果這個散列結果在將來需要進行驗證(例如:驗證用戶輸入的密碼),則需要將已使用的鹽記錄下來。為了便于理解,我們來舉個簡單的示例。

6.2.1 Node.js MD5 加鹽示例

  1. const crypto = require("crypto"); 
  2.  
  3. function cryptPwd(password, salt) { 
  4.   const saltPassword = password + ":" + salt; 
  5.   console.log("原始密碼:%s"password); 
  6.   console.log("加鹽后的密碼:%s", saltPassword); 
  7.  
  8.   const md5 = crypto.createHash("md5"); 
  9.   const result = md5.update(saltPassword).digest("hex"); 
  10.   console.log("加鹽密碼的md5值:%s", result); 
  11.  
  12. cryptPwd("123456789","exe"); 
  13. cryptPwd("123456789","eft"); 

以上示例代碼正常運行后,在控制臺中會輸出以下結果:

  1. 原始密碼:123456789 
  2. 加鹽后的密碼:123456789:exe 
  3. 加鹽密碼的md5值:3328003d9f786897e0749f349af490ca 
  4. 原始密碼:123456789 
  5. 加鹽后的密碼:123456789:eft 
  6. 加鹽密碼的md5值:3c45dd21ba03e8216d56dce8fe5ebabf 

通過觀察以上結果,我們發現原始密碼一致,但使用的鹽值不一樣,最終生成的 MD5 哈希值差異也比較大。此外為了提高破解的難度,我們可以隨機生成鹽值并且提高鹽值的長度。

6.3 bcrypt

哈希加鹽的方式確實能夠增加攻擊者的成本,但是今天來看還遠遠不夠,我們需要一種更加安全的方式來存儲用戶的密碼,這也就是今天被廣泛使用的 bcrypt。

bcrypt 是一個由 Niels Provos 以及 David Mazières 根據 Blowfish 加密算法所設計的密碼散列函數,于 1999 年在 USENIX 中展示。bcrypt 這一算法就是為哈希密碼而專門設計的,所以它是一個執行相對較慢的算法,這也就能夠減少攻擊者每秒能夠處理的密碼數量,從而避免攻擊者的字典攻擊。實現中 bcrypt 會使用一個加鹽的流程以防御彩虹表攻擊,同時 bcrypt 還是適應性函數,它可以借由增加迭代之次數來抵御日益增進的電腦運算能力透過暴力法破解。

由 bcrypt 加密的文件可在所有支持的操作系統和處理器上進行轉移。它的口令必須是 8 至 56 個字符,并將在內部被轉化為 448 位的密鑰。然而,所提供的所有字符都具有十分重要的意義。密碼越強大,您的數據就越安全。

下面我們以 Node.js 平臺的 bcryptjs 為例,介紹一下如何使用 bcrypt 算法來處理用戶的密碼。首先我們需要先安裝 bcryptjs:

  1. $ npm install bcryptjs --save 

6.3.1 使用 bcryptjs 處理密碼

  1. const bcrypt = require("bcryptjs"); 
  2.  
  3. const password = "123456789"
  4. const saltRounds = 10; 
  5.  
  6. async function bcryptHash(str, saltRounds) { 
  7.   let hashedResult; 
  8.   try { 
  9.     const salt = await bcrypt.genSalt(saltRounds); 
  10.     hashedResult = await bcrypt.hash(str, salt); 
  11.   } catch (error) { 
  12.     throw error; 
  13.   } 
  14.   return hashedResult; 
  15.  
  16. bcryptHash(password, saltRounds).then(console.log); 

以上示例代碼正常運行后,在控制臺中會輸出以下結果:

  1. $2a$10$O1SrEy3KsgN0NQdQjaSU6OxjxDo0jf.j/e2goSwSEu4esz9i58dRm 

很明顯密碼 123456789 經過 bcrypt 的哈希運算后,得到了一串讀不懂的 “亂碼”。這里我們已經完成第一步,即用戶登錄密碼的加密。下一步我們要實現登錄密碼的比對,即要保證用戶輸入正確的密碼后,能正常登錄系統。

6.3.2 使用 bcryptjs 校驗密碼

  1. async function bcryptCompare(str, hashed) { 
  2.   let isMatch; 
  3.   try { 
  4.     isMatc = await bcrypt.compare(str, hashed); 
  5.   } catch (error) { 
  6.     throw error; 
  7.   } 
  8.   return isMatch; 
  9.  
  10. bcryptCompare( 
  11.   "123456789"
  12.   "$2a$10$O1SrEy3KsgN0NQdQjaSU6OxjxDo0jf.j/e2goSwSEu4esz9i58dRm" 
  13. ).then(console.log); 
  14.  
  15. bcryptCompare( 
  16.   "123456"
  17.   "$2a$10$O1SrEy3KsgN0NQdQjaSU6OxjxDo0jf.j/e2goSwSEu4esz9i58dRm" 
  18. ).then(console.log); 

以上示例代碼正常運行后,在控制臺中會輸出以下結果:

  1. true 
  2. false 

因為我們的原始密碼是 123456789,很明顯與 123456 并不匹配,所以會輸出以上的匹配結果。

七、總結

本文首先介紹了消息摘要算法、MD5 算法的相關概念和特點,然后詳細介紹了 MD5 算法的用途和 Node.js 平臺的使用示例,最后我們還分析了 MD5 算法存在的缺陷和 MD5 密碼的安全性問題。這里需要大家注意的是,基于 MD5 來驗證數據完整性已不可靠,考慮到近期谷歌已成功構造了 SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)的碰撞實例,對于數據完整性校驗,應使用 SHA256 或更強的算法代替。

除了文中介紹的 MD5 應用場景,MD5 還可以用于實現 CDN(Content Delivery Network,內容分發網絡)內容資源的防盜鏈,感興趣的小伙伴可以閱讀 “深入了解 Token 防盜鏈” 這篇文章。

近期阿寶哥突然對 JS 逆向 很感興趣,因此打算系統學習一下相關的知識,目前已有初步的學習計劃,想一起學習的小伙伴可以私聊阿寶哥哈。

八、參考資源

  • 維基百科 - MD5
  • 維基百科 - 彩虹表
  • 維基百科 - 鹽_(密碼學)
  • 加密基礎知識一 MD5 SHA-1 CRC 加鹽
  • MD、SHA、MAC消息摘要算法實現與應用
  • MD5 碰撞的一些例子

 

責任編輯:武曉燕 來源: 全棧修仙之路
相關推薦

2020-06-04 18:21:34

CPU緩存Intel

2024-09-19 09:30:39

緩存框架抽象

2020-12-10 08:44:35

WebSocket輪詢Comet

2024-10-31 13:49:04

2024-04-16 13:34:26

JSONMsgpack存儲

2023-10-08 10:37:48

springweb版本

2021-12-15 10:29:44

iOS蘋果系統

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖

2024-01-25 10:23:22

對象存儲存儲數據

2018-03-21 09:08:06

超融合架構本質

2023-11-01 07:25:54

Kafka消息傳遞系統

2022-04-29 11:11:14

華為移動路由Pro

2023-03-06 08:27:33

Redis數據類型

2019-02-20 14:16:43

2020-02-10 14:26:10

GitHub代碼倉庫

2024-04-11 12:19:01

Rust數據類型

2018-06-05 17:40:36

人工智能語音識別

2009-06-17 15:51:55

java有什么用

2017-11-22 15:50:58

Netty微服務RPC

2022-05-05 07:38:32

volatilJava并發
點贊
收藏

51CTO技術棧公眾號

成人黄色免费观看| h视频网站在线观看| 亚洲电影在线| 亚洲欧美日韩爽爽影院| 一级黄色录像在线观看| 中中文字幕av在线| 91免费看`日韩一区二区| 国产精品久久网| 久草免费新视频| 欧美美乳视频| 91精品婷婷国产综合久久| 男女猛烈激情xx00免费视频| 国产精品免费播放| 国产成人啪免费观看软件| 欧美做受高潮电影o| 亚洲 欧美 变态 另类 综合| 亚洲高清极品| 欧美成人vps| 久久婷婷综合色| 国产不卡123| 亚洲免费观看高清完整版在线观看| 精品日产一区2区三区黄免费| 91亚洲视频在线观看| 国产欧美短视频| 欧美激情免费在线| 日本伦理一区二区三区| 美日韩中文字幕| 精品国产一区二区三区久久影院 | 久久成人免费| 色中色综合影院手机版在线观看| 日本黄色小视频在线观看| 国产精品xxx在线观看| 91精品国产综合久久福利软件| 苍井空浴缸大战猛男120分钟| 欧美性受ⅹ╳╳╳黑人a性爽| 中文字幕欧美一区| 91免费在线观看网站| 日韩精品一区二区亚洲av| 激情久久综合| 欧美高清在线观看| 人妻久久一区二区| 日韩亚洲一区在线| 国产一区二区三区在线视频| 五级黄高潮片90分钟视频| jizz性欧美23| 精品国产污污免费网站入口 | 中文人妻熟女乱又乱精品| 亚洲永久免费精品| 91精品国产高清自在线| 日干夜干天天干| 亚洲欧洲综合| 97在线观看视频| 中文字幕一区二区三区精品| 在线看片成人| 国内精品久久久久影院 日本资源| 激情五月少妇a| 欧美精品啪啪| 久久久亚洲成人| 国产精品99无码一区二区| 欧美一区网站| 欧美激情在线视频二区| 国产精品日日夜夜| 亚洲视频二区| 国产精品99蜜臀久久不卡二区| 波多野结衣高清在线| 日韩影院免费视频| 国产精品人人做人人爽| 91久久精品无码一区二区| 久久99久久精品| 超碰国产精品久久国产精品99| 狠狠躁日日躁夜夜躁av| a亚洲天堂av| 欧美一区二区在线| 日韩黄色影院| 亚洲精品美国一| 国产免费黄色一级片| 波多野结衣久久精品| 在线观看视频一区| 午夜影院免费观看视频| 精品av导航| 亚洲人午夜精品免费| 亚洲欧美卡通动漫| 精品不卡视频| 国产91色在线|| 国产尤物视频在线观看| 风间由美一区二区三区在线观看| 久久久久久亚洲精品不卡4k岛国| 国产在线观看精品一区| 亚洲欧美偷拍卡通变态| 国产精品专区在线| 国产黄色精品| 亚洲成人亚洲激情| 日本一卡二卡在线播放| 黑丝一区二区| 国产精品久久久久久久久| av免费观看网址| 久久精品亚洲麻豆av一区二区 | 粉嫩高清一区二区三区精品视频 | 一道本一区二区三区| 色偷偷偷亚洲综合网另类| 免费一级片视频| 日本特黄久久久高潮| 亚洲综合第一页| 狠狠狠综合7777久夜色撩人| 亚洲影视资源网| 九一精品在线观看| 精品视频自拍| 久久精品国产欧美激情| 久久精品国产成人av| 国产又粗又猛又爽又黄91精品| 国内精品二区| av毛片在线播放| 欧美影院一区二区三区| 人妻av一区二区| 亚洲精品久久| 国产精品久久久91| 午夜福利一区二区三区| 亚洲久草在线视频| 久久久久久蜜桃一区二区| 日韩在线影视| 97视频免费看| 国产丰满果冻videossex| 国产欧美一二三区| 欧美日韩在线视频一区二区三区| 欧美黄视频在线观看| 在线亚洲男人天堂| 中文在线第一页| 99免费精品视频| 91免费国产精品| 亚洲国产91视频| 最近2019年日本中文免费字幕| 人妻 日韩精品 中文字幕| 高清国产一区二区| 色哺乳xxxxhd奶水米仓惠香| 日韩欧美激情| 中文字幕在线日韩| 伊人成人在线观看| 中文乱码免费一区二区| 能在线观看的av网站| 亚洲va久久| 欧美孕妇性xx| 欧美大片aaa| 成人高潮免费视频| 久久99久久久久| 麻豆md0077饥渴少妇| 欧美电影在线观看网站| 少妇av一区二区三区| 中国一区二区视频| 国产精品天美传媒| 15—17女人毛片| 色综合天天爱| 成人有码视频在线播放| 国产三级在线播放| 欧美一区日韩一区| 麻豆成人在线视频| 成人午夜视频免费看| 69sex久久精品国产麻豆| www.丝袜精品| 97成人精品区在线播放| 日韩av成人| 欧美综合视频在线观看| 战狼4完整免费观看在线播放版| 蜜桃一区二区三区四区| 神马影院一区二区三区| 色综合视频一区二区三区44| 麻豆乱码国产一区二区三区| 性生活视频软件| 午夜精品久久久久久久99水蜜桃 | 成 人片 黄 色 大 片| 亚洲制服欧美中文字幕中文字幕| 美女搡bbb又爽又猛又黄www| 免播放器亚洲| 性欧美.com| 韩国一区二区三区视频| 国产69精品久久久久9999| 欧美91精品久久久久国产性生爱| 色久优优欧美色久优优| 黄色录像一级片| 国产精品一区二区黑丝| 日日摸日日碰夜夜爽av| 日本欧美视频| 97人人澡人人爽| 成人性教育av免费网址| 日韩视频免费在线| 无码h黄肉3d动漫在线观看| 在线观看网站黄不卡| 欧美人禽zoz0强交| 26uuu欧美日本| www.五月天色| 国产一区二区高清| 日本免费在线视频观看| 日韩av网址大全| 国产在线日韩在线| а√在线天堂官网| xvideos亚洲| 色窝窝无码一区二区三区成人网站| 欧洲一区二区三区免费视频| 欧美黑人猛猛猛| 久久免费视频一区| 中文字幕无码毛片免费看| 久久先锋影音| 国产精品无码免费专区午夜| 欧美一区电影| 精品国产乱码久久久久久郑州公司| 8av国产精品爽爽ⅴa在线观看| 欧美精品久久久久久久| 在线观看免费黄视频| 日韩成人久久久| 国产日韩在线观看一区| 福利视频第一区| 麻豆亚洲av熟女国产一区二| 国产性做久久久久久| 无码人妻精品一区二区三区99不卡| 蜜臀av性久久久久av蜜臀妖精| 无码人妻丰满熟妇区96| 欧美女人交a| 伊人久久青草| 成人久久久久| 欧洲成人一区二区| 大奶在线精品| 91老司机在线| 国产91在线精品| 日本国产精品视频| 波多野结衣在线播放| 欧美成人免费一级人片100| 91精彩视频在线播放| 亚洲欧美国产精品va在线观看| 高h调教冰块play男男双性文| 欧美精品第1页| 亚洲系列在线观看| 在线观看日韩高清av| 51国产偷自视频区视频| 亚洲国产一区二区视频| 中文字幕av免费在线观看| 18成人在线观看| www中文在线| 国产精品毛片久久久久久| 亚洲图片另类小说| www精品美女久久久tv| 中文字幕日韩三级片| 99久久久精品免费观看国产蜜| 人妻精油按摩bd高清中文字幕| 国内外成人在线| 午夜精品免费看| 极品少妇xxxx精品少妇| 极品粉嫩美女露脸啪啪| 寂寞少妇一区二区三区| 在线观看免费av网址| 理论片日本一区| 思思久久精品视频| 国产一区二区美女诱惑| 色婷婷一区二区三区在线观看| 国产一区二区三区四区在线观看| 亚洲精品中文字幕乱码无线| 国产裸体歌舞团一区二区| 成年人性生活视频| 成人永久免费视频| 精品一区二区视频在线观看| 99在线精品免费| 公侵犯人妻一区二区三区| 久久品道一品道久久精品| 欧美黄色一级生活片| 国产精品久久看| 五月天激情丁香| 亚洲午夜免费电影| 中日韩黄色大片| 日本高清不卡aⅴ免费网站| www.久久网| 欧美一二三区在线观看| 人妻无码一区二区三区久久99| 国产丝袜精品视频| a天堂中文在线88| 蜜臀久久99精品久久久久久宅男| 182在线播放| 国产精品av免费在线观看| 亚洲成a人片777777久久| 国产精品视频在线免费观看| 亚洲精品国产动漫| 亚洲三级一区| 亚洲毛片在线| 久久久精品麻豆| 国产成人欧美日韩在线电影| 性欧美丰满熟妇xxxx性仙踪林| 国产精品视频免费| 久久午夜无码鲁丝片午夜精品| 欧美视频13p| av资源免费看| 亚洲精品中文字幕有码专区| 免费在线毛片网站| 性欧美亚洲xxxx乳在线观看| 日本午夜免费一区二区| 国产亚洲一区在线播放| 日韩www.| 国产精品网站免费| 精品系列免费在线观看| 三级男人添奶爽爽爽视频| 亚洲天堂成人在线观看| 99精品人妻国产毛片| 欧美一级生活片| 高清美女视频一区| 国内精品久久影院| 99综合久久| 日韩欧美在线一区二区| 在线看片日韩| 九九九久久久久久久| 国产三级精品视频| 国产成人在线播放视频| 777久久久精品| 国产小视频免费在线观看| 欧美激情欧美狂野欧美精品| yy6080久久伦理一区二区| 国内精品二区| 国产一区日韩一区| 在线免费看污网站| 欧美激情一区二区在线| 国产精品久久久久久久妇| 日韩一区二区电影在线| 91在线免费看| 国产精品白嫩美女在线观看| 久9re热视频这里只有精品| 少妇久久久久久被弄到高潮| 日韩在线一区二区三区| 午夜理伦三级做爰电影| 精品人伦一区二区三区蜜桃网站| 国产高清第一页| 久久精品中文字幕电影| 激情久久一区二区| 色婷婷精品国产一区二区三区| 米奇777在线欧美播放| 你懂的在线观看网站| 亚洲最新视频在线观看| 99久久精品国产一区二区成人| 中文字幕在线亚洲| 成人综合网站| 亚洲一区二区在线免费观看| 日韩电影免费在线看| www在线观看免费视频| 欧美午夜电影在线| 四虎在线视频免费观看| 91精品国产高清自在线| 欧美色图婷婷| 国产91在线免费| 91亚洲午夜精品久久久久久| 日产精品久久久| 亚洲美女av在线播放| www.日韩| 日韩欧美亚洲日产国产| 日韩精品电影一区亚洲| 精品一区二区三孕妇视频| 欧美日韩在线亚洲一区蜜芽| 生活片a∨在线观看| 国产日韩欧美在线播放| 小说区亚洲自拍另类图片专区| 亚洲一二区在线观看| 一区二区成人在线视频| 亚洲狼人综合网| 97av在线视频| 国模吧精品视频| 五月天婷婷亚洲| 亚洲美女区一区| 欧美一级特黄aaaaaa| 青青草原一区二区| 欧美精品一区二区久久| 午夜免费看毛片| 亚洲主播在线播放| 日本激情一区二区三区| 日韩女在线观看| 久久久久久久久丰满| 欧美一级片在线免费观看| 亚洲午夜电影在线观看| 欧美视频综合| 国产精品自拍偷拍| 国产一区二区中文| 国产精品麻豆入口| 欧美亚洲日本一区| 免费大片黄在线观看视频网站| 亚洲字幕一区二区| 亚洲一区图片| 亚洲精品91在线| 日韩欧美aaaaaa| 182在线播放| 亚洲一区在线免费| 成人免费看的视频| 国产成人自拍偷拍| 欧美另类极品videosbestfree| 精品嫩草影院| 中文字幕视频在线免费观看| 一区二区三区在线视频免费观看| 五月婷婷激情在线| 成人午夜在线视频一区| 亚洲另类自拍| 91ts人妖另类精品系列| 亚洲国产91色在线| 久久免费影院| 人人妻人人添人人爽欧美一区| 中文字幕二三区不卡| 日韩有码第一页| 91精品美女在线| 久久精品中文| 久久精品国产亚洲av无码娇色|