国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Springboot 配置文件、隱私數(shù)據(jù)脫敏實(shí)踐

開發(fā) 架構(gòu)
如果對(duì)脫敏概念不熟悉,可以看一下我之前寫過的一篇大廠也在用的6種數(shù)據(jù)脫敏方案,里邊對(duì)脫敏做了簡單的描述,接下來分享工作中兩個(gè)比較常見的脫敏場景。

[[414887]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序員內(nèi)點(diǎn)事」,作者程序員內(nèi)點(diǎn)事。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員內(nèi)點(diǎn)事公眾號(hào)。

大家好!我是小富~

這幾天公司在排查內(nèi)部數(shù)據(jù)賬號(hào)泄漏,原因是發(fā)現(xiàn)某些實(shí)習(xí)生小可愛居然連帶著賬號(hào)、密碼將源碼私傳到GitHub上,導(dǎo)致核心數(shù)據(jù)外漏,孩子還是沒挨過社會(huì)毒打,這種事的后果可大可小。

說起這個(gè)我是比較有感觸的,之前我TM被刪庫的經(jīng)歷,到現(xiàn)在想起來心里還難受,我也是把數(shù)據(jù)庫賬號(hào)明文密碼誤提交到GitHub,然后被哪個(gè)大寶貝給我測試庫刪了,后邊我長記性了把配置文件內(nèi)容都加密了,數(shù)據(jù)安全問題真的不容小覷,不管工作匯還是生活,敏感數(shù)據(jù)一定要做脫敏處理。

如果對(duì)脫敏概念不熟悉,可以看一下我之前寫過的一篇大廠也在用的6種數(shù)據(jù)脫敏方案,里邊對(duì)脫敏做了簡單的描述,接下來分享工作中兩個(gè)比較常見的脫敏場景。

配置脫敏

實(shí)現(xiàn)配置的脫敏我使用了Java的一個(gè)加解密工具Jasypt,它提供了單密鑰對(duì)稱加密和非對(duì)稱加密兩種脫敏方式。

單密鑰對(duì)稱加密:一個(gè)密鑰加鹽,可以同時(shí)用作內(nèi)容的加密和解密依據(jù);

非對(duì)稱加密:使用公鑰和私鑰兩個(gè)密鑰,才可以對(duì)內(nèi)容加密和解密;

以上兩種加密方式使用都非常簡單,咱們以springboot集成單密鑰對(duì)稱加密方式做示例。

  1. <!--配置文件加密--> 
  2. <dependency> 
  3.     <groupId>com.github.ulisesbocchio</groupId> 
  4.     <artifactId>jasypt-spring-boot-starter</artifactId> 
  5.     <version>2.1.0</version> 
  6. </dependency> 

配置文件加入秘鑰配置項(xiàng)jasypt.encryptor.password,并將需要脫敏的value值替換成預(yù)先經(jīng)過加密的內(nèi)容ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)。

這個(gè)格式我們是可以隨意定義的,比如想要abc[mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l]格式,只要配置前綴和后綴即可。

  1. jasypt: 
  2.   encryptor: 
  3.     property: 
  4.       prefix: "abc[" 
  5.       suffix: "]" 

ENC(XXX)格式主要為了便于識(shí)別該值是否需要解密,如不按照該格式配置,在加載配置項(xiàng)的時(shí)候jasypt將保持原值,不進(jìn)行解密。

  1. spring: 
  2.   datasource: 
  3.     url: jdbc:mysql://1.2.3.4:3306/xiaofu?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&ze oDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai 
  4.     username: xiaofu 
  5.     password: ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l) 
  6.  
  7. # 秘鑰 
  8. jasypt: 
  9.   encryptor: 
  10.     password: 程序員內(nèi)點(diǎn)事(然而不支持中文) 

秘鑰是個(gè)安全性要求比較高的屬性,所以一般不建議直接放在項(xiàng)目內(nèi),可以通過啟動(dòng)時(shí)-D參數(shù)注入,或者放在配置中心,避免泄露。

  1. java -jar -Djasypt.encryptor.password=1123  springboot-jasypt-2.3.3.RELEASE.jar 

預(yù)先生成的加密值,可以通過代碼內(nèi)調(diào)用API生成

  1. @Autowired 
  2. private StringEncryptor stringEncryptor; 
  3.  
  4. public void encrypt(String content) { 
  5.     String encryptStr = stringEncryptor.encrypt(content); 
  6.     System.out.println("加密后的內(nèi)容:" + encryptStr); 

或者通過如下Java命令生成,幾個(gè)參數(shù)D:\maven_lib\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar為jasypt核心jar包,input待加密文本,password秘鑰,algorithm為使用的加密算法。

  1. java -cp  D:\maven_lib\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=xiaofu  algorithm=PBEWithMD5AndDES 

一頓操作后如果還能正常啟動(dòng),說明配置文件脫敏就沒問題了。

敏感字段脫敏

生產(chǎn)環(huán)境用戶的隱私數(shù)據(jù),比如手機(jī)號(hào)、身份證或者一些賬號(hào)配置等信息,入庫時(shí)都要進(jìn)行不落地脫敏,也就是在進(jìn)入我們系統(tǒng)時(shí)就要實(shí)時(shí)的脫敏處理。

用戶數(shù)據(jù)進(jìn)入系統(tǒng),脫敏處理后持久化到數(shù)據(jù)庫,用戶查詢數(shù)據(jù)時(shí)還要進(jìn)行反向解密。這種場景一般需要全局處理,那么用AOP切面來實(shí)現(xiàn)在適合不過了。

首先自定義兩個(gè)注解@EncryptField、@EncryptMethod分別用在字段屬性和方法上,實(shí)現(xiàn)思路很簡單,只要方法上應(yīng)用到@EncryptMethod注解,則檢查入?yún)⒆侄问欠駱?biāo)注@EncryptField注解,有則將對(duì)應(yīng)字段內(nèi)容加密。

  1. @Documented 
  2. @Target({ElementType.FIELD,ElementType.PARAMETER}) 
  3. @Retention(RetentionPolicy.RUNTIME) 
  4. public @interface EncryptField { 
  5.  
  6.     String[] value() default ""
  1. @Documented 
  2. @Target({ElementType.METHOD}) 
  3. @Retention(RetentionPolicy.RUNTIME) 
  4. public @interface EncryptMethod { 
  5.  
  6.     String type() default ENCRYPT; 

切面的實(shí)現(xiàn)也比較簡單,對(duì)入?yún)⒓用埽祷亟Y(jié)果解密。為了方便閱讀這里就只貼出部分代碼,完整案例Github地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasypt

  1. @Slf4j 
  2. @Aspect 
  3. @Component 
  4. public class EncryptHandler { 
  5.  
  6.     @Autowired 
  7.     private StringEncryptor stringEncryptor; 
  8.  
  9.     @Pointcut("@annotation(com.xiaofu.annotation.EncryptMethod)"
  10.     public void pointCut() { 
  11.     } 
  12.  
  13.     @Around("pointCut()"
  14.     public Object around(ProceedingJoinPoint joinPoint) { 
  15.         /** 
  16.          * 加密 
  17.          */ 
  18.         encrypt(joinPoint); 
  19.         /** 
  20.          * 解密 
  21.          */ 
  22.         Object decrypt = decrypt(joinPoint); 
  23.         return decrypt; 
  24.     } 
  25.  
  26.     public void encrypt(ProceedingJoinPoint joinPoint) { 
  27.  
  28.         try { 
  29.             Object[] objects = joinPoint.getArgs(); 
  30.             if (objects.length != 0) { 
  31.                 for (Object o : objects) { 
  32.                     if (o instanceof String) { 
  33.                         encryptValue(o); 
  34.                     } else { 
  35.                         handler(o, ENCRYPT); 
  36.                     } 
  37.                     //TODO 其余類型自己看實(shí)際情況加 
  38.                 } 
  39.             } 
  40.         } catch (IllegalAccessException e) { 
  41.             e.printStackTrace(); 
  42.         } 
  43.     } 
  44.  
  45.     public Object decrypt(ProceedingJoinPoint joinPoint) { 
  46.         Object result = null
  47.         try { 
  48.             Object obj = joinPoint.proceed(); 
  49.             if (obj != null) { 
  50.                 if (obj instanceof String) { 
  51.                     decryptValue(obj); 
  52.                 } else { 
  53.                     result = handler(obj, DECRYPT); 
  54.                 } 
  55.                 //TODO 其余類型自己看實(shí)際情況加 
  56.             } 
  57.         } catch (Throwable e) { 
  58.             e.printStackTrace(); 
  59.         } 
  60.         return result; 
  61.     } 
  62.     。。。 

緊接著測試一下切面注解的效果,我們對(duì)字段mobile、address加上注解@EncryptField做脫敏處理。

  1. @EncryptMethod 
  2. @PostMapping(value = "test"
  3. @ResponseBody 
  4. public Object testEncrypt(@RequestBody UserVo user, @EncryptField String name) { 
  5.  
  6.     return insertUser(username); 
  7.  
  8. private UserVo insertUser(UserVo user, String name) { 
  9.     System.out.println("加密后的數(shù)據(jù):user" + JSON.toJSONString(user)); 
  10.     return user
  11.  
  12. @Data 
  13. public class UserVo implements Serializable { 
  14.  
  15.     private Long userId; 
  16.  
  17.     @EncryptField 
  18.     private String mobile; 
  19.  
  20.     @EncryptField 
  21.     private String address; 
  22.  
  23.     private String age; 

請(qǐng)求這個(gè)接口,看到參數(shù)被成功加密,而返回給用戶的數(shù)據(jù)依然是脫敏前的數(shù)據(jù),符合我們的預(yù)期,那到這簡單的脫敏實(shí)現(xiàn)就完事了。

知其然知其所以然

Jasypt工具雖然簡單好用,但作為程序員我們不能僅滿足于熟練使用,底層實(shí)現(xiàn)原理還是有必要了解下的,這對(duì)后續(xù)調(diào)試bug、二次開發(fā)擴(kuò)展功能很重要。

個(gè)人認(rèn)為Jasypt配置文件脫敏的原理很簡單,無非就是在具體使用配置信息之前,先攔截獲取配置的操作,將對(duì)應(yīng)的加密配置解密后再使用。

具體是不是如此我們簡單看下源碼的實(shí)現(xiàn),既然是以springboot方式集成,那么就先從jasypt-spring-boot-starter源碼開始入手。

starter代碼很少,主要的工作就是通過SPI機(jī)制注冊(cè)服務(wù)和@Import注解來注入需前置處理的類JasyptSpringBootAutoConfiguration。

在前置加載類EnableEncryptablePropertiesConfiguration中注冊(cè)了一個(gè)核心處理類EnableEncryptablePropertiesBeanFactoryPostProcessor。

它的構(gòu)造器有兩個(gè)參數(shù),ConfigurableEnvironment用來獲取所有配屬信息,EncryptablePropertySourceConverter對(duì)配置信息做解析處理。

順藤摸瓜發(fā)現(xiàn)具體負(fù)責(zé)解密的處理類EncryptablePropertySourceWrapper,它通過對(duì)Spring屬性管理類PropertySource做拓展,重寫了getProperty(String name)方法,在獲取配置時(shí),凡是指定格式如ENC(x) 包裹的值全部解密處理。

既然知道了原理那么后續(xù)我們二次開發(fā),比如:切換加密算法或者實(shí)現(xiàn)自己的脫敏工具就容易的多了。

案例Github地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasypt

PBE算法

再來聊一下Jasypt中用的加密算法,其實(shí)它是在JDK的JCE.jar包基礎(chǔ)上做了封裝,本質(zhì)上還是用的JDK提供的算法,默認(rèn)使用的是PBE算法PBEWITHMD5ANDDES,看到這個(gè)算法命名很有意思,段個(gè)句看看,PBE、WITH、MD5、AND、DES 好像有點(diǎn)故事,繼續(xù)看。

PBE算法(Password Based Encryption,基于口令(密碼)的加密)是一種基于口令的加密算法,其特點(diǎn)在于口令是由用戶自己掌握,在加上隨機(jī)數(shù)多重加密等方法保證數(shù)據(jù)的安全性。

PBE算法本質(zhì)上并沒有真正構(gòu)建新的加密、解密算法,而是對(duì)我們已知的算法做了包裝。比如:常用的消息摘要算法MD5和SHA算法,對(duì)稱加密算法DES、RC2等,而PBE算法就是將這些算法進(jìn)行合理組合,這也呼應(yīng)上前邊算法的名字。

既然PBE算法使用我們較為常用的對(duì)稱加密算法,那就會(huì)涉及密鑰的問題。但它本身又沒有鑰的概念,只有口令密碼,密鑰則是口令經(jīng)過加密算法計(jì)算得來的。

口令本身并不會(huì)很長,所以不能用來替代密鑰,只用口令很容易通過窮舉攻擊方式破譯,這時(shí)候就得加點(diǎn)鹽了。

鹽通常會(huì)是一些隨機(jī)信息,比如隨機(jī)數(shù)、時(shí)間戳,將鹽附加在口令上,通過算法計(jì)算加大破譯的難度。

源碼里的貓膩

簡單了解PBE算法,回過頭看看Jasypt源碼是如何實(shí)現(xiàn)加解密的。

在加密的時(shí)候首先實(shí)例化秘鑰工廠SecretKeyFactory,生成八位鹽值,默認(rèn)使用的jasypt.encryptor.RandomSaltGenerator生成器。

  1. public byte[] encrypt(byte[] message) { 
  2.     // 根據(jù)指定算法,初始化秘鑰工廠 
  3.     final SecretKeyFactory factory = SecretKeyFactory.getInstance(algorithm1); 
  4.     // 鹽值生成器,只選八位 
  5.     byte[] salt = saltGenerator.generateSalt(8); 
  6.     //  
  7.     final PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations); 
  8.     // 鹽值、口令生成秘鑰 
  9.     SecretKey key = factory.generateSecret(keySpec); 
  10.  
  11.     // 構(gòu)建加密器 
  12.     final Cipher cipherEncrypt = Cipher.getInstance(algorithm1); 
  13.     cipherEncrypt.init(Cipher.ENCRYPT_MODE, key); 
  14.     // 密文頭部(鹽值) 
  15.     byte[] params = cipherEncrypt.getParameters().getEncoded(); 
  16.  
  17.     // 調(diào)用底層實(shí)現(xiàn)加密 
  18.     byte[] encryptedMessage = cipherEncrypt.doFinal(message); 
  19.  
  20.     // 組裝最終密文內(nèi)容并分配內(nèi)存(鹽值+密文) 
  21.     return ByteBuffer 
  22.             .allocate(1 + params.length + encryptedMessage.length) 
  23.             .put((byte) params.length) 
  24.             .put(params) 
  25.             .put(encryptedMessage) 
  26.             .array(); 

由于默認(rèn)使用的是隨機(jī)鹽值生成器,導(dǎo)致相同內(nèi)容每次加密后的內(nèi)容都是不同的。

那么解密時(shí)該怎么對(duì)應(yīng)上呢?

看上邊的源碼發(fā)現(xiàn),最終的加密文本是由兩部分組成的,params消息頭里邊包含口令和隨機(jī)生成的鹽值,encryptedMessage密文。

加密

而在解密時(shí)會(huì)根據(jù)密文encryptedMessage的內(nèi)容拆解出params內(nèi)容解析出鹽值和口令,在調(diào)用JDK底層算法解密出實(shí)際內(nèi)容。

  1. @Override 
  2. @SneakyThrows 
  3. public byte[] decrypt(byte[] encryptedMessage) { 
  4.     // 獲取密文頭部內(nèi)容 
  5.     int paramsLength = Byte.toUnsignedInt(encryptedMessage[0]); 
  6.     // 獲取密文內(nèi)容 
  7.     int messageLength = encryptedMessage.length - paramsLength - 1; 
  8.     byte[] params = new byte[paramsLength]; 
  9.     byte[] message = new byte[messageLength]; 
  10.     System.arraycopy(encryptedMessage, 1, params, 0, paramsLength); 
  11.     System.arraycopy(encryptedMessage, paramsLength + 1, message, 0, messageLength); 
  12.  
  13.     // 初始化秘鑰工廠 
  14.     final SecretKeyFactory factory = SecretKeyFactory.getInstance(algorithm1); 
  15.     final PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); 
  16.     SecretKey key = factory.generateSecret(keySpec); 
  17.  
  18.     // 構(gòu)建頭部鹽值口令參數(shù) 
  19.     AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance(algorithm1); 
  20.     algorithmParameters.init(params); 
  21.  
  22.     // 構(gòu)建加密器,調(diào)用底層算法 
  23.     final Cipher cipherDecrypt = Cipher.getInstance(algorithm1); 
  24.     cipherDecrypt.init( 
  25.             Cipher.DECRYPT_MODE, 
  26.             key
  27.             algorithmParameters 
  28.     ); 
  29.     return cipherDecrypt.doFinal(message); 

解密

 

責(zé)任編輯:武曉燕 來源: 程序員內(nèi)點(diǎn)事
相關(guān)推薦

2024-02-05 13:39:00

隱私數(shù)據(jù)脫敏

2016-11-22 09:40:08

2022-06-23 08:42:08

配置加密解密

2021-04-01 10:23:45

SpringBootbootstrapapplication

2011-01-13 16:27:26

Linux配置文件

2011-01-19 14:00:21

2010-12-28 16:35:32

Outlook 配置文

2022-08-17 07:06:14

SpringBoot配置@Value

2022-09-23 07:33:04

Springzookeeper配置

2010-12-27 14:59:31

Outlook 配置文

2020-06-17 09:49:03

潮數(shù)軟件

2023-10-09 09:23:10

2011-01-21 15:08:45

Sendmail

2010-05-05 16:14:09

Unix管理

2009-09-22 10:23:15

Hibernate配置

2010-08-05 14:36:07

NFS服務(wù)

2011-02-25 16:39:34

proftpd配置文件

2011-03-25 17:13:37

Nagios配置文件

2011-01-21 15:27:10

Sendmail

2009-06-17 14:10:30

Spring配置文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美无毛视频| 国模私拍视频在线播放| h网站在线播放| 最新电影电视剧在线观看免费观看| a√资源在线| 欧美影视资讯| 精品高清在线| 国产综合婷婷| 日韩av二区在线播放| 岛国av在线一区| 亚洲视频在线一区观看| 色88888久久久久久影院按摩| 日韩三区在线观看| 日韩视频免费在线观看| 欧美精品电影在线| 成人片在线免费看| www黄色日本| 日本ー区在线视频| 亚洲妇女成熟| 亚洲成人国产| 日韩av中文字幕一区二区| 国产麻豆精品视频| 国产精品天美传媒沈樵| 色综合色狠狠综合色| 日韩电影中文字幕一区| 6080yy精品一区二区三区| 国产欧美一区二区三区另类精品 | 翔田千里一区二区| 成人激情小说网站| 亚洲国产美国国产综合一区二区| 亚洲精品v天堂中文字幕| 欧美一级片免费在线| 中文字幕综合在线观看| 日本成人免费网站| av大片在线看| 加勒比色老久久爱综合网| 欧美精品偷拍| 久久日一线二线三线suv| 欧美中文字幕不卡| 亚洲视频自拍偷拍| 国产精品有限公司| 日本精品一区二区三区四区| 国产成人天天5g影院在线观看| 中文字幕在线视频网站| 一本一道久久a久久精品蜜桃| 丰满亚洲少妇av| 欧美性感一区二区三区| 日韩av色在线| 国产精品亚洲αv天堂无码| 国产午夜在线视频| 酒色婷婷桃色成人免费av网| 日韩不卡在线| 午夜欧美精品久久久久久久| 久久久国产午夜精品 | 成人毛片一区二区| 瑟瑟视频在线| 北条麻妃国产九九九精品小说| 国产sm精品调教视频网站| 欧美性色黄大片| 国产精品欧美在线| 在线观看视频黄色| 最全影音av资源中文字幕在线| 中文在线免费二区三区| 午夜久久影院| 中文字幕一区二区三中文字幕| 精品剧情v国产在线观看在线| 国产精品99导航| 国产原创中文在线观看| 大片免费在线看视频| 精品久久国产| 国产午夜精品一区二区三区嫩草 | 国产91免费观看| 免费人成自慰网站| 国产网站在线免费观看| 欧美色网址大全| 国产精品嫩草影院com| 国产精品2024| 日韩手机在线导航| 91网站在线看| 黄页网站在线播放| 久久aimee| 国产欧美精品一区aⅴ影院 | 日韩欧美一级| 91亚洲大成网污www| 欧美精品一区二区三区蜜臀| 国产伦精品一区二区三区视频免费| 在线观看成人影院| 欧美爱爱网站| 中文字幕日本不卡| 欧美激情视频一区二区三区不卡| r级无码视频在线观看| 浪潮色综合久久天堂| 国产精品影视天天线| 国产亚洲精品日韩| 久久亚洲中文字幕无码| 91精品国产一区二区在线观看 | 久久精品成人一区二区三区蜜臀 | 欧美大秀在线观看| av网站在线不卡| 亚洲精品国产精品粉嫩| 亚洲国产精品久久久久秋霞影院| 国产精品偷伦一区二区| 欧美女优在线| 日韩成人午夜精品| 这里只有精品在线播放| 国产免费视频传媒| 日韩中字在线| 91精品欧美一区二区三区综合在| 日韩区国产区| 成人激情久久| 亚洲成a人在线观看| 欧美另类一区| 久久亚洲人体| 一区二区三区国产| 精品中文字幕一区| 九九九伊在线综合永久| 国产精品久久久久久妇女6080| 成人免费福利视频| sm性调教片在线观看| 国产欧美一区二区精品性| 91精品国产综合久久香蕉| 18视频在线观看网站| 久久久久久一级片| 成人自拍爱视频| 日韩综合av| 欧美午夜精品久久久久久超碰| 熟妇熟女乱妇乱女网站| 秋霞综合在线视频| 日韩精品一区二区三区中文不卡| 亚洲无吗一区二区三区| 在线观看不卡| 午夜精品久久久久久99热软件| 成人免费黄色网页| 国产亲近乱来精品视频| 久久久99爱| 久久夜色电影| 日韩国产欧美精品在线| 最新av在线| 国产清纯在线一区二区www| 九九九九九九精品| 天天躁日日躁狠狠躁欧美| 亚洲日本成人女熟在线观看 | 鲁大师成人一区二区三区| 欧美精品在线免费播放| a毛片在线看免费观看| 亚洲一区欧美一区| 日本老熟妇毛茸茸| 国产最新精品免费| 国产一区在线观| 久久免费大视频| 2018中文字幕一区二区三区| 99欧美精品| 精品亚洲一区二区三区四区五区 | 粉嫩一区二区| 3751色影院一区二区三区| 三级视频在线播放| 香蕉乱码成人久久天堂爱免费| 成人黄网大全在线观看| 久久先锋资源网| 国产又大又硬又粗| 99re亚洲国产精品| 91大学生片黄在线观看| 激情都市一区二区| 天堂v在线视频| 奇米777欧美一区二区| 欧洲av一区| 日韩在线观看一区二区| 欧美xxxx黑人又粗又长密月| 影音先锋国产精品| 另类视频在线观看+1080p| 小嫩嫩精品导航| 制服国产精品| 国产91露脸合集magnet| 欧美二区在线视频| 国产欧美精品在线观看| caoliu在线| 福利一区视频在线观看| 337p日本欧洲亚洲大胆鲁鲁| 欧美日本在线观看| 不卡专区在线| 久久这里有精品视频| 人人网欧美视频| 亚洲直播在线一区| 国产农村妇女精品一二区| 91xxx视频| 国产精品成人一区二区三区夜夜夜 | 手机看片福利在线观看| 欧美久久久久久久久久| 神马久久午夜| 国产91精品久久久久久| 亚洲欧洲综合| 成人在线免费在线观看| 午夜精品久久久久久| 99riav视频在线观看| 2019亚洲日韩新视频| 日韩视频在线一区二区三区| 99热久久这里只有精品| 亚洲国产成人av网| 欧美三区四区| 99re热精品|