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

金融用戶敏感數(shù)據(jù)如何優(yōu)雅地實現(xiàn)脫敏?

開發(fā) 前端
Sensitive提供了基于注解的方式,并且內(nèi)置了常見的脫敏方式,便于開發(fā)。

項目介紹

日志脫敏是常見的安全需求。普通的基于工具類方法的方式,對代碼的入侵性太強,編寫起來又特別麻煩。

sensitive[1] 提供了基于注解的方式,并且內(nèi)置了常見的脫敏方式,便于開發(fā)。

日志脫敏

為了金融交易的安全性,國家強制規(guī)定對于以下信息是要日志脫敏的:

  1. 用戶名
  2. 手機號
  3. 郵箱
  4. 銀行卡號
  5. 密碼
  6. 身份證號

特性

  1. 基于注解的日志脫敏。
  2. 可以自定義策略實現(xiàn),策略生效條件。
  3. 內(nèi)置常見的十幾種脫敏內(nèi)置方案。
  4. java 深拷貝,且原始對象不用實現(xiàn)任何接口。
  5. 支持用戶自定義注解。
  6. 支持基于 FastJSON 直接生成脫敏后的 json。

快速開始

環(huán)境準備

  • JDK 7+
  • Maven 3.x

maven 導(dǎo)入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-core</artifactId>
    <version>1.0.0</version>
</dependency>

核心 api 簡介

SensitiveUtil 工具類的核心方法列表如下:

序號

方法

參數(shù)

結(jié)果

說明

1

desCopy()

目標對象

深度拷貝脫敏對象

適應(yīng)性更強

2

desJson()

目標對象

脫敏對象 json

性能較好

3

desCopyCollection()

目標對象集合

深度拷貝脫敏對象集合


4

desJsonCollection()

目標對象集合

脫敏對象 json 集合


定義對象

  • UserAnnotationBean.java

通過注解,指定每一個字段的脫敏策略。

public class UserAnnotationBean {
    @SensitiveStrategyChineseName
    private String username;
    @SensitiveStrategyPassword
    private String password;
    @SensitiveStrategyPassport
    private String passport;
    @SensitiveStrategyIdNo
    private String idNo;
    @SensitiveStrategyCardId
    private String bandCardId;
    @SensitiveStrategyPhone
    private String phone;
    @SensitiveStrategyEmail
    private String email;
    @SensitiveStrategyAddress
    private String address;
    @SensitiveStrategyBirthday
    private String birthday;
    @SensitiveStrategyGps
    private String gps;
    @SensitiveStrategyIp
    private String ip;
    @SensitiveStrategyMaskAll
    private String maskAll;
    @SensitiveStrategyMaskHalf
    private String maskHalf;
    @SensitiveStrategyMaskRange
    private String maskRange;
    //Getter & Setter
    //toString()
}
  • 數(shù)據(jù)準備

構(gòu)建一個最簡單的測試對象:

UserAnnotationBean bean  = new UserAnnotationBean();
bean.setUsername("張三");
bean.setPassword("123456");
bean.setPassport("CN1234567");
bean.setPhone("13066668888");
bean.setAddress("中國上海市浦東新區(qū)外灘18號");
bean.setEmail("whatanice@code.com");
bean.setBirthday("20220831");
bean.setGps("66.888888");
bean.setIp("127.0.0.1");
bean.setMaskAll("可惡啊我會被全部掩蓋");
bean.setMaskHalf("還好我只會被掩蓋一半");
bean.setMaskRange("我比較靈活指定掩蓋范圍");
bean.setBandCardId("666123456789066");
bean.setIdNo("360123202306018888");
  • 測試代碼
final String originalStr = "UserAnnotationBean{username='張三', password='123456', passport='CN1234567', idNo='360123202306018888', bandCardId='666123456789066', phone='13066668888', email='whatanice@code.com', address='中國上海市浦東新區(qū)外灘18號', birthday='20220831', gps='66.888888', ip='127.0.0.1', maskAll='可惡啊我會被全部掩蓋', maskHalf='還好我只會被掩蓋一半', maskRange='我比較靈活指定掩蓋范圍'}";
final String sensitiveStr = "UserAnnotationBean{username='張*', password='null', passport='CN*****67', idNo='3****************8', bandCardId='666123*******66', phone='1306****888', email='wh************.com', address='中國上海********8號', birthday='20*****1', gps='66*****88', ip='127***0.1', maskAll='**********', maskHalf='還好我只會*****', maskRange='我*********圍'}";
final String expectSensitiveJson = "{\"address\":\"中國上海********8號\",\"bandCardId\":\"666123*******66\",\"birthday\":\"20*****1\",\"email\":\"wh************.com\",\"gps\":\"66*****88\",\"idNo\":\"3****************8\",\"ip\":\"127***0.1\",\"maskAll\":\"**********\",\"maskHalf\":\"還好我只會*****\",\"maskRange\":\"我*********圍\",\"passport\":\"CN*****67\",\"phone\":\"1306****888\",\"username\":\"張*\"}";

UserAnnotationBean sensitiveUser = SensitiveUtil.desCopy(bean);
Assert.assertEquals(sensitiveStr, sensitiveUser.toString());
Assert.assertEquals(originalStr, bean.toString());
String sensitiveJson = SensitiveUtil.desJson(bean);
Assert.assertEquals(expectSensitiveJson, sensitiveJson);

我們可以直接利用 sensitiveUser 去打印日志信息,而這個對象對于代碼其他流程不影響,我們依然可以使用原來的 user 對象。

當然,也可以使用 sensitiveJson 打印日志信息。

@Sensitive 注解

說明

@SensitiveStrategyChineseName 這種注解是為了便于用戶使用,本質(zhì)上等價于 @Sensitive(strategy = StrategyChineseName.class)

@Sensitive 注解可以指定對應(yīng)的脫敏策略。

內(nèi)置注解與映射

編號

注解

等價 @Sensitive

備注

1

@SensitiveStrategyChineseName

@Sensitive(strategy = StrategyChineseName.class)

中文名稱脫敏

2

@SensitiveStrategyPassword

@Sensitive(strategy = StrategyPassword.class)

密碼脫敏

3

@SensitiveStrategyEmail

@Sensitive(strategy = StrategyEmail.class)

email 脫敏

4

@SensitiveStrategyCardId

@Sensitive(strategy = StrategyCardId.class)

卡號脫敏

5

@SensitiveStrategyPhone

@Sensitive(strategy = StrategyPhone.class)

手機號脫敏

6

@SensitiveStrategyIdNo

@Sensitive(strategy = StrategyIdNo.class)

身份證脫敏

7

@SensitiveStrategyAddress

@Sensitive(strategy = StrategyAddress.class)

地址脫敏

8

@SensitiveStrategyGps

@Sensitive(strategy = StrategyGps.class)

GPS 脫敏

9

@SensitiveStrategyIp

@Sensitive(strategy = StrategyIp.class)

IP 脫敏

10

@SensitiveStrategyBirthday

@Sensitive(strategy = StrategyBirthday.class)

生日脫敏

11

@SensitiveStrategyPassport

@Sensitive(strategy = StrategyPassport.class)

護照脫敏

12

@SensitiveStrategyMaskAll

@Sensitive(strategy = StrategyMaskAll.class)

全部脫敏

13

@SensitiveStrategyMaskHalf

@Sensitive(strategy = StrategyMaskHalf.class)

一半脫敏

14

@SensitiveStrategyMaskRange

@Sensitive(strategy = StrategyMaskRange.class)

指定范圍脫敏

@Sensitive 定義

@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Sensitive {
    /**
     * 注解生效的條件
     * @return 條件對應(yīng)的實現(xiàn)類
     */
    Class<? extends ICondition> condition() default ConditionAlwaysTrue.class;
    /**
     * 執(zhí)行的策略
     * @return 策略對應(yīng)的類型
     */
    Class<? extends IStrategy> strategy();


}

與 @Sensitive 混合使用

如果你將新增的注解 @SensitiveStrategyChineseName 與 @Sensitive 同時在一個字段上使用。

為了簡化邏輯,優(yōu)先選擇執(zhí)行 @Sensitive,如果 @Sensitive 執(zhí)行脫敏, 那么 @SensitiveStrategyChineseName 將不會生效。

如:

/**
 * 測試字段
 * 1.當多種注解混合的時候,為了簡化邏輯,優(yōu)先選擇 @Sensitive 注解。
 */
@SensitiveStrategyChineseName
@Sensitive(strategy = StrategyPassword.class)
private String testField;

更多特性

自定義脫敏策略生效的場景

默認情況下,我們指定的場景都是生效的。

但是你可能需要有些情況下不進行脫敏,比如有些用戶密碼為 123456,你覺得這種用戶不脫敏也罷。

  • UserPasswordCondition.java
@Sensitive(condition = ConditionFooPassword.class, strategy = StrategyPassword.class)
private String password;

其他保持不變,我們指定了一個 condition,實現(xiàn)如下:

  • ConditionFooPassword.java
public class ConditionFooPassword implements ICondition {
    @Override
    public boolean valid(IContext context) {
        try {
            Field field = context.getCurrentField();
            final Object currentObj = context.getCurrentObject();
            final String password = (String) field.get(currentObj);
            return !password.equals("123456");
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

也就是只有當密碼不是 123456 時密碼脫敏策略才會生效。

屬性為集合或者對象

如果某個屬性是單個集合或者對象,則需要使用注解 @SensitiveEntry

  • 放在集合屬性上,且屬性為普通對象

會遍歷每一個屬性,執(zhí)行上面的脫敏策略。

  • 放在對象屬性上

會處理對象中各個字段上的脫敏注解信息。

  • 放在集合屬性上,且屬性為對象

遍歷每一個對象,處理對象中各個字段上的脫敏注解信息。

放在集合屬性上,且屬性為普通對象

  • UserEntryBaseType.java

作為演示,集合中為普通的字符串。

public class UserEntryBaseType {
    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private List<String> chineseNameList;
    @SensitiveEntry
    @Sensitive(strategy = StrategyChineseName.class)
    private String[] chineseNameArray;
    //Getter & Setter & toString()
}

放在對象屬性上

例子如下:

public class UserEntryObject {
    @SensitiveEntry
    private User user;
    @SensitiveEntry
    private List<User> userList;
    @SensitiveEntry
    private User[] userArray;
    //...
}

自定義注解

  • v0.0.4 新增功能。允許功能自定義條件注解和策略注解。?v0.0.11 新增功能。允許功能自定義級聯(lián)脫敏注解。

案例1

自定義密碼脫敏策略&自定義密碼脫敏策略生效條件

  • 策略脫敏
/**
 * 自定義密碼脫敏策略
 * @author binbin.hou
 * date 2019/1/17
 * @since 0.0.4
 */
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SensitiveStrategy(CustomPasswordStrategy.class)
public @interface SensitiveCustomPasswordStrategy {
}
  • 脫敏生效條件
/**
 * 自定義密碼脫敏策略生效條件
 * @author binbin.hou
 * date 2019/1/17
 * @since 0.0.4
 */
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SensitiveCondition(ConditionFooPassword.class)
public @interface SensitiveCustomPasswordCondition{
}
  • TIPS

@SensitiveStrategy 策略單獨使用的時候,默認是生效的。

如果有 @SensitiveCondition 注解,則只有當條件滿足時,才會執(zhí)行脫敏策略。

@SensitiveCondition 只會對系統(tǒng)內(nèi)置注解和自定義注解生效,因為 @Sensitive 有屬于自己的策略生效條件。

  • 策略優(yōu)先級

@Sensitive 優(yōu)先生效,然后是系統(tǒng)內(nèi)置注解,最后是用戶自定義注解。

對應(yīng)的實現(xiàn)

兩個元注解 @SensitiveStrategy@SensitiveCondition 分別指定了對應(yīng)的實現(xiàn)。

  • CustomPasswordStrategy.java
public class CustomPasswordStrategy implements IStrategy {
    @Override
    public Object des(Object original, IContext context) {
        return "**********************";
    }
}
  • ConditionFooPassword.java
/**
 * 讓這些 123456 的密碼不進行脫敏
 * @author binbin.hou
 * date 2019/1/2
 * @since 0.0.1
 */
public class ConditionFooPassword implements ICondition {
    @Override
    public boolean valid(IContext context) {
        try {
            Field field = context.getCurrentField();
            final Object currentObj = context.getCurrentObject();
            final String name = (String) field.get(currentObj);
            return !name.equals("123456");
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

定義測試對象

定義一個使用自定義注解的對象。

public class CustomPasswordModel {
    @SensitiveCustomPasswordCondition
    @SensitiveCustomPasswordStrategy
    private String password;
    @SensitiveCustomPasswordCondition
    @SensitiveStrategyPassword
    private String fooPassword;
    //其他方法
}

測試

/**
 * 自定義注解測試
 */
@Test
public void customAnnotationTest() {
    final String originalStr = "CustomPasswordModel{password='hello', fooPassword='123456'}";
    final String sensitiveStr = "CustomPasswordModel{password='**********************', fooPassword='123456'}";
    CustomPasswordModel model = buildCustomPasswordModel();
    Assert.assertEquals(originalStr, model.toString());
    CustomPasswordModel sensitive = SensitiveUtil.desCopy(model);
    Assert.assertEquals(sensitiveStr, sensitive.toString());
    Assert.assertEquals(originalStr, model.toString());
}

構(gòu)建對象的方法如下:

/**
 * 構(gòu)建自定義密碼對象
 * @return 對象
 */
private CustomPasswordModel buildCustomPasswordModel(){
    CustomPasswordModel model = new CustomPasswordModel();
    model.setPassword("hello");
    model.setFooPassword("123456");
    return model;
}

案例2

  • v0.0.11 新增功能。允許功能自定義級聯(lián)脫敏注解。

自定義級聯(lián)脫敏注解

  • 自定義級聯(lián)脫敏注解

可以根據(jù)自己的業(yè)務(wù)需要,在自定義的注解上使用 @SensitiveEntry

使用方式保持和 @SensitiveEntry 一樣即可。

/**
 * 級聯(lián)脫敏注解,如果對象中屬性為另外一個對象(集合),則可以使用這個注解指定。
 * <p>
 * 1. 如果屬性為 Iterable 的子類集合,則當做列表處理,遍歷其中的對象
 * 2. 如果是普通對象,則處理對象中的脫敏信息
 * 3. 如果是普通字段/MAP,則不做處理
 * @since 0.0.11
 */
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SensitiveEntry
public @interface SensitiveEntryCustom {
}

定義測試對象

定義一個使用自定義注解的對象。

public class CustomUserEntryObject {
    @SensitiveEntryCustom
    private User user;
    @SensitiveEntryCustom
    private List<User> userList;
    @SensitiveEntryCustom
    private User[] userArray;
    // 其他方法...
}

生成脫敏后的 JSON

說明

為了避免生成中間脫敏對象,v0.0.6 之后直接支持生成脫敏后的 JSON。

使用方法

新增工具類方法,可以直接返回脫敏后的 JSON。

生成的 JSON 是脫敏的,原對象屬性值不受影響。

public static String desJson(Object object)

注解的使用方式

和 SensitiveUtil.desCopy() 完全一致。

使用示例代碼

所有的測試案例中,都添加了對應(yīng)的 desJson(Object) 測試代碼,可以參考。

此處只展示最基本的使用。

final String originalStr = "SystemBuiltInAt{phone='18888888888', password='1234567', name='脫敏君', email='12345@qq.com', cardId='123456190001011234'}";
final String sensitiveJson = "{\"cardId\":\"123456**********34\",\"email\":\"12******.com\",\"name\":\"脫**\",\"phone\":\"1888****888\"}";
SystemBuiltInAt systemBuiltInAt = DataPrepareTest.buildSystemBuiltInAt();
Assert.assertEquals(sensitiveJson, SensitiveUtil.desJson(systemBuiltInAt));
Assert.assertEquals(originalStr, systemBuiltInAt.toString());

注意

本次 JSON 脫敏基于 FastJSON[2]

FastJSON 在序列化本身存在一定限制。當對象中有集合,集合中還是對象時,結(jié)果不盡如人意。

示例代碼

本測試案例可見測試代碼。

final String originalStr = "UserCollection{userList=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}], userSet=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}], userCollection=[User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}], userMap={map=User{username='脫敏君', idCard='123456190001011234', password='1234567', email='12345@qq.com', phone='18888888888'}}}";
final String commonJson = "{\"userArray\":[{\"email\":\"12345@qq.com\",\"idCard\":\"123456190001011234\",\"password\":\"1234567\",\"phone\":\"18888888888\",\"username\":\"脫敏君\"}],\"userCollection\":[{\"$ref\":\"$.userArray[0]\"}],\"userList\":[{\"$ref\":\"$.userArray[0]\"}],\"userMap\":{\"map\":{\"$ref\":\"$.userArray[0]\"}},\"userSet\":[{\"$ref\":\"$.userArray[0]\"}]}";
final String sensitiveJson = "{\"userArray\":[{\"email\":\"12******.com\",\"idCard\":\"123456**********34\",\"phone\":\"1888****888\",\"username\":\"脫**\"}],\"userCollection\":[{\"$ref\":\"$.userArray[0]\"}],\"userList\":[{\"$ref\":\"$.userArray[0]\"}],\"userMap\":{\"map\":{\"$ref\":\"$.userArray[0]\"}},\"userSet\":[{\"$ref\":\"$.userArray[0]\"}]}";
UserCollection userCollection = DataPrepareTest.buildUserCollection();
Assert.assertEquals(commonJson, JSON.toJSONString(userCollection));
Assert.assertEquals(sensitiveJson, SensitiveUtil.desJson(userCollection));
Assert.assertEquals(originalStr, userCollection.toString());

解決方案

如果有這種需求,建議使用原來的 desCopy(Object)

脫敏引導(dǎo)類

為了配置的靈活性,引入了引導(dǎo)類。

核心 api 簡介

SensitiveBs 引導(dǎo)類的核心方法列表如下:

序號

方法

參數(shù)

結(jié)果

說明

1

desCopy()

目標對象

深度拷貝脫敏對象

適應(yīng)性更強

2

desJson()

目標對象

脫敏對象 json

性能較好

使用示例

使用方式和工具類一致,示意如下:

SensitiveBs.newInstance().desCopy(user);

配置深度拷貝實現(xiàn)

默認的使用 FastJson 進行對象的深度拷貝,等價于:

SensitiveBs.newInstance()
                .deepCopy(FastJsonDeepCopy.getInstance())
                .desJson(user);

參見 SensitiveBsTest.java[3]。

deepCopy 用于指定深度復(fù)制的具體實現(xiàn),支持用戶自定義。

深度復(fù)制(DeepCopy)

說明

深度復(fù)制可以保證我們?nèi)罩据敵鰧ο竺撁簦瑫r不影響正常業(yè)務(wù)代碼的使用。

可以實現(xiàn)深度復(fù)制的方式有很多種,默認基于 fastjson[4] 實現(xiàn)的。

為保證后續(xù)良性發(fā)展,v0.0.13 版本之后將深度復(fù)制接口抽離為單獨的項目:

deep-copy[5]

內(nèi)置策略

目前支持 6 種基于序列化實現(xiàn)的深度復(fù)制,便于用戶替換使用。

每一種都可以單獨使用,保證依賴更加輕量。

自定義

為滿足不同場景的需求,深度復(fù)制策略支持用戶自定義。

自定義深度復(fù)制[6]

開源地址

https://github.com/houbb/sensitive [7]。

References

[1] sensitive: https://github.com/houbb/sensitive。

[2] FastJSON: https://github.com/alibaba/fastjson。

[3] SensitiveBsTest.java: https://github.com/houbb/sensitive/blob/master/sensitive-test/src/test/java/com/github/houbb/sensitive/test/bs/SensitiveBsTest.java。

[4] fastjson: https://github.com/alibaba/fastjson。

[5] deep-copy: https://github.com/houbb/deep-copy。

[6] 自定義深度復(fù)制: https://github.com/houbb/deep-copy#自定義。

[7] https://github.com/houbb/sensitive : https://github.com/houbb/sensitive。

責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-10-07 08:34:27

項目API接口

2021-09-16 10:11:15

Dataphin 數(shù)據(jù)保護

2010-09-25 08:55:29

2024-09-27 12:27:31

2020-10-25 09:04:46

數(shù)據(jù)加密數(shù)據(jù)泄露攻擊

2023-07-21 12:48:37

2025-06-18 02:12:00

2020-04-16 08:00:00

Ansible Vau敏感數(shù)據(jù)加密

2024-03-05 09:40:35

2018-09-14 14:48:01

2020-12-08 08:08:51

Java接口數(shù)據(jù)

2022-05-24 06:07:48

JShack用戶代碼

2024-01-01 15:53:25

2023-10-23 10:39:05

2020-11-26 15:09:49

數(shù)據(jù)安全百度地圖機器學(xué)習

2012-07-03 11:35:02

數(shù)據(jù)安全

2021-05-12 22:07:43

并發(fā)編排任務(wù)

2023-06-27 07:26:36

汽車之家敏感數(shù)據(jù)治理

2023-10-30 15:35:05

數(shù)據(jù)安全數(shù)據(jù)驅(qū)動

2024-08-08 10:32:11

點贊
收藏

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

91成品人片a无限观看| 日韩精品免费一线在线观看| 国产精品12p| 亚洲欧美激情国产综合久久久| 中国女人久久久| 国产一区二区三区18| 日日夜夜精品视频免费观看 | 中文字幕一区二区不卡| 亚洲最大福利网站| 精品国产xxx| 国色天香一区二区| 有码中文亚洲精品| 日韩精品xxx| 国产精品久久久久77777丨| 一区二区三区在线视频播放| 日韩一区国产在线观看| 你懂的网站在线| 麻豆国产欧美一区二区三区| 韩国美女主播一区| 男人操女人的视频网站| 欧美丝袜一区| 日韩成人在线网站| 天天躁日日躁狠狠躁av| 2020国产精品小视频| 色婷婷精品久久二区二区蜜臀av| 成人国产在线看| 在线观看a视频| 91偷拍与自偷拍精品| 91九色在线观看| 中文字幕自拍偷拍| 午夜在线一区| 91精品国产99| 国产精品99精品无码视| 一个色综合网| 啊v视频在线一区二区三区| 无码熟妇人妻av| 日韩美脚连裤袜丝袜在线| 日韩欧美高清在线| 人人爽人人爽av| 色999韩欧美国产综合俺来也| 日韩欧美精品免费在线| 丰满少妇久久久| 精精国产xxxx视频在线中文版| 日韩毛片高清在线播放| 中文字幕久久一区| 精品自拍一区| 亚洲乱码国产乱码精品精98午夜| 一级做a爰片久久| 日本免费中文字幕在线| 国产精品另类一区| 亚洲欧美日韩国产成人综合一二三区| 国产午夜在线视频| 国产欧美日韩综合| 五月婷婷综合色| av在线电影观看| 中文字幕在线视频一区| 国产精品美女在线播放| 成人在线播放| 亚洲国产一区视频| 国产二级片在线观看| 久草免费在线视频| ww久久综合久中文字幕| 中文字幕va一区二区三区| 日韩精品av一区二区三区| 国产粉嫩一区二区三区在线观看| 欧美激情中文字幕| 亚洲图片都市激情| 91蜜桃在线视频| 亚洲国产中文字幕在线视频综合| 少妇高潮毛片色欲ava片| 午夜影院在线播放| 91精品91久久久中77777| 亚洲性图一区二区| 日韩欧美中文在线观看| 精品成人佐山爱一区二区| 黄色网址在线视频| 国产一区网站| 日韩视频免费在线观看| 欧美黄色aaa| 99精品免费视频| 国产精品久久久久久久久免费看| 国产精品国产三级国产aⅴ| 国产一区在线观看视频| 国产精品我不卡| 色中色在线视频| 中文字幕在线不卡一区| 嫩草影院中文字幕| 欧美极品影院| 日韩一区二区中文字幕| 黄色性生活一级片| 欧美激情欧美| 91福利视频在线观看| 中文字幕永久免费视频| 成人午夜激情视频| 日韩影视精品| h片在线观看视频免费| 欧美性感一区二区三区| 欧美熟妇精品一区二区| 神马电影久久| 久久6免费高清热精品| av图片在线观看| 国产一区二区不卡老阿姨| 蜜桃网站成人| 污污影院在线观看| 91福利视频网站| 欧美一级免费在线| 欧美美女视频| 高清一区二区三区日本久| 黄色一级片免费在线观看| 国产精一区二区三区| 欧洲亚洲一区二区三区四区五区| 日本高清在线观看视频| 欧美乱妇23p| 国产精品日韩精品欧美在线| 国产 国语对白 露脸| 91精品影视| 欧美精品一区二区三区在线| www.xx日本| 视频在线在亚洲| av一区二区三区四区电影| 番号集在线观看| 精品久久久久久亚洲国产300| 国产一级片自拍| 国产成人三级| 国模叶桐国产精品一区| av网站免费播放| 国产精品久久毛片a| 免费av网址在线| 国产伦精品一区二区三区在线播放 | 欧美久久香蕉| 九九热这里只有在线精品视| 艳妇乳肉豪妇荡乳av| 国产无人区一区二区三区| 97视频久久久| 第四色在线一区二区| 欧美老妇交乱视频| va视频在线观看| 亚洲视频免费看| 国产永久免费网站| 日韩久久综合| 国产欧美一区二区三区在线| 国产一级在线| 91久久精品日日躁夜夜躁欧美| 亚洲观看黄色网| 亚洲精品欧洲| 精品亚洲一区二区三区四区五区高| 手机av免费在线| 精品人伦一区二区色婷婷| 日韩一区二区不卡视频| 久久99国产精品免费网站| 伊人久久大香线蕉成人综合网| 国产成+人+综合+亚洲欧美| 亚洲图片制服诱惑| japanese国产在线观看| 亚洲国产精品成人综合| 一区二区三区韩国| 五月天久久777| 91九色在线免费视频| 欧美寡妇性猛交xxx免费| 精品奇米国产一区二区三区| 国产福利拍拍拍| 久久亚洲综合色| 黑森林精品导航| 亚洲综合色网| 国产伦精品一区二区三区免| 日韩av影片| 亚洲偷熟乱区亚洲香蕉av| 中文字幕人妻一区二区三区视频 | 亚洲精品一区二| 国产精品久久久久av电视剧| 最近2019免费中文字幕视频三 | 亚洲欧美在线成人| 色偷偷噜噜噜亚洲男人的天堂| 国产女18毛片多18精品| 亚洲国产精品人人做人人爽| 女尊高h男高潮呻吟| 免费在线欧美视频| 69精品丰满人妻无码视频a片| 另类ts人妖一区二区三区| 国产精品成人观看视频国产奇米| 黄色精品免费看| 日韩av一区在线| 中文字幕一区二区三区波野结| 亚洲制服丝袜av| 日本免费www| 国产精品亚洲专一区二区三区| 婷婷无套内射影院| 欧美色就是色| 国产成人免费电影| 成人黄色免费网站| 久久久久久欧美| 国产三级在线免费观看| 日韩一级免费观看| 亚洲自拍一区在线观看| 亚洲精品大片www| 国产精品久久久久无码av色戒| 国产一二精品视频| 日韩欧美xxxx| 国产精品v一区二区三区| 日韩av电影免费观看| 天堂va在线高清一区| 欧美一级电影免费在线观看| 超碰在线观看免费| 国产亚洲精品日韩| 欧美一级淫片免费视频魅影视频| 欧美自拍偷拍一区| 91香蕉在线视频| 日韩码欧中文字| 成人无码av片在线观看| 成人av网在线| 中文字幕乱码在线人视频| 日本在线不卡一区| a在线视频观看| 国产精品多人| 裸体大乳女做爰69| 日韩欧美自拍| 日韩三级电影网站| 欧美毛片免费观看| 国产有色视频色综合| 精品久久亚洲| 成人乱人伦精品视频在线观看| 日本欧美不卡| 国产精品白嫩美女在线观看 | 色婷婷一区二区三区四区| 久久精品波多野结衣| 中文字幕日韩欧美一区二区三区| 性欧美精品中出| 不卡视频在线观看| 国产ts在线观看| 国产成人精品免费| 亚洲制服在线观看| 韩国精品久久久| 我要看一级黄色大片| 老司机精品久久| 草草久久久无码国产专区| 激情综合在线| 日韩精品在线视频免费观看| 欧美 日韩 国产一区二区在线视频 | 天堂在线中文字幕| 精品第一国产综合精品aⅴ| 亚洲a视频在线| 日韩精品一区二区三区四区视频 | 蜜臀av.com| 亚洲成av人片乱码色午夜| 91香蕉视频网址| 99精品网站| 亚洲资源视频| 欧美国产一级| 91视频成人免费| 欧美激情麻豆| 久久久久久久9| 亚洲特级毛片| 亚洲熟妇国产熟妇肥婆| 中文精品视频| 夫妻免费无码v看片| 男女av一区三区二区色多| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 免费永久网站黄欧美| 国产亚洲天堂网| 天堂va蜜桃一区二区三区漫画版| 爱情岛论坛成人| 久久99精品国产麻豆婷婷洗澡| 91 视频免费观看| 国产99久久久国产精品| 女同性恋一区二区三区| 久久久噜噜噜久久人人看| 人妻精品久久久久中文| 国产精品久久国产精麻豆99网站| 少妇高潮一区二区三区喷水| 亚洲久本草在线中文字幕| 国产中文字幕免费| 色综合久久天天| 亚洲天堂网视频| 69成人精品免费视频| 黄色片一区二区| 一区二区三区视频观看| 成年人网站在线| 91av在线免费观看| 日韩电影免费观看高清完整版在线观看| 亚洲一区二区日本| 天堂在线精品| 日日噜噜噜夜夜爽爽| 亚洲激情网站| 三级av免费观看| 成人性视频免费网站| 无码 人妻 在线 视频| 亚洲人成亚洲人成在线观看图片| 精品成人久久久| 欧美日韩国产精品自在自线| 天堂网2014av| 久久久av免费| 成人黄色免费短视频| av电影成人| 日韩欧美一区二区三区在线视频| cao在线观看| 精品一区二区久久| 中文字幕天堂av| 国产精品乱码一区二区三区软件| 日本在线视频免费| 制服丝袜亚洲网站| 国产在线观看免费| 欧美极品少妇xxxxⅹ裸体艺术 | 99久久久精品免费观看国产| 久久综合影院| 日韩xxxx视频| 国内精品在线播放| 在线观看日本中文字幕| 亚洲午夜av在线| 国产日韩一级片| 一本大道亚洲视频| 极品美鲍一区| 国产福利久久| 91精品综合| youjizzxxxx18| 久久久美女艺术照精彩视频福利播放| 久久久91视频| 91精品国产综合久久久久久久| 四虎永久在线精品免费网址| 久久成人一区二区| 久久精品 人人爱| 日本一区二区三区在线视频| 99国产精品视频免费观看一公开| 久久精品一二三四| 亚洲欧洲精品一区二区三区不卡| 亚洲精品久久久久久久蜜桃| 日韩成人激情视频| www.综合网.com| 2020国产精品久久精品不卡| 欧美电影一区| 美女在线视频一区二区| 国产三级久久久| 欧美一区二区三区久久久| 日韩精品视频在线观看网址| www.综合网.com| 国产日产精品一区二区三区四区| 亚洲久久久久| 交换做爰国语对白| 亚洲精品视频一区| 国产黄a三级三级三级| 久久久精品久久久| 国产一区二区三区亚洲综合| 在线免费观看成人网| 久久国产视频网| 2025国产精品自拍| 日韩一级欧美一级| 成人超碰在线| 久久大片网站| 久久久久久久高潮| 少妇人妻好深好紧精品无码| 在线免费观看不卡av| 国产乱视频在线观看| 国产精品视频成人| 天天综合久久| 杨幂一区二区国产精品| 一区二区三区欧美| 神马久久久久久久久久| 8090成年在线看片午夜| 亚洲黄页在线观看| 欧美特级aaa| 亚洲色图在线播放| 国产 日韩 欧美 综合| 青草青草久热精品视频在线网站 | 国产精品色呦| 国产白丝袜美女久久久久| 久久久久99精品一区| 波多野结衣黄色网址| 久久久精品2019中文字幕神马| 伊人久久影院| 北条麻妃在线一区| 中文字幕一区二区三| 丰满岳乱妇国产精品一区| 欧美一级片在线播放| 秋霞欧美视频| 成年人看片网站| 日韩欧美在线国产| 日本中文字幕视频在线| av资源站久久亚洲| 免费欧美在线| 国产天堂av在线| 日韩不卡中文字幕| 在线不卡一区| www.爱色av.com| 亚洲欧洲精品成人久久奇米网| 手机看片国产1024| 国产精品免费福利| 亚洲黄色影院| 国产视频精品免费| 亚洲精品www| 国产美女亚洲精品7777| 国产二级片在线观看| 中文字幕亚洲区| 色就是色亚洲色图| 亚洲最大的av网站| 久久激情网站| 免费在线一级片| 少妇久久久久久| 色天下一区二区三区| 中文字幕在线视频一区二区| 日本道免费精品一区二区三区| 色呦呦网站在线观看|