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

50行代碼,搞定敏感數據讀寫!

開發 前端
在實際的軟件系統開發過程中,由于業務的需求,在代碼層面實現數據的脫敏還是遠遠不夠的,往往還需要在數據庫層面針對某些關鍵性的敏感信息,那在實際的研發過程中,我們如何實踐呢?

一、介紹

在實際的軟件系統開發過程中,由于業務的需求,在代碼層面實現數據的脫敏還是遠遠不夠的,往往還需要在數據庫層面針對某些關鍵性的敏感信息,例如:身份證號、銀行卡號、手機號、工資等信息進行加密存儲,實現真正意義的數據混淆脫敏,以滿足信息安全的需要。

那在實際的研發過程中,我們如何實踐呢?

二、方案實踐

在此,提供三套方案以供大家選擇。

  • 通過 SQL 函數實現加解密
  • 對 SQL 進行解析攔截,實現數據加解密
  • 自定義一套脫敏工具

1. 通過 SQL 函數實現加解密

最簡單的方法,莫過于直接在數據庫層面操作,通過函數對某個字段進行加、解密,例如如下這個案例!

  1. -- 對“你好,世界”進行加密 
  2. select   HEX(AES_ENCRYPT('你好,世界','ABC123456')); 
  3.  
  4. -- 解密,輸出:你好,世界 
  5. select  AES_DECRYPT(UNHEX('A174E3C13FE16AA0FD071A4BBD7CD7C5'),'ABC123456'); 

采用MySQL內置的AES協議加、解密函數,密鑰是ABC123456,可以很輕松的對某個字段實現加、解密。

如果是很小的需求,需要加密的數據就是指定的信息,此方法可行。

但是當需要加密的表字段非常多的時候,這個使用起來就比較雞肋了,例如我想更改加密算法或者不同的部署環境配置不同的密鑰,這個時候就不得不把所有的代碼進行更改一遍。

2. 對 SQL 進行解析攔截,實現數據加解密

通過上面的方案,我們發現最大的痛點就是加密算法和密鑰都寫死在SQL上了,因此我們可以將這塊的服務從抽出來,在JDBC層面,當sql執行的時候,對其進行攔截處理。

Apache ShardingSphere 框架下的數據脫敏模塊,它就可以幫助我們實現這一需求,如果你是SpringBoot項目,可以實現無縫集成,對原系統的改造會非常少。

下面以用戶表為例,我們來看看采用ShardingSphere如何實現!

(1) 創建用戶表

  1. CREATE TABLE user ( 
  2.   id bigint(20) NOT NULL COMMENT '用戶ID', 
  3.   email varchar(255)  NOT NULL DEFAULT '' COMMENT '郵件', 
  4.   nick_name varchar(255)  DEFAULT NULL COMMENT '昵稱', 
  5.   pass_word varchar(255)  NOT NULL DEFAULT '' COMMENT '二次密碼', 
  6.   reg_time varchar(255)  NOT NULL DEFAULT '' COMMENT '注冊時間', 
  7.   user_name varchar(255)  NOT NULL DEFAULT '' COMMENT '用戶名', 
  8.   salary varchar(255) DEFAULT NULL COMMENT '基本工資', 
  9.   PRIMARY KEY (id) USING BTREE 
  10. ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

(2) 創建 springboot 項目并添加依賴包

  1. <dependencies> 
  2.     <!--spring boot核心--> 
  3.     <dependency> 
  4.         <groupId>org.springframework.boot</groupId> 
  5.         <artifactId>spring-boot-starter</artifactId> 
  6.     </dependency> 
  7.     <!--spring boot 測試--> 
  8.     <dependency> 
  9.         <groupId>org.springframework.boot</groupId> 
  10.         <artifactId>spring-boot-starter-test</artifactId> 
  11.         <scope>test</scope> 
  12.     </dependency> 
  13.     <!--springmvc web--> 
  14.     <dependency> 
  15.         <groupId>org.springframework.boot</groupId> 
  16.         <artifactId>spring-boot-starter-web</artifactId> 
  17.     </dependency> 
  18.     <!--mysql 數據源--> 
  19.     <dependency> 
  20.         <groupId>mysql</groupId> 
  21.         <artifactId>mysql-connector-java</artifactId> 
  22.     </dependency> 
  23.     <!--mybatis 支持--> 
  24.     <dependency> 
  25.         <groupId>org.mybatis.spring.boot</groupId> 
  26.         <artifactId>mybatis-spring-boot-starter</artifactId> 
  27.         <version>2.0.0</version> 
  28.     </dependency>  
  29.     <!--shardingsphere數據分片、脫敏工具--> 
  30.     <dependency> 
  31.         <groupId>org.apache.shardingsphere</groupId> 
  32.         <artifactId>sharding-jdbc-spring-boot-starter</artifactId> 
  33.         <version>4.1.0</version> 
  34.     </dependency> 
  35.     <dependency> 
  36.         <groupId>org.apache.shardingsphere</groupId> 
  37.         <artifactId>sharding-jdbc-spring-namespace</artifactId> 
  38.         <version>4.1.0</version> 
  39.     </dependency> 
  40. </dependencies> 

(3) 添加脫敏配置

在application.properties文件中,添加shardingsphere相關配置,即可實現針對某個表進行脫敏。

  1. server.port=8080 
  2.  
  3. loglogging.path=log 
  4.  
  5. #shardingsphere數據源集成 
  6. spring.shardingsphere.datasource.name=ds 
  7. spring.shardingsphere.datasource.ds.type=com.zaxxer.hikari.HikariDataSource 
  8. spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver 
  9. spring.shardingsphere.datasource.ds.jdbc-url=jdbc:mysql://127.0.0.1:3306/test 
  10. spring.shardingsphere.datasource.ds.username=xxxx 
  11. spring.shardingsphere.datasource.ds.password=xxxx 
  12.  
  13. #加密方式、密鑰配置 
  14. spring.shardingsphere.encrypt.encryptors.encryptor_aes.type=aes 
  15. spring.shardingsphere.encrypt.encryptors.encryptor_aes.props.aes.key.value=hkiqAXU6Ur5fixGHaO4Lb2V2ggausYwW 
  16. #plainColumn表示明文列,cipherColumn表示脫敏列 
  17. springspring.shardingsphere.encrypt.tables.user.columns.salary.plainColumn
  18. spring.shardingsphere.encrypt.tables.user.columns.salary.cipherColumn=salary 
  19. #springspring.shardingsphere.encrypt.tables.user.columns.pass_word.assistedQueryColumn
  20. spring.shardingsphere.encrypt.tables.user.columns.salary.encryptor=encryptor_aes 
  21.  
  22. #sql打印 
  23. spring.shardingsphere.props.sql.show=true 
  24. spring.shardingsphere.props.query.with.cipher.column=true 
  25.  
  26.  
  27. #基于xml方法的配置 
  28. mybatis.mapper-locations=classpath:mapper/*.xml 

其中下面的配置信息是關鍵的一部,spring.shardingsphere.encrypt.tables是指要脫敏的表,user是表名,salary表示user表中的真實列,其中plainColumn指的是明文列,cipherColumn指的是脫敏列,如果是新工程,只需要配置脫敏列即可!

  1. springspring.shardingsphere.encrypt.tables.user.columns.salary.plainColumn
  2. spring.shardingsphere.encrypt.tables.user.columns.salary.cipherColumn=salary 
  3. #springspring.shardingsphere.encrypt.tables.user.columns.pass_word.assistedQueryColumn
  4. spring.shardingsphere.encrypt.tables.user.columns.salary.encryptor=encryptor_aes 

(4) 編寫數據持久層

  1. <mapper namespace="com.example.shardingsphere.mapper.UserMapperXml" > 
  2.  
  3.     <resultMap id="BaseResultMap" type="com.example.shardingsphere.entity.UserEntity" > 
  4.         <id column="id" property="id" jdbcType="BIGINT" /> 
  5.         <result column="email" property="email" jdbcType="VARCHAR" /> 
  6.         <result column="nick_name" property="nickName" jdbcType="VARCHAR" /> 
  7.         <result column="pass_word" property="passWord" jdbcType="VARCHAR" /> 
  8.         <result column="reg_time" property="regTime" jdbcType="VARCHAR" /> 
  9.         <result column="user_name" property="userName" jdbcType="VARCHAR" /> 
  10.         <result column="salary" property="salary" jdbcType="VARCHAR" /> 
  11.     </resultMap> 
  12.  
  13.     <select id="findAll" resultMap="BaseResultMap"> 
  14.         SELECT * FROM user 
  15.     </select> 
  16.      
  17.     <insert id="insert" parameterType="com.example.shardingsphere.entity.UserEntity"> 
  18.         INSERT INTO user(id,email,nick_name,pass_word,reg_time,user_name, salary) 
  19.         VALUES(#{id},#{email},#{nickName},#{passWord},#{regTime},#{userName}, #{salary}) 
  20.     </insert> 
  21. </mapper> 
  1. public interface UserMapperXml { 
  2.  
  3.  
  4.     /** 
  5.      * 查詢所有的信息 
  6.      * @return 
  7.      */ 
  8.     List<UserEntity> findAll(); 
  9.  
  10.     /** 
  11.      * 新增數據 
  12.      * @param user 
  13.      */ 
  14.     void insert(UserEntity user); 
  1. public class UserEntity { 
  2.  
  3.     private Long id; 
  4.  
  5.     private String email; 
  6.  
  7.     private String nickName; 
  8.  
  9.     private String passWord; 
  10.  
  11.     private String regTime; 
  12.  
  13.     private String userName; 
  14.  
  15.     private String salary; 
  16.  
  17.  //省略set、get... 
  18.  

(5) 最后我們來測試一下程序運行情況

編寫啟用服務程序:

  1. @SpringBootApplication 
  2. @MapperScan("com.example.shardingsphere.mapper") 
  3. public class ShardingSphereApplication { 
  4.  
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(ShardingSphereApplication.class, args); 
  7.     } 

編寫單元測試:

  1. @RunWith(SpringJUnit4ClassRunner.class) 
  2. @SpringBootTest(classes = ShardingSphereApplication.class) 
  3. public class UserTest { 
  4.  
  5.     @Autowired 
  6.     private UserMapperXml userMapperXml; 
  7.  
  8.     @Test 
  9.     public void insert() throws Exception { 
  10.         UserEntity entity = new UserEntity(); 
  11.         entity.setId(3l); 
  12.         entity.setEmail("123@123.com"); 
  13.         entity.setNickName("阿三"); 
  14.         entity.setPassWord("123"); 
  15.         entity.setRegTime("2021-10-10 00:00:00"); 
  16.         entity.setUserName("張三"); 
  17.         entity.setSalary("2500"); 
  18.         userMapperXml.insert(entity); 
  19.     } 
  20.  
  21.     @Test 
  22.     public void query() throws Exception { 
  23.         List<UserEntity> dataList = userMapperXml.findAll(); 
  24.         System.out.println(JSON.toJSONString(dataList)); 
  25.     } 

插入數據后,如下圖,數據庫存儲的數據已被加密!

我們繼續來看看,運行查詢服務,結果如下圖,數據被成功解密!

采用配置方式,最大的好處就是直接通過配置脫敏列就可以完成對某些數據表字段的脫敏,非常方便。

3. 自定義一套脫敏工具

當然,有的同學可能會覺得shardingsphere配置雖然簡單,但是還是不放心,里面的很多規則自己無法掌控,想自己開發一套數據庫的脫敏工具。

方案也是有的,例如如下這套實踐方案,以Mybatis為例:

  • 首先編寫一套加解密的算法工具類
  • 通過Mybatis的typeHandler插件,實現特定字段的加解密

實踐過程如下:

(1) 加解密工具類

  1. public class AESCryptoUtil { 
  2.  
  3.     private static final Logger log = LoggerFactory.getLogger(AESCryptoUtil.class); 
  4.  
  5.     private static final String DEFAULT_ENCODING = "UTF-8"
  6.     private static final String AES = "AES"
  7.  
  8.  
  9.     /** 
  10.      * 加密 
  11.      * 
  12.      * @param content 需要加密內容 
  13.      * @param key     任意字符串 
  14.      * @return 
  15.      * @throws Exception 
  16.      */ 
  17.     public static String encryptByRandomKey(String content, String key) { 
  18.         try { 
  19.             //構造密鑰生成器,生成一個128位的隨機源,產生原始對稱密鑰 
  20.             KeyGenerator keygen = KeyGenerator.getInstance(AES); 
  21.             SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 
  22.             random.setSeed(key.getBytes()); 
  23.             keygen.init(128, random); 
  24.             byte[] raw = keygen.generateKey().getEncoded(); 
  25.             SecretKey secretKey = new SecretKeySpec(raw, AES); 
  26.             Cipher cipher = Cipher.getInstance(AES); 
  27.             cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
  28.             byte[] encrypted = cipher.doFinal(content.getBytes("utf-8")); 
  29.             return Base64.getEncoder().encodeToString(encrypted); 
  30.         } catch (Exception e) { 
  31.             log.warn("AES加密失敗,參數:{},錯誤信息:{}", content, e); 
  32.             return ""; 
  33.         } 
  34.     } 
  35.  
  36.     public static String decryptByRandomKey(String content, String key) { 
  37.         try { 
  38.             //構造密鑰生成器,生成一個128位的隨機源,產生原始對稱密鑰 
  39.             KeyGenerator generator = KeyGenerator.getInstance(AES); 
  40.             SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); 
  41.             random.setSeed(key.getBytes()); 
  42.             generator.init(128, random); 
  43.             SecretKey secretKey = new SecretKeySpec(generator.generateKey().getEncoded(), AES); 
  44.             Cipher cipher = Cipher.getInstance(AES); 
  45.             cipher.init(Cipher.DECRYPT_MODE, secretKey); 
  46.             byte[] encrypted = Base64.getDecoder().decode(content); 
  47.             byte[] original = cipher.doFinal(encrypted); 
  48.             return new String(original, DEFAULT_ENCODING); 
  49.         } catch (Exception e) { 
  50.             log.warn("AES解密失敗,參數:{},錯誤信息:{}", content, e); 
  51.             return ""; 
  52.         } 
  53.     } 
  54.  
  55.     public static void main(String[] args) { 
  56.         String encryptResult = encryptByRandomKey("Hello World", "123456"); 
  57.         System.out.println(encryptResult); 
  58.         String decryptResult = decryptByRandomKey(encryptResult, "123456"); 
  59.         System.out.println(decryptResult); 
  60.     } 

2.3.2、針對 salary 字段進行單獨解析

  1. <mapper namespace="com.example.shardingsphere.mapper.UserMapperXml" > 
  2.  
  3.     <resultMap id="BaseResultMap" type="com.example.shardingsphere.entity.UserEntity" > 
  4.         <id column="id" property="id" jdbcType="BIGINT" /> 
  5.         <result column="email" property="email" jdbcType="VARCHAR" /> 
  6.         <result column="nick_name" property="nickName" jdbcType="VARCHAR" /> 
  7.         <result column="pass_word" property="passWord" jdbcType="VARCHAR" /> 
  8.         <result column="reg_time" property="regTime" jdbcType="VARCHAR" /> 
  9.         <result column="user_name" property="userName" jdbcType="VARCHAR" /> 
  10.         <result column="salary" property="salary" jdbcType="VARCHAR" 
  11.                 typeHandler="com.example.shardingsphere.handle.EncryptDataRuleTypeHandler"/> 
  12.     </resultMap> 
  13.  
  14.     <select id="findAll" resultMap="BaseResultMap"> 
  15.         select * from user 
  16.     </select> 
  17.      
  18.     <insert id="insert" parameterType="com.example.shardingsphere.entity.UserEntity"> 
  19.         INSERT INTO user(id,email,nick_name,pass_word,reg_time,user_name, salary) 
  20.         VALUES( 
  21.         #{id}, 
  22.         #{email}, 
  23.         #{nickName}, 
  24.         #{passWord}, 
  25.         #{regTime}, 
  26.         #{userName}, 
  27.         #{salary,jdbcType=INTEGER,typeHandler=com.example.shardingsphere.handle.EncryptDataRuleTypeHandler}) 
  28.     </insert> 
  29. </mapper> 

EncryptDataRuleTypeHandler解析器,內容如下:

  1. public class EncryptDataRuleTypeHandler implements TypeHandler<String> { 
  2.  
  3.     private static final String EMPTY = ""
  4.  
  5.     /** 
  6.      * 寫入數據 
  7.      * @param preparedStatement 
  8.      * @param i 
  9.      * @param data 
  10.      * @param jdbcType 
  11.      * @throws SQLException 
  12.      */ 
  13.     @Override 
  14.     public void setParameter(PreparedStatement preparedStatement, int i, String data, JdbcType jdbcType) throws SQLException { 
  15.         if (StringUtils.isEmpty(data)) { 
  16.             preparedStatement.setString(i, EMPTY); 
  17.         } else { 
  18.             preparedStatement.setString(i, AESCryptoUtil.encryptByRandomKey(data, "123456")); 
  19.         } 
  20.     } 
  21.  
  22.     /** 
  23.      * 讀取數據 
  24.      * @param resultSet 
  25.      * @param columnName 
  26.      * @return 
  27.      * @throws SQLException 
  28.      */ 
  29.     @Override 
  30.     public String getResult(ResultSet resultSet, String columnName) throws SQLException { 
  31.         return decrypt(resultSet.getString(columnName)); 
  32.     } 
  33.  
  34.     /** 
  35.      * 讀取數據 
  36.      * @param resultSet 
  37.      * @param columnIndex 
  38.      * @return 
  39.      * @throws SQLException 
  40.      */ 
  41.     @Override 
  42.     public String getResult(ResultSet resultSet, int columnIndex) throws SQLException { 
  43.         return decrypt(resultSet.getString(columnIndex)); 
  44.     } 
  45.  
  46.     /** 
  47.      * 讀取數據 
  48.      * @param callableStatement 
  49.      * @param columnIndex 
  50.      * @return 
  51.      * @throws SQLException 
  52.      */ 
  53.     @Override 
  54.     public String getResult(CallableStatement callableStatement, int columnIndex) throws SQLException { 
  55.         return decrypt(callableStatement.getString(columnIndex)); 
  56.     } 
  57.  
  58.     /** 
  59.      * 對數據進行解密 
  60.      * @param data 
  61.      * @return 
  62.      */ 
  63.     private String decrypt(String data) { 
  64.         return AESCryptoUtil.decryptByRandomKey(data, "123456"); 
  65.     } 

(3) 單元測試

再次運行單元測試,程序讀寫正常!

 

通過如下的方式,也可以實現對數據表中某個特定字段進行數據脫敏處理!

三、小結

因業務的需求,當需要對某些數據表字段進行脫敏處理的時候,有個細節很容易遺漏,那就是字典類型,例如salary字段,根據常規,很容易想到使用數字類型,但是卻不是,要知道加密之后的數據都是一串亂碼,數字類型肯定是無法存儲字符串的,因此在定義的時候,這個要留心一下。

其次,很多同學可能會覺得,這個也不能防范比人竊取數據啊!

如果加密使用的密鑰和數據都在一個項目里面,答案是肯定的,你可以隨便解析任何人的數據。因此在實際的處理上,這個更多的是在流程上做變化。例如如下方式:

  • 首先,加密采用的密鑰會在另外一個單獨的服務來存儲管理,保證密鑰不輕易泄露出去,最重要的是加密的數據不輕易被別人解密。
  • 其次,例如某些人想要訪問誰的工資條數據,那么就需要做二次密碼確認,也就是輸入自己的密碼才能獲取,可以進一步防止研發人員隨意通過接口方式讀取數據。
  • 最后就是,杜絕代碼留漏洞。

以上三套方案,都可以幫助大家實現數據庫字段數據的脫敏,希望能幫助到大家,謝謝欣賞!

 

 

責任編輯:趙寧寧 來源: Java極客技術
相關推薦

2010-09-25 08:55:29

2023-10-23 10:39:05

2020-10-25 09:04:46

數據加密數據泄露攻擊

2023-06-27 07:26:36

汽車之家敏感數據治理

2023-10-30 15:35:05

數據安全數據驅動

2021-09-16 10:11:15

Dataphin 數據保護

2024-03-05 09:40:35

2020-04-16 08:00:00

Ansible Vau敏感數據加密

2011-08-01 14:36:06

加密RSA

2012-04-12 14:45:12

賽門鐵克云南電網

2024-01-01 15:53:25

2020-12-20 17:30:17

數據匿名化敏感數據數據庫

2025-09-28 07:10:00

GenAI敏感數據安全

2025-01-21 14:48:39

2012-07-03 11:35:02

數據安全

2013-09-12 13:23:06

2023-07-21 12:48:37

2021-09-18 10:06:06

數據安全隱私計算大數據

2018-09-14 14:48:01

2023-06-06 08:51:06

點贊
收藏

51CTO技術棧公眾號

色阁综合伊人av| 午夜电影网亚洲视频| 国产精品一区二区3区| 成人欧美一区二区三区黑人一| 日韩一级特黄| 午夜国产精品一区| 一区二区三区在线视频看| 丰满少妇被猛烈进入| 久久综合九色综合欧美狠狠| 九九热99久久久国产盗摄| 青青草视频网站| 日韩美香港a一级毛片| 午夜亚洲国产au精品一区二区| 日本一区精品| 人妻与黑人一区二区三区| 丝袜美腿亚洲一区二区图片| 欧美成人免费va影院高清| 青青草成人免费视频| 电影中文字幕一区二区| 色婷婷av一区二区| 精品少妇人欧美激情在线观看| 精品久久久久一区二区三区| 国产精品一区不卡| 国产精品视频自在线| 日本一区二区三区四区五区| 婷婷久久国产对白刺激五月99| 日韩精品极品视频| xxxxwww一片| 国产aa精品| 欧美亚洲国产一区二区三区va | 亚洲激情男女视频| 日本一区二区三区www| 午夜国产在线视频| 国产不卡免费视频| 亚洲尤物视频网| 一级黄色大片免费观看| 久久精品人人| 57pao国产成人免费| 国产中文字字幕乱码无限| 99精品视频在线观看播放| 亚洲无亚洲人成网站77777| 亚洲视频 中文字幕| 免费一级欧美片在线观看网站| 欧美日韩小视频| 少妇黄色一级片| 欧洲一级精品| 日本韩国欧美国产| 欧美日韩国产精品激情在线播放| 18网站在线观看| 一区二区在线观看视频在线观看| 男同互操gay射视频在线看| 麻豆系列在线观看| 亚洲图片欧美激情| 艳母动漫在线观看| av片哪里在线观看| 一区二区三区四区不卡视频 | 亚洲成人原创| 欧美激情视频网站| 在线看成人av| 国产日韩欧美一区在线| 日本电影亚洲天堂| 无码人妻精品一区二区三区9厂| 国产手机视频一区二区| 国产www精品| 男操女视频网站| 免费在线看成人av| 成人欧美一区二区三区黑人| 国内老熟妇对白xxxxhd| 国产iv一区二区三区| 国产精品有限公司| 嫩草研究院在线观看| 国产日韩欧美精品一区| 一区二区在线中文字幕电影视频| 黄网站app在线观看| 伊人夜夜躁av伊人久久| 欧美日韩一道本| 欧美xxxx做受欧美护士| 欧美人体做爰大胆视频| 精品伦一区二区三区| 麻豆精品99| 中文日韩电影网站| 91日韩中文字幕| 亚洲精品婷婷| 国产精品一区二区3区| www.日韩高清| 国产亚洲一区二区三区四区 | 搞黄网站在线看| 无码av中文一区二区三区桃花岛| 国产男女无遮挡| 欧美性生活一级| 亚洲国产欧美一区二区三区同亚洲 | 亚洲午夜性刺激影院| 亚洲怡红院在线观看| 亚洲精品乱码| 国产精品最新在线观看| 三级网站免费观看| 国产精品国产a级| 国产精品裸体瑜伽视频| 久久精品黄色| 日韩精品有码在线观看| 四虎永久免费地址| 亚洲影视综合| 亚洲综合在线小说| 成人网视频在线观看| 亚洲图片自拍偷拍| 中日韩av在线播放| 日韩超碰人人爽人人做人人添| 中文字幕在线观看日韩| 可以免费看的av毛片| 久久精品国产亚洲aⅴ| 久久久精彩视频| av在线app| 欧美日韩在线播放三区| 免费的av网站| 国产精品观看| 成人网在线视频| 国产在线网站| 黄色成人在线播放| 性xxxxxxxxx| 久久久久国产精品| 国产精品久久久久久久av大片| 婷婷丁香一区二区三区| 亚洲女与黑人做爰| 色播五月激情五月| 欧美精品色图| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲av综合色区无码一二三区| 国产精品久久久久久久裸模| 九九九九免费视频| 久久亚洲黄色| 久久久亚洲国产| 精品人妻一区二区三区浪潮在线 | 日韩高清人体午夜| 久久久精品人妻一区二区三区四| 美女视频黄a大片欧美| 日本一区视频在线观看| 都市激情综合| 亚洲欧美精品伊人久久| 久久国产黄色片| 99久久国产免费看| 免费观看国产精品视频| 欧美高清视频看片在线观看| 久久久人成影片一区二区三区观看 | 超碰在线caoporn| 欧美精选一区二区| 永久免费看mv网站入口| 人禽交欧美网站| 亚洲国产一区二区三区在线播| 深夜视频一区二区| 国产午夜精品全部视频在线播放| 精品人妻一区二区三区潮喷在线| 91免费小视频| 欧美视频第三页| 国产调教一区二区三区| 国产精品视频最多的网站| 色的视频在线免费看| 777奇米成人网| 免费在线视频一区二区| 成人少妇影院yyyy| 可以在线看的av网站| 国产精品入口久久| 国产精品欧美一区二区| 欧美一区二区三区在线观看免费| 欧美精品一二三区| 免费在线黄色片| 99视频一区二区三区| 日韩欧美在线免费观看视频| 少妇精品久久久一区二区| 国产精品视频久久| 18videosex性欧美麻豆| 亚洲精品一区二区精华| 日产精品久久久| 国产精品美女一区二区三区 | 久久视频精品在线| 精品国产无码AV| 黑人巨大精品欧美一区二区免费 | 亚洲精品视频观看| 亚洲av成人片无码| 日本不卡一区二区三区高清视频| a级黄色片网站| 国产精品x8x8一区二区| 国产99视频在线观看| 美女av在线播放| 亚洲精品大尺度| 亚洲天堂2021av| 亚洲va欧美va天堂v国产综合| 亚洲精品乱码久久久久久久久久久久 | 中文字幕精品影院| 91在线观看欧美日韩| 国产美女高潮在线| 日韩在线小视频| 色呦呦中文字幕| 欧美日韩精品综合在线| 国产精品二区一区二区aⅴ| 久久婷婷国产综合精品青草| 在线免费观看av网| 久久aⅴ国产紧身牛仔裤| 日本一本草久p| 欧美先锋资源| 国内精品视频免费| 免费看日产一区二区三区| 国产精品爱久久久久久久| 羞羞的视频在线看| 中文字幕亚洲天堂| 天堂网www中文在线| 欧美一区二视频| 精品一区二三区| 亚洲va国产天堂va久久en| 久久精品在线观看视频| 2024国产精品视频| 国产ts在线观看| 久热成人在线视频| 国产xxxxx视频| 亚洲久色影视| 大荫蒂性生交片| 中文一区一区三区免费在线观看| 日本一区二区精品| 色婷婷久久久| 精品欧美国产| 日韩精品成人在线观看| 国产欧美一区二区三区久久| 在线精品亚洲欧美日韩国产| 久久久久久久国产| 成人免费视屏| 色偷偷av一区二区三区乱| 国产私人尤物无码不卡| 精品中文字幕久久久久久| 亚洲黄色小说网| 日韩视频一区二区| 国产内射老熟女aaaa∵| 欧美午夜理伦三级在线观看| 91video| 亚洲成人激情av| 久久综合成人网| 亚洲午夜免费电影| 国产性猛交普通话对白| 一区二区三区在线视频播放| 一起操在线播放| ●精品国产综合乱码久久久久| 粉嫩精品久久99综合一区| 国产欧美在线观看一区| 国产三级av在线播放| 久久美女艺术照精彩视频福利播放| 国产老熟女伦老熟妇露脸| 91亚洲精品乱码久久久久久蜜桃| 亚洲少妇18p| 91热门视频在线观看| 中文字幕xxx| 国产亚洲一区二区三区在线观看 | 亚洲免费在线视频一区 二区| 日韩在线不卡av| 亚洲视频免费观看| 免费三片在线播放| 精品久久香蕉国产线看观看亚洲 | 日韩亚洲欧美在线观看| 99热精品在线播放| 精品女同一区二区| 国 产 黄 色 大 片| 欧美精品一区二区三区蜜桃| 天天摸天天碰天天爽天天弄| 亚洲精品一区二区在线| 国产日本在线| 久久精品国产久精国产一老狼| 麻豆传媒在线免费| 欧美高清视频在线| 成人亚洲欧美| 国产欧美精品在线| 亚洲精品v亚洲精品v日韩精品| 国产亚洲精品美女久久久m| 亚洲婷婷丁香| 一区在线电影| 亚洲视频狠狠| chinese少妇国语对白| 狠狠色狠狠色合久久伊人| 国产chinesehd精品露脸| eeuss影院一区二区三区| 女女互磨互喷水高潮les呻吟 | 亚洲欧美在线播放| 国产69精品久久app免费版| www.午夜精品| 96av在线| 国产精品永久免费视频| 中文字幕日韩在线| 久久亚洲午夜电影| 国产精品99一区二区三区| 人体内射精一区二区三区| 久热re这里精品视频在线6| 99中文字幕在线| 久久亚洲一级片| 欧美三级日本三级| 欧美性生活大片免费观看网址| 国产精品欧美综合亚洲| 亚洲国产精品va在线看黑人动漫 | 欧美精品激情在线观看| 电影网一区二区| 97超级碰碰| 欧洲激情综合| 国产原创中文在线观看 | 亚洲精品日本| 欧美视频国产视频| 久久久久久一级片| 久久久久亚洲天堂| 欧美无砖专区一中文字| 午夜视频在线免费播放| 操人视频在线观看欧美| 欧美精品总汇| 精品国产乱码久久久久久久软件 | 久久久成人av| 原纱央莉成人av片| 国产精品免费一区二区三区在线观看| 三上亚洲一区二区| 国产视频九色蝌蚪| 国产精品一区二区久激情瑜伽| 免费看91的网站| 疯狂做受xxxx欧美肥白少妇| www.五月婷婷| 久久人人爽亚洲精品天堂| japanese23hdxxxx日韩| 久久国产精品-国产精品| 欧美婷婷在线| 深爱五月综合网| 亚洲色欲色欲www| 中文字幕日韩经典| 国产亚洲精品久久久| 在线观看的黄色| 国产在线精品一区二区三区| 欧美福利影院| www.久久久久久久久久久| 中文在线一区二区| 成人黄色片在线观看| 亚洲欧洲国产一区| 成人福利视频| 欧美日韩最好看的视频| 久久中文精品| 国产精品久久久久无码av色戒| 午夜精品影院在线观看| 天天操天天干天天插| 欧美国产日本高清在线 | 在线看的毛片| 精品一区二区国产| 性xx色xx综合久久久xx| 毛片网站免费观看| 日韩欧美国产中文字幕| 亚洲 小说区 图片区 都市| 8x海外华人永久免费日韩内陆视频 | 久久久蜜桃一区二区人| 免费在线观看你懂的| 色综合视频在线观看| 都市激情在线视频| 国产精品视频永久免费播放| 日韩国产专区| 99久久99精品| 亚洲尤物在线视频观看| 成人av手机在线| 久久免费国产视频| 亚洲欧洲美洲国产香蕉| 欧美 日韩 国产 激情| 欧美激情中文字幕一区二区| 中文字幕在线一| 欧美久久精品午夜青青大伊人| 6080亚洲理论片在线观看| 欧美一级视频免费看| 91在线你懂得| 国产精品xxxxxx| 久热精品视频在线观看一区| 影音先锋欧美激情| jizzjizzxxxx| 国产精品欧美久久久久无广告 | 国产福利不卡视频| 日韩成人在线免费视频| 亚洲免费视频一区二区| 欧美一区二区三区婷婷| 老子影院午夜伦不卡大全| 久久先锋影音av鲁色资源网| 国产偷人爽久久久久久老妇app | 国产欧美一区二区三区鸳鸯浴 | 自拍偷拍校园春色| 日韩视频在线观看免费| 在线播放一区二区精品视频| 精品99在线视频| 综合久久给合久久狠狠狠97色| 国产 日韩 欧美 精品| 国产不卡av在线| 一区二区三区网站| yy6080午夜| 欧美猛男男办公室激情| 三级中文字幕在线观看| 一区二区三区av在线| 成人动漫在线一区| 免费看av在线| 97视频人免费观看| 大色综合视频网站在线播放| 欧美xxxxx少妇| 欧美嫩在线观看| 亚洲日本天堂| 久久亚洲a v| 国产精品你懂的在线| 丝袜视频国产在线播放| 亚洲一区二区三区777| 日韩精品91亚洲二区在线观看|