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

.NET 6 中哈希算法的簡化用法

開發 后端 算法
微軟在 .NET 6 中引入一些更簡單的 API 來使用 HMAC 哈希算法(MD5/SHA1/SHA256/SHA384/SHA512)。

[[422468]]

本文轉載自微信公眾號「amazingdotnet」,作者 WeihanLi 。轉載本文請聯系amazingdotnet公眾號。

Intro

微軟在 .NET 6 中引入一些更簡單的 API 來使用 HMAC 哈希算法(MD5/SHA1/SHA256/SHA384/SHA512)

微軟的叫法叫做 HMAC One-Shoot method, HMAC 算法在普通的哈希算法基礎上增加了一個 key,通過 key 提升了安全性,能夠有效避免密碼泄露被彩虹表反推出真實密碼, JWT(Json Web Token) 除了可以使用 RSA 方式外也支持使用 HMAC 。

New API

新增的 API 定義如下:

  1. namespace System.Security.Cryptography { 
  2.     public partial class HMACMD5 { 
  3.         public static byte[] HashData(byte[] key, byte[] source); 
  4.         public static byte[] HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source); 
  5.         public static int HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination); 
  6.         public static bool TryHashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten); 
  7.     } 
  8.  
  9.     public partial class HMACSHA1 { 
  10.         public static byte[] HashData(byte[] key, byte[] source); 
  11.         public static byte[] HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source); 
  12.         public static int HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination); 
  13.         public static bool TryHashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten); 
  14.     } 
  15.  
  16.     public partial class HMACSHA256 { 
  17.         public static byte[] HashData(byte[] key, byte[] source); 
  18.         public static byte[] HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source); 
  19.         public static int HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination); 
  20.         public static bool TryHashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten); 
  21.     } 
  22.  
  23.     public partial class HMACSHA384 { 
  24.         public static byte[] HashData(byte[] key, byte[] source); 
  25.         public static byte[] HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source); 
  26.         public static int HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination); 
  27.         public static bool TryHashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten); 
  28.     } 
  29.  
  30.     public partial class HMACSHA512 { 
  31.         public static byte[] HashData(byte[] key, byte[] source); 
  32.         public static byte[] HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source); 
  33.         public static int HashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination); 
  34.         public static bool TryHashData(ReadOnlySpan<byte> key, ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten); 
  35.     } 

Sample Before

在之前的版本中想要實現計算 HMAC 算法會比較復雜,之前實現了一個 HashHelper 來封裝了常用的 Hash 算法和 HMAC 算法,HashHelper 部分代碼如下,完整代碼可以從 Github 獲?。篽ttps://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Helpers/HashHelper.cs

  1. /// <summary> 
  2. /// 獲取哈希之后的字符串 
  3. /// </summary> 
  4. /// <param name="type">哈希類型</param> 
  5. /// <param name="source">源</param> 
  6. /// <param name="key">key</param> 
  7. /// <param name="isLower">是否是小寫</param> 
  8. /// <returns>哈希算法處理之后的字符串</returns
  9. public static string GetHashedString(HashType type, byte[] source, byte[]? key, bool isLower = false
  10.     Guard.NotNull(source, nameof(source)); 
  11.     if (source.Length == 0) 
  12.     { 
  13.         return string.Empty; 
  14.     } 
  15.     var hashedBytes = GetHashedBytes(type, source, key); 
  16.     var sbText = new StringBuilder(); 
  17.     if (isLower) 
  18.     { 
  19.         foreach (var b in hashedBytes) 
  20.         { 
  21.             sbText.Append(b.ToString("x2")); 
  22.         } 
  23.     } 
  24.     else 
  25.     { 
  26.         foreach (var b in hashedBytes) 
  27.         { 
  28.             sbText.Append(b.ToString("X2")); 
  29.         } 
  30.     } 
  31.     return sbText.ToString(); 
  32.  
  33. /// <summary> 
  34. /// 計算字符串Hash值 
  35. /// </summary> 
  36. /// <param name="type">hash類型</param> 
  37. /// <param name="str">要hash的字符串</param> 
  38. /// <returns>hash過的字節數組</returns
  39. public static byte[] GetHashedBytes(HashType type, string str) => GetHashedBytes(type, str, Encoding.UTF8); 
  40.  
  41. /// <summary> 
  42. /// 計算字符串Hash值 
  43. /// </summary> 
  44. /// <param name="type">hash類型</param> 
  45. /// <param name="str">要hash的字符串</param> 
  46. /// <param name="encoding">編碼類型</param> 
  47. /// <returns>hash過的字節數組</returns
  48. public static byte[] GetHashedBytes(HashType type, string str, Encoding encoding) 
  49.     Guard.NotNull(str, nameof(str)); 
  50.     if (str == string.Empty) 
  51.     { 
  52.         return Array.Empty<byte>(); 
  53.     } 
  54.     var bytes = encoding.GetBytes(str); 
  55.     return GetHashedBytes(type, bytes); 
  56.  
  57. /// <summary> 
  58. /// 獲取Hash后的字節數組 
  59. /// </summary> 
  60. /// <param name="type">哈希類型</param> 
  61. /// <param name="bytes">原字節數組</param> 
  62. /// <returns></returns
  63. public static byte[] GetHashedBytes(HashType type, byte[] bytes) => GetHashedBytes(type, bytes, null); 
  64.  
  65. /// <summary> 
  66. /// 獲取Hash后的字節數組 
  67. /// </summary> 
  68. /// <param name="type">哈希類型</param> 
  69. /// <param name="key">key</param> 
  70. /// <param name="bytes">原字節數組</param> 
  71. /// <returns></returns
  72. public static byte[] GetHashedBytes(HashType type, byte[] bytes, byte[]? key
  73.     Guard.NotNull(bytes, nameof(bytes)); 
  74.     if (bytes.Length == 0) 
  75.     { 
  76.         return bytes; 
  77.     } 
  78.  
  79.     HashAlgorithm algorithm = null!; 
  80.     try 
  81.     { 
  82.         if (key == null
  83.         { 
  84.             algorithm = type switch 
  85.             { 
  86.                     HashType.SHA1 => new SHA1Managed(), 
  87.                     HashType.SHA256 => new SHA256Managed(), 
  88.                     HashType.SHA384 => new SHA384Managed(), 
  89.                     HashType.SHA512 => new SHA512Managed(), 
  90.                     _ => MD5.Create() 
  91.             }; 
  92.         } 
  93.         else 
  94.         { 
  95.             algorithm = type switch 
  96.             { 
  97.                     HashType.SHA1 => new HMACSHA1(key), 
  98.                     HashType.SHA256 => new HMACSHA256(key), 
  99.                     HashType.SHA384 => new HMACSHA384(key), 
  100.                     HashType.SHA512 => new HMACSHA512(key), 
  101.                     _ => new HMACMD5(key
  102.             }; 
  103.         } 
  104.         return algorithm.ComputeHash(bytes); 
  105.     } 
  106.     finally 
  107.     { 
  108.         algorithm.Dispose(); 
  109.     } 

使用示例如下:

  1. HashHelper.GetHashedBytes(HashType.MD5, "test"); 
  2. HashHelper.GetHashedBytes(HashType.MD5, "test".GetBytes()); 
  3. HashHelper.GetHashedBytes(HashType.MD5, "test""testKey"); 
  4. HashHelper.GetHashedBytes(HashType.MD5, "test".GetBytes(), "testKey".GetBytes()); 
  5.  
  6. HashHelper.GetHashedString(HashType.MD5, "test"); 
  7. HashHelper.GetHashedString(HashType.SHA1, "test".GetBytes()); 
  8. HashHelper.GetHashedString(HashType.SHA256, "test""testKey"); 
  9. HashHelper.GetHashedString(HashType.MD5, "test".GetBytes(), "testKey".GetBytes()); 

New API Sample

有了新的 API 以后可以怎么簡化呢,來看下面的示例:

  1. var bytes = "test".GetBytes(); 
  2. var keyBytes = "test-key".GetBytes(); 
  3.  
  4. // HMACMD5 
  5. var hmd5V1 = HMACMD5.HashData(keyBytes, bytes); 
  6. var hmd5V2 = HashHelper.GetHashedBytes(HashType.MD5, bytes, keyBytes); 
  7. Console.WriteLine(hmd5V2.SequenceEqual(hmd5V1)); 
  8.  
  9. // HMACSHA1 
  10. var hsha1V1 = HMACSHA1.HashData(keyBytes, bytes); 
  11. var hsha1V2 = HashHelper.GetHashedBytes(HashType.SHA1, bytes, keyBytes); 
  12. Console.WriteLine(hsha1V2.SequenceEqual(hsha1V1)); 
  13.  
  14. // HMACSHA256 
  15. var hsha256V1 = HMACSHA256.HashData(keyBytes, bytes); 
  16. var hsha256V2 = HashHelper.GetHashedBytes(HashType.SHA256, bytes, keyBytes); 
  17. Console.WriteLine(hsha256V2.SequenceEqual(hsha256V1)); 
  18.  
  19. // HMACSHA384 
  20. var hsha384V1 = HMACSHA384.HashData(keyBytes ,bytes); 
  21. var hsha384V2 = HashHelper.GetHashedBytes(HashType.SHA384, bytes, keyBytes); 
  22. Console.WriteLine(hsha384V2.SequenceEqual(hsha384V1)); 
  23.  
  24. // HMACSHA512 
  25. var hsha512V1 = HMACSHA512.HashData(keyBytes ,bytes); 
  26. var hsha512V2 = HashHelper.GetHashedBytes(HashType.SHA512, bytes, keyBytes); 
  27. Console.WriteLine(hsha512V2.SequenceEqual(hsha512V1)); 

直接使用對應的 HMAC 哈希算法的 HashData 方法即可,傳入對應的 key 和 原始內容就可以了,上面是和我們 HashHelper 封裝的方法進行對比,看結果是否一致,都是一致的,輸出結果如下:

More

對于普通的哈希算法,微軟其實在 .NET 5 就已經支持了上面的用法,可以嘗試一下下面的代碼:

  1. var bytes = "test".GetBytes(); 
  2.  
  3. // MD5 
  4. var md5V1 = MD5.HashData(bytes); 
  5. var md5V2 = HashHelper.GetHashedBytes(HashType.MD5, bytes); 
  6. Console.WriteLine(md5V2.SequenceEqual(md5V1)); 
  7.  
  8. // SHA1 
  9. var sha1V1 = SHA1.HashData(bytes); 
  10. var sha1V2 = HashHelper.GetHashedBytes(HashType.SHA1, bytes); 
  11. Console.WriteLine(sha1V2.SequenceEqual(sha1V1)); 
  12.  
  13. // SHA256 
  14. var sha256V1 = SHA256.HashData(bytes); 
  15. var sha256V2 = HashHelper.GetHashedBytes(HashType.SHA256, bytes); 
  16. Console.WriteLine(sha256V2.SequenceEqual(sha256V1)); 
  17.  
  18. // SHA384 
  19. var sha384V1 = SHA384.HashData(bytes); 
  20. var sha384V2 = HashHelper.GetHashedBytes(HashType.SHA384, bytes); 
  21. Console.WriteLine(sha384V2.SequenceEqual(sha384V1)); 
  22.  
  23. // SHA512 
  24. var sha512V1 = SHA512.HashData(bytes); 
  25. var sha512V2 = HashHelper.GetHashedBytes(HashType.SHA512, bytes); 
  26. Console.WriteLine(sha512V2.SequenceEqual(sha512V1)); 

很多時候我們可能都會要使用 MD5 或者 SHA1 之后的字符串,不知道為什么微軟沒有直接獲取一個字符串的方法,如果有這樣一個方法,就會更方便了,相比之后,感覺還是自己封裝的 HashHelper 使用起來更舒服一些,哈哈,這樣的靜態方法不夠抽象如果要動態替換哈希算法代碼可能就有點...

References

 

  • https://github.com/dotnet/runtime/pull/53487
  • https://github.com/dotnet/runtime/issues/40012
  • https://github.com/dotnet/core/issues/6569#issuecomment-913876347
  • https://baike.baidu.com/item/hmac/7307543?fr=aladdin
  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/HashSample/Program.cs
  • https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Helpers/HashHelper.cs

 

責任編輯:武曉燕 來源: amazingdotnet
相關推薦

2009-08-04 10:57:44

ASP.NET數據加密哈希算法

2009-07-10 09:41:08

WCF服務配置.NET 4.0

2021-09-23 14:55:57

.NETHTTP服務器

2009-08-20 17:17:02

C#哈希表

2010-07-16 13:10:36

Perl哈希表

2025-08-14 07:59:30

2024-03-25 03:00:00

.NET 6await編程

2020-12-10 08:00:00

開發.NET工具

2009-07-30 08:49:58

ASP.NET中usi

2009-07-29 16:53:52

ASP.NET Get

2019-06-26 10:34:05

數據科學工具數據集

2025-01-15 00:01:00

開發應用界面

2010-01-18 09:37:39

JSF 2.0Java EE 6

2022-06-09 10:42:47

GoJSON

2025-09-08 07:25:16

2023-05-08 15:33:22

2016-09-20 23:44:43

2024-07-02 08:45:08

2024-12-30 12:00:00

.NET Core依賴注入屬性注入

2009-09-07 18:53:46

static關鍵字
點贊
收藏

51CTO技術棧公眾號

台湾佬成人网| 一区二区三区在线免费播放| 成人看片免费| 欧美精品 - 色网| 精品国产网站地址| 国产乱子轮精品视频| 在线观看免费黄视频| 男人插女人下面免费视频| 亚洲毛片在线观看| 久久只有精品| 黄黄的网站在线观看| 久久综合在线观看| 久久久免费精品| 久久久久久99精品| 精品视频国内| 4438国产精品一区二区| 日韩欧美在线观看强乱免费| 欧美日韩亚州综合| 亚洲无吗在线| 日本v片在线免费观看| 久久久久久久片| 久久艹在线视频| 久久综合久久综合久久| 国产精品伦一区二区| 成年人视频软件| 91久久精品国产91久久性色| 亚洲综合清纯丝袜自拍| 日韩电影一区| 亚洲av成人无码久久精品老人| 欧美成人xxxxx| 久久在线免费观看视频| 国产日韩欧美综合一区| 一区二区三区国产好| 精品无码人妻一区二区三区| 国产日韩久久| 91豆麻精品91久久久久久| 免费毛片在线不卡| 国产精品自产拍| 久久久久久久久久伊人| 精品欧美乱码久久久久久 | 国产白袜脚足j棉袜在线观看| 欧美伦理91i| 国产精品嫩草99a| 欧美在线导航| 亚洲h视频在线观看| 免费精品99久久国产综合精品应用| 久久久人成影片一区二区三区观看 | 这里只有精品久久| 久久综合狠狠综合久久综合88| 国产精品美女久久久久人| 怡红院男人天堂| 国产成人精品无码播放| 欧美在线免费观看| 色噜噜狠狠色综合中国| 性欧美xxxx大乳国产app| 日韩av影片| 免费在线观看国产精品| 狠狠干视频网站| 欧美另类69精品久久久久9999| 中文字幕av资源一区| 色狮一区二区三区四区视频| av免费观看一区二区| 蜜桃av免费在线观看| 亚洲精品国产一区| 日韩中文有码在线视频| 一区二区三区欧美日韩| 亚洲激情综合| 三上悠亚激情av一区二区三区 | 欧美美乳视频| 老司机精品视频在线观看6| a级黄色片免费看| 人妻精品无码一区二区三区 | 黄色录像一级片| 福利在线一区二区| 日韩男女性生活视频| 欧美色爱综合网| 国产不卡一区视频| 香蕉久久夜色精品国产使用方法| 国产免费视频在线| 加勒比婷婷色综合久久| 日本激情视频在线| 99蜜桃在线观看免费视频网站| 日韩电影中文字幕在线观看| 国产精品私人影院| 国产精品s色| 日韩成人高清| 黑人操亚洲女人| 午夜三级在线观看| caopor在线视频| 国产视色精品亚洲一区二区| 中文字幕亚洲欧美日韩在线不卡 | 成人国产一区二区| 久久精品视频导航| 欧美在线视频不卡| 91免费国产在线观看| 国产一区日韩一区| 欧美2区3区4区| 亚洲免费视频一区二区三区| 中文字幕在线欧美| www.超碰97| 国产av天堂无码一区二区三区| 亚洲va电影大全| 久久黄色av网站| 日韩一区二区三区在线视频| 中文字幕在线一区| 韩国理伦片一区二区三区在线播放| 性欧美lx╳lx╳| 不卡一二三区| 岛国在线视频| 国产精品久久久久久久免费| 人妻互换一区二区激情偷拍| 天天干天天草天天| 日韩人妻一区二区三区蜜桃视频| 97av自拍| 欧美在线激情视频| 中文字幕免费精品一区高清| 91精品国产乱| 午夜电影一区二区| 欧美激情综合在线| 国产精品1区2区3区| 亚洲欧洲日本mm| 亚洲美女15p| av日韩一区| 松下纱荣子在线观看| 黄色电影免费在线看| 国产日韩一级片| 羞羞影院体验区| 一级特黄曰皮片视频| 国产伦精品一区二区三区妓女下载| 国内少妇毛片视频| 日韩啊v在线| 国产精品免费一区二区三区观看| 欧美亚洲国产日韩2020| 久久伊人精品天天| 一本一本久久a久久精品综合小说| 91精品国产品国语在线不卡| 色八戒一区二区三区| 亚洲综合色区另类av| 中文字幕一区二区日韩精品绯色| 92精品国产成人观看免费| 美女精品自拍一二三四| 制服诱惑一区二区| 欧美在线首页| 97国产成人高清在线观看| 美日韩中文字幕| 精品在线网站观看| 国产精品国产三级在线观看| 成人激情视屏| 久久r热视频| 久久人体大尺度| 午夜影院在线播放| www.成人爱| 欧美精品高清| a∨色狠狠一区二区三区| 电影亚洲精品噜噜在线观看| 成人欧美大片| 亚洲人免费短视频| 精品国产黄a∨片高清在线| av免费在线一区| 日韩欧美三区| 国产一区 二区| 欧美亚洲色图校园春色| 日韩a级大片| 精品一区不卡| 亚洲综合五月| 日韩一区二区免费看| 国产亚洲激情| 久久精品99国产精品| 国产在线精品免费| 成人av在线播放网站| 久久久久亚洲综合| 亚洲天堂2016| 日韩欧美国产视频| 欧美一区二区黄| 国产亚洲精品高潮| 九九九久久国产免费| 日本三级韩国三级久久| 成人有码在线视频| 欧美伦理一区二区| a级网站在线观看| 欧美精品一区二区三区免费播放| 国产亚洲视频一区| www.久久国产| 免费网站观看www在线观| 青青视频在线免费观看| 亚洲产国偷v产偷v自拍涩爱| 国产免费a∨片在线观看不卡| 成人在线免费观看黄色| 国产视频一区二区在线播放| 亚洲三级精品| 亚洲综合社区| 91视频xxxx| 亚洲成av人影院| 欧美一区二区三区视频免费| 五月婷婷综合激情| 欧美va亚洲va在线观看蝴蝶网| 日韩在线观看免费全| 国产成人午夜视频网址| 久久福利电影| 波多野结衣50连登视频| 超碰97人人干| 黄色大片网站在线观看| 日韩毛片在线一区二区毛片| 蜜桃视频在线观看播放| 婷婷亚洲精品| 日韩av在线发布| 国产精品成人网| 欧美偷拍一区二区| 久久精品国产91精品亚洲| 亚洲在线观看视频| 精品人妻人人做人人爽| 亚洲黄色小说在线观看| 日本一级淫片免费放| 头脑特工队2在线播放| 亚洲天堂一区二区| 成人国产精品一级毛片视频| 久久99热这里只有精品| 亚洲午夜在线观看视频在线| 亚洲国产精品久久91精品| 日本精品视频网站| 亚洲午夜精品久久| 娇妻高潮浓精白浆xxⅹ| 国产精品sm调教免费专区| a级影片在线| 台湾色综合娱乐中文网| 麻豆精品在线观看| 无码av中文一区二区三区桃花岛| 亚洲人在线视频| av一区二区三区免费| 成年人黄色片视频| 国产一级中文字幕| aaa在线观看| 亚洲精品国模| 成人av网站大全| 91精品婷婷国产综合久久竹菊| 97视频国产在线| 精品人妻人人做人人爽| 日韩在线一卡二卡| 免费动漫网站在线观看| 911亚洲精品| 国产一区二区影院| 精品视频一区二区不卡| 欧美在线视频播放| 99在线精品免费视频| 久久一区二区三| 青草在线视频| 欧美天堂亚洲电影院在线观看| 中文av字幕一区| 最新国产成人av网站网址麻豆| 精品国产二区在线| 免费在线观看成年人视频| 欧美自拍偷拍第一页| 久久成人福利| 99久久精品免费看| 日韩av在线直播| 欧美日韩国产三区| 国产18无套直看片| 91美女视频在线| 综合精品一区| 精品成人av一区| 欧美综合激情网| 69久久久久久| 性欧美一区二区三区| 国产精品中文字幕制服诱惑| 99国产精品国产精品毛片| 亚洲日韩欧美视频| 国产又粗又爽又黄的视频| 农村黄色一级片| 亚洲美女久久精品| 三级久久三级久久| 91精品国产乱| 欧美天堂亚洲电影院在线播放| 国产欧美日韩视频| 国产免费一区二区三区最新6| 日本免费不卡| 欧美激情综合色综合啪啪| 欧美日韩精品在线观看| 亚洲xxxxx性| 亚洲av无码一区二区二三区| yes4444视频在线观看| 亚洲区国产区| 日韩欧美另类在线| 日本精品一区二区三区视频 | 在线播放av中文字幕| 日本一卡二卡四卡精品| 中文字幕一区二区三三| 在线一区二区三区四区| 国产日韩一区二区| 欧美日韩午夜视频| 图片一区二区| 国产精品美女一区二区三区 | 欧美91大片| 5858s免费视频成人| 日日夜夜精品网站| chinese国产精品| 秋霞蜜臀av久久电影网免费| 一区二区成人在线视频| 91亚洲精华国产精华| 国产7777777| 免费一区二区三区四区| 国产精品久久久久一区| 国产99久久精品一区二区永久免费| 国产女人18毛片水真多18 | 亚洲三区在线观看无套内射| 欧美私人啪啪vps| 亚洲第一福利网| 国产91在线免费| 亚洲欧美日本在线观看| 久久av一区| 中文国产亚洲喷潮| 在线观看免费av网址| 97超碰资源站在线观看| 成人午夜免费av| 国产aⅴ夜夜欢一区二区三区| 少妇久久久久久久久久| 国产精品美女午夜爽爽| 一区二区日韩av| 欧美精品v日韩精品v国产精品| 国产字幕在线观看| 欧美一区高清| 亚洲欧美国产精品久久久久久久 | 青青草影院在线观看| 黄色三级网站在线观看| 日韩国产精品久久| 欧美激情a∨在线视频播放| 加勒比一区二区| www一区二区三区| 狠狠综合久久av一区二区小说| 自拍视频一区二区三区| 天天躁日日躁狠狠躁喷水| 美女脱光内衣内裤视频久久影院| 久久久亚洲成人| 伊人久久久久久久久久久久久久| 亚洲国产欧美在线观看| 欧美三级在线看| 欧美 日韩精品| 日本电影在线观看| 国产清纯白嫩初高生在线观看91 | 亚州欧美日韩中文视频| 成年人一级黄色片| 国产精品国产一区| 在线视频中文亚洲| 成年人网站免费看| 伊人久久大香线蕉av不卡| 精品国内片67194| 亚洲成人精品在线播放| 国产精品美女久久久久| 欧美日韩国产首页| 亚洲xxx在线观看| 外国成人毛片| 日韩三级免费观看| av免费观看不卡| 欧美大片网址| 亚洲国产精品va在线看黑人| av网页在线观看| 米奇777超碰欧美日韩亚洲| 亚洲人成在线播放| 亚洲综合色一区| 欧美在线电影| 欧美成人午夜影院| 午夜影院在线看| 欧美顶级毛片在线播放| 亚洲欧美日韩精品久久亚洲区 | 日韩美女一区二区三区| 无码国产精品一区二区高潮| av毛片精品| 亚洲天堂av在线播放| 情侣偷拍对白清晰饥渴难耐| 国产综合亚洲精品一区二| 91tv亚洲精品香蕉国产一区7ujn| 亚洲 欧美 日韩 综合| 日本视频一区二区| 国产精品三区四区| 成人免费高清在线播放| 性久久久久久久久久久久| 国产高清视频网站| 亚洲网一区二区三区| 国产一区av在线| 久久久久久久黄色片| 国模无码大尺度一区二区三区| 国产精品国产精品国产专区蜜臀ah | 少妇视频一区二区| 国产精品夜夜夜| 99在线观看| 麻豆视频在线观看免费网站| 精品久久久久久国产91| 男女污污视频网站| 日本一本不卡| 欧美在线视频在线播放完整版免费观看| 这里只有精品国产| 97se亚洲国产综合自在线| 成品人视频ww入口| 亚洲精品观看| 欧美乱妇40p| 国产v片在线观看| 亚洲免费观看在线视频| 成年网站免费在线观看| 日韩电影免费网址| 国产精品久久久久久久av大片| 成年人在线视频免费观看|