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

Spring Boot + AOP + Jasypt,三步實現敏感數據脫敏(附完整代碼)

開發 前端
我們實現了敏感數據的透明化處理,在保證業務邏輯完整性的同時,構建了多層次的數據安全防護體系。這種方案適用于金融、醫療、電商等對數據安全要求較高的領域,能夠有效滿足??GDPR、HIPAA??等合規性要求。?

方案背景

在企業級應用開發中,用戶敏感信息(如手機號、郵箱、密碼等)的保護至關重要。Spring Boot生態提供了Jasypt加密框架與AOP編程模型的組合方案,可在不侵入業務邏輯的前提下實現數據全生命周期的脫敏管理。

實現

加密工具類

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Sm4Utils {
    private static Pattern p = Pattern.compile("\\s*|\t|\r|\n");
    private static final Logger logger = LoggerFactory.getLogger(Sm4Utils.class);

    private Sm4Utils() {
    }

    public static Sm4Utils getInstance() {
        return new Sm4Utils();
    }

    public static String encryptSub(String plaintext, String seed, String offset, String sm2Type) {
        logger.info("SM4加密開始...");
        if ("CBC".equals(sm2Type)) {
            return encryptDataCbc(plaintext, seed, offset);
        } elseif ("ECB".equals(sm2Type)) {
            return encryptDataEcb(plaintext, seed);
        } else {
            logger.error("不存在此加密方式");
            return"";
        }
    }

    public static String decryptSub(String ciphertext, String seed, String offset, String sm4Type) {
        logger.info("SM4解密開始...");
        if ("CBC".equals(sm4Type)) {
            return decryptDataCbc(ciphertext, seed, offset);
        } elseif ("ECB".equals(sm4Type)) {
            return decryptDataEcb(ciphertext, seed);
        } else {
            logger.error("不存在此解密方式");
            return"";
        }
    }

    public static String encryptDataEcb(String plainText, String key) {
        try {
            Sm4Context ctx = new Sm4Context();
            ctx.isPadding = true;
            ctx.mode = 1;
            byte[] keyBytes = key.getBytes();
            Sm4 sm4 = new Sm4();
            sm4.sm4_setkey_enc(ctx, keyBytes);
            byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes("UTF-8"));
            String cipherText = (new BASE64Encoder()).encode(encrypted);
            if (cipherText != null && cipherText.trim().length() > 0) {
                Matcher m = p.matcher(cipherText);
                cipherText = m.replaceAll("");
            }

            return cipherText;
        } catch (Exception var9) {
            logger.error("ECB加密失敗", var9);
            return"";
        }
    }

    public static String decryptDataEcb(String cipherText, String key) {
        try {
            Sm4Context ctx = new Sm4Context();
            ctx.isPadding = true;
            ctx.mode = 0;
            byte[] keyBytes = key.getBytes();
            Sm4 sm4 = new Sm4();
            sm4.sm4_setkey_dec(ctx, keyBytes);
            byte[] decrypted = sm4.sm4_crypt_ecb(ctx, (new BASE64Decoder()).decodeBuffer(cipherText));
            return new String(decrypted, "UTF-8");
        } catch (Exception var7) {
            logger.error("ECB解密失敗", var7);
            return"";
        }
    }

    public static String encryptDataCbc(String plainText, String key, String offset) {
        try {
            Sm4Context ctx = new Sm4Context();
            ctx.isPadding = true;
            ctx.mode = 1;
            byte[] keyBytes = key.getBytes();
            byte[] ivBytes = offset.getBytes();
            Sm4 sm4 = new Sm4();
            sm4.sm4_setkey_enc(ctx, keyBytes);
            byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes("UTF-8"));
            String cipherText = (new BASE64Encoder()).encode(encrypted);
            if (cipherText != null && cipherText.trim().length() > 0) {
                Matcher m = p.matcher(cipherText);
                cipherText = m.replaceAll("");
            }

            return cipherText;
        } catch (Exception var11) {
            logger.error("CBC加密失敗", var11);
            return"";
        }
    }

    public static String decryptDataCbc(String cipherText, String key, String offset) {
        try {
            Sm4Context ctx = new Sm4Context();
            ctx.isPadding = true;
            ctx.mode = 0;
            byte[] keyBytes = key.getBytes();
            byte[] ivBytes = offset.getBytes();
            Sm4 sm4 = new Sm4();
            sm4.sm4_setkey_dec(ctx, keyBytes);
            byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, (new BASE64Decoder()).decodeBuffer(cipherText));
            return new String(decrypted, "UTF-8");
        } catch (Exception var9) {
            logger.error("CBC解密失敗", var9);
            return"";
        }
    }
}

自定義算法

public class Sm4Context {
    public int mode = 1;
    public long[] sk = new long[32];
    public boolean isPadding = true;

    public Sm4Context() {
    }
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;


public class Sm4 {

    public static final byte[] SboxTable = new byte[]{-42, -112, -23, -2, -52, -31, 61, -73, 22, -74, 20, -62, 40, -5, 44, 5, 43, 103, -102, 118, 42, -66, 4, -61, -86, 68, 19, 38, 73, -122, 6, -103, -100, 66, 80, -12, -111, -17, -104, 122, 51, 84, 11, 67, -19, -49, -84, 98, -28, -77, 28, -87, -55, 8, -24, -107, -128, -33, -108, -6, 117, -113, 63, -90, 71, 7, -89, -4, -13, 115, 23, -70, -125, 89, 60, 25, -26, -123, 79, -88, 104, 107, -127, -78, 113, 100, -38, -117, -8, -21, 15, 75, 112, 86, -99, 53, 30, 36, 14, 94, 99, 88, -47, -94, 37, 34, 124, 59, 1, 33, 120, -121, -44, 0, 70, 87, -97, -45, 39, 82, 76, 54, 2, -25, -96, -60, -56, -98, -22, -65, -118, -46, 64, -57, 56, -75, -93, -9, -14, -50, -7, 97, 21, -95, -32, -82, 93, -92, -101, 52, 26, 85, -83, -109, 50, 48, -11, -116, -79, -29, 29, -10, -30, 46, -126, 102, -54, 96, -64, 41, 35, -85, 13, 83, 78, 111, -43, -37, 55, 69, -34, -3, -114, 47, 3, -1, 106, 114, 109, 108, 91, 81, -115, 27, -81, -110, -69, -35, -68, 127, 17, -39, 92, 65, 31, 16, 90, -40, 10, -63, 49, -120, -91, -51, 123, -67, 45, 116, -48, 18, -72, -27, -76, -80, -119, 105, -105, 74, 12, -106, 119, 126, 101, -71, -15, 9, -59, 110, -58, -124, 24, -16, 125, -20, 58, -36, 77, 32, 121, -18, 95, 62, -41, -53, 57, 72};
    public static final int[] FK = new int[]{-1548633402, 1453994832, 1736282519, -1301273892};
    public static final int[] CK = new int[]{462357, 472066609, 943670861, 1415275113, 1886879365, -1936483679, -1464879427, -993275175, -521670923, -66909679, 404694573, 876298825, 1347903077, 1819507329, -2003855715, -1532251463, -1060647211, -589042959, -117504499, 337322537, 808926789, 1280531041, 1752135293, -2071227751, -1599623499, -1128019247, -656414995, -184876535, 269950501, 741554753, 1213159005, 1684763257};

    public Sm4() {
    }

    private long GET_ULONG_BE(byte[] b, int i) {
        long n = (long)(b[i] & 255) << 24 | (long)((b[i + 1] & 255) << 16) | (long)((b[i + 2] & 255) << 8) | (long)(b[i + 3] & 255) & 4294967295L;
        return n;
    }

    private void PUT_ULONG_BE(long n, byte[] b, int i) {
        b[i] = (byte)((int)(255L & n >> 24));
        b[i + 1] = (byte)((int)(255L & n >> 16));
        b[i + 2] = (byte)((int)(255L & n >> 8));
        b[i + 3] = (byte)((int)(255L & n));
    }

    private long SHL(long x, int n) {
        return (x & -1L) << n;
    }

    private long ROTL(long x, int n) {
        return this.SHL(x, n) | x >> 32 - n;
    }

    private void SWAP(long[] sk, int i) {
        long t = sk[i];
        sk[i] = sk[31 - i];
        sk[31 - i] = t;
    }

    private byte sm4Sbox(byte inch) {
        int i = inch & 255;
        byte retVal = SboxTable[i];
        return retVal;
    }

    private long sm4Lt(long ka) {
        long bb = 0L;
        long c = 0L;
        byte[] a = new byte[4];
        byte[] b = new byte[4];
        this.PUT_ULONG_BE(ka, a, 0);
        b[0] = this.sm4Sbox(a[0]);
        b[1] = this.sm4Sbox(a[1]);
        b[2] = this.sm4Sbox(a[2]);
        b[3] = this.sm4Sbox(a[3]);
        bb = this.GET_ULONG_BE(b, 0);
        c = bb ^ this.ROTL(bb, 2) ^ this.ROTL(bb, 10) ^ this.ROTL(bb, 18) ^ this.ROTL(bb, 24);
        return c;
    }

    private long sm4F(long x0, long x1, long x2, long x3, long rk) {
        return x0 ^ this.sm4Lt(x1 ^ x2 ^ x3 ^ rk);
    }

    private long sm4CalciRK(long ka) {
        long bb = 0L;
        long rk = 0L;
        byte[] a = new byte[4];
        byte[] b = new byte[4];
        this.PUT_ULONG_BE(ka, a, 0);
        b[0] = this.sm4Sbox(a[0]);
        b[1] = this.sm4Sbox(a[1]);
        b[2] = this.sm4Sbox(a[2]);
        b[3] = this.sm4Sbox(a[3]);
        bb = this.GET_ULONG_BE(b, 0);
        rk = bb ^ this.ROTL(bb, 13) ^ this.ROTL(bb, 23);
        return rk;
    }

    private void sm4_setkey(long[] SK, byte[] key) {
        long[] MK = new long[4];
        long[] k = new long[36];
        int i = 0;
        MK[0] = this.GET_ULONG_BE(key, 0);
        MK[1] = this.GET_ULONG_BE(key, 4);
        MK[2] = this.GET_ULONG_BE(key, 8);
        MK[3] = this.GET_ULONG_BE(key, 12);
        k[0] = MK[0] ^ (long)FK[0];
        k[1] = MK[1] ^ (long)FK[1];
        k[2] = MK[2] ^ (long)FK[2];

        for(k[3] = MK[3] ^ (long)FK[3]; i < 32; ++i) {
            k[i + 4] = k[i] ^ this.sm4CalciRK(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ (long)CK[i]);
            SK[i] = k[i + 4];
        }

    }

    private void sm4_one_round(long[] sk, byte[] input, byte[] output) {
        int i = 0;
        long[] ulbuf = new long[36];
        ulbuf[0] = this.GET_ULONG_BE(input, 0);
        ulbuf[1] = this.GET_ULONG_BE(input, 4);
        ulbuf[2] = this.GET_ULONG_BE(input, 8);

        for(ulbuf[3] = this.GET_ULONG_BE(input, 12); i < 32; ++i) {
            ulbuf[i + 4] = this.sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3], sk[i]);
        }

        this.PUT_ULONG_BE(ulbuf[35], output, 0);
        this.PUT_ULONG_BE(ulbuf[34], output, 4);
        this.PUT_ULONG_BE(ulbuf[33], output, 8);
        this.PUT_ULONG_BE(ulbuf[32], output, 12);
    }

    private byte[] padding(byte[] input, int mode) {
        if (input == null) {
            return null;
        } else {
            byte[] ret = (byte[])null;
            if (mode == 1) {
                int p = 16 - input.length % 16;
                ret = new byte[input.length + p];
                System.arraycopy(input, 0, ret, 0, input.length);

                for(int i = 0; i < p; ++i) {
                    ret[input.length + i] = (byte)p;
                }
            } else {
                int p = input[input.length - 1];
                ret = new byte[input.length - p];
                System.arraycopy(input, 0, ret, 0, input.length - p);
            }

            return ret;
        }
    }

    public void sm4_setkey_enc(Sm4Context ctx, byte[] key) throws Exception {
        if (ctx == null) {
            throw new Exception("ctx is null!");
        } elseif (key != null && key.length == 16) {
            ctx.mode = 1;
            this.sm4_setkey(ctx.sk, key);
        } else {
            throw new Exception("key error!");
        }
    }

    public void sm4_setkey_dec(Sm4Context ctx, byte[] key) throws Exception {
        if (ctx == null) {
            throw new Exception("ctx is null!");
        } elseif (key != null && key.length == 16) {
            ctx.mode = 0;
            this.sm4_setkey(ctx.sk, key);

            for(int i = 0; i < 16; ++i) {
                this.SWAP(ctx.sk, i);
            }

        } else {
            throw new Exception("key error!");
        }
    }

    public byte[] sm4_crypt_ecb(Sm4Context ctx, byte[] input) throws Exception {
        if (input == null) {
            throw new Exception("input is null!");
        } else {
            if (ctx.isPadding && ctx.mode == 1) {
                input = this.padding(input, 1);
            }

            int length = input.length;
            ByteArrayInputStream bins = new ByteArrayInputStream(input);

            ByteArrayOutputStream bous;
            byte[] output;
            for(bous = new ByteArrayOutputStream(); length > 0; length -= 16) {
                output = new byte[16];
                byte[] out = new byte[16];
                bins.read(output);
                this.sm4_one_round(ctx.sk, output, out);
                bous.write(out);
            }

            output = bous.toByteArray();
            if (ctx.isPadding && ctx.mode == 0) {
                output = this.padding(output, 0);
            }

            bins.close();
            bous.close();
            return output;
        }
    }

    public byte[] sm4_crypt_cbc(Sm4Context ctx, byte[] iv, byte[] input) throws Exception {
        if (iv != null && iv.length == 16) {
            if (input == null) {
                throw new Exception("input is null!");
            } else {
                if (ctx.isPadding && ctx.mode == 1) {
                    input = this.padding(input, 1);
                }

                int length = input.length;
                ByteArrayInputStream bins = new ByteArrayInputStream(input);
                ByteArrayOutputStream bous = new ByteArrayOutputStream();
                byte[] temp;
                byte[] out;
                int i;
                if (ctx.mode != 1) {
                    for(temp = new byte[16]; length > 0; length -= 16) {
                        out = new byte[16];
                        out = new byte[16];
                        byte[] out1 = new byte[16];
                        bins.read(out);
                        System.arraycopy(out, 0, temp, 0, 16);
                        this.sm4_one_round(ctx.sk, out, out);

                        for(i = 0; i < 16; ++i) {
                            out1[i] = (byte)(out[i] ^ iv[i]);
                        }

                        System.arraycopy(temp, 0, iv, 0, 16);
                        bous.write(out1);
                    }
                } else {
                    while(length > 0) {
                        temp = new byte[16];
                        out = new byte[16];
                        out = new byte[16];
                        bins.read(temp);

                        for(i = 0; i < 16; ++i) {
                            out[i] = (byte)(temp[i] ^ iv[i]);
                        }

                        this.sm4_one_round(ctx.sk, out, out);
                        System.arraycopy(out, 0, iv, 0, 16);
                        bous.write(out);
                        length -= 16;
                    }
                }

                temp = bous.toByteArray();
                if (ctx.isPadding && ctx.mode == 0) {
                    temp = this.padding(temp, 0);
                }

                bins.close();
                bous.close();
                return temp;
            }
        } else {
            throw new Exception("iv error!");
        }
    }
}

測試

String s = Sm4Utils.encryptSub("一安未來", "@yianweilai#$%^&", "1234567890123456", "CBC");
System.out.println(s);
System.out.println(Sm4Utils.decryptSub(s, "@yianweilai#$%^&", "1234567890123456", "CBC"));

cpudYch9orpFFc0uSxhg7g==
一安未來

String s1 = Sm4Utils.encryptSub("一安未來", "@yianweilai#$%^&", "", "ECB");
System.out.println(s1);
System.out.println(Sm4Utils.decryptSub(s1, "@yianweilai#$%^&", "", "ECB"));
  
RxV6VK9bNKEBqNFq0uVuqQ==
一安未來

擴展

引入依賴

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

自定義注解

字段加密注解(用于標記字段是否加密)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptFields {
    String[] value() default "";
}
方法加密注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedEncrypt {
}
方法解密注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedDecrypt {
}
實體類
@AllArgsConstructor
@Data
public class User {
    private Long id;
    private String username;
    private String password;
    @EncryptFields
    private String email;
}

AOP 切面實現

加密切面
@Aspect
@Component
public class EncryptAspect {
    @Autowired
    private StringEncryptor encryptor;

    @Around("@annotation(NeedEncrypt)")
    public Object encryptData(ProceedingJoinPoint joinPoint) throws Throwable {
        processParameters(joinPoint.getArgs());
        return joinPoint.proceed();
    }

    private void processParameters(Object[] args) {
        Arrays.stream(args)
             .filter(Objects::nonNull)
             .forEach(this::encryptObject);
    }

    private void encryptObject(Object object) {
        ReflectionUtils.doWithFields(object.getClass(), field -> {
            if (field.isAnnotationPresent(EncryptFields.class)) {
                field.setAccessible(true);
                ReflectionUtils.setField(field, object, encryptor.encrypt(field.get(object).toString()));
            }
        });
    }
}
解密切面
@Aspect
@Component
public class DecryptAspect {

    @Around("@annotation(NeedDecrypt)")
    public Object decryptData(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = joinPoint.proceed();
        return processResult(result);
    }

    private Object processResult(Object result) {
        if (result instanceof Collection) {
            ((Collection<?>) result).forEach(this::decryptObject);
        } elseif (result != null) {
            decryptObject(result);
        }
        return result;
    }

    private void decryptObject(Object object) {
        ReflectionUtils.doWithFields(object.getClass(), field -> {
            if (field.isAnnotationPresent(EncryptFields.class)) {
                field.setAccessible(true);
                ReflectionUtils.setField(field, object, Sm4Utils.decryptSub(field.get(object).toString(), "@yianweilai#$%^&", "", "ECB"));
            }
        });
    }
}

使用示例

@RestController
@RequestMapping("/api")
public class Sm4Controller {

    @NeedEncrypt
    @PostMapping("/user")
    public User saveUser(@RequestBody User user) {
        log.info("saveUser params:{}", user);
        // 業務處理邏輯
        return user;
    }

    @NeedDecrypt
    @GetMapping("/user")
    public User getUser() {
        // 從數據庫獲取加密數據
        User user = new User();
        user.setId(1L);
        user.setUsername("一安未來");
        user.setEmail(Sm4Utils.encryptSub("yianweilai@163.com", "@yianweilai#$%^&", "", "ECB"));
        log.info("getUser user:{}", user);
        return user;
    }
}


圖片圖片

總結

通過AOPJasypt的結合,我們實現了敏感數據的透明化處理,在保證業務邏輯完整性的同時,構建了多層次的數據安全防護體系。這種方案適用于金融、醫療、電商等對數據安全要求較高的領域,能夠有效滿足GDPR、HIPAA等合規性要求。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2023-06-06 08:51:06

2024-09-27 12:27:31

2020-10-25 09:04:46

數據加密數據泄露攻擊

2023-10-07 08:34:27

項目API接口

2024-01-01 14:19:11

2009-11-16 13:04:04

PHP上傳文件代碼

2021-09-16 10:11:15

Dataphin 數據保護

2021-10-28 09:42:38

代碼編碼開發

2010-09-25 08:55:29

2025-04-08 03:00:00

SpringDocker容器

2023-10-23 10:39:05

2023-07-21 12:48:37

2013-12-26 13:10:38

大數據NoSQL

2010-02-26 16:16:15

2010-04-20 20:53:35

實現網絡負載均衡

2025-04-03 07:06:35

2010-08-12 10:10:37

FlexMapABC

2009-11-10 12:55:26

VB.NET三維模型

2023-06-27 07:26:36

汽車之家敏感數據治理

2021-03-02 07:02:45

Linux操作系統
點贊
收藏

51CTO技術棧公眾號

91精品综合久久久久久五月天| 在线播放亚洲一区| 免费观看国产成人| 国产九色91回来了| 国产精品扒开腿做爽爽爽软件| 日韩高清人体午夜| 污片在线免费看| 男男gaygays亚洲| 国产免费成人在线视频| 懂色av一区二区三区在线播放| 可以在线观看av的网站| 欧美大人香蕉在线| 精品亚洲一区二区三区在线观看| 国内自拍第二页| 亚洲精品一区| 一区二区三区在线不卡| 水蜜桃亚洲一二三四在线| www.久久精品.com| 美女精品一区二区| 91国内在线视频| 青草草在线视频| 欧美日韩在线观看视频小说| 亚洲成人动漫在线播放| 狠狠干狠狠操视频| 88xx成人免费观看视频库| 亚洲一区二区三区精品在线| 椎名由奈jux491在线播放 | 亚洲精品福利视频| 国产成人强伦免费视频网站| 激情久久一区二区| 色综合久久综合网| 18禁免费观看网站| 女人天堂av在线播放| 中文字幕一区二区三区蜜月| 日韩欧美视频第二区| 亚州av在线播放| 成人免费的视频| 成人91视频| 99国产精品久久久久99打野战| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美一区二区三区免费视| 日本一区二区欧美| 国产一区久久| 久久久久久有精品国产| 免费中文字幕视频| 黄色成人精品网站| 欧美—级a级欧美特级ar全黄| 神马久久精品综合| 亚洲成人99| 欧美成人午夜剧场免费观看| 久久爱一区二区| 97人人精品| 久久天天躁狠狠躁夜夜躁| 亚洲熟女毛茸茸| 五月婷婷六月综合| 久久亚洲精品小早川怜子66| 中文字幕亚洲欧美日韩| 欧美精品三级| 久久久免费精品视频| 国产一级在线视频| 一区二区动漫| 国产国语刺激对白av不卡| 综合久久中文字幕| 国产一区二区三区免费| 99久久久精品免费观看国产| 懂色av蜜臀av粉嫩av分享吧| zzijzzij亚洲日本少妇熟睡| 欧美极品视频一区二区三区| 国产高清视频在线| ㊣最新国产の精品bt伙计久久| 超碰超碰超碰超碰超碰| 国产网红女主播精品视频| 精品久久久久久久久久| 黄色三级视频片| 一区二区三区日本视频| 亚洲成人xxx| 在线观看日本中文字幕| 亚洲欧美偷拍自拍| 97视频在线观看免费高清完整版在线观看| 天天干在线播放| 麻豆国产欧美日韩综合精品二区| 成人激情视频在线播放| 韩国av免费在线| 久久久久久久久久看片| 热这里只有精品| 国产精品电影| 欧美日韩二区三区| 小毛片在线观看| 日韩欧美精品综合| 国内精久久久久久久久久人| 中文字幕在线播| 国产精品一色哟哟哟| 精品国产乱码久久久久久蜜柚 | 国内精品视频一区| 糖心vlog精品一区二区| 成人动漫在线一区| 亚洲一区二区三区午夜| h片在线观看下载| 欧美手机在线视频| 五十路六十路七十路熟婆| 色综合久久网| 88国产精品欧美一区二区三区| 亚洲综合一区中| av网站一区二区三区| 伊人av成人| 欧美gay视频| 欧美白人最猛性xxxxx69交| 性欧美精品男男| 日韩午夜电影| 亚洲最大激情中文字幕| 成黄免费在线| 黑人巨大精品欧美一区免费视频| www.久久com| 色777狠狠狠综合伊人| 91福利视频在线观看| www日本高清视频| 亚洲国产精品传媒在线观看| 久草青青在线观看| 一区二区亚洲视频| 久久亚洲精品网站| 一区二区美女视频| 中文字幕不卡在线观看| 爱福利视频一区二区| youjizz亚洲| 久久久国产精品视频| 波多野结衣电影在线播放| 99免费精品在线观看| 91视频 - 88av| 精品国产伦一区二区三区观看说明| 一区二区三区四区精品| 国产成人无码一区二区在线播放| 成人av网站在线观看免费| 国产大尺度在线观看| 国产精品久久久久久久久免费高清| 精品伊人久久97| 五月婷婷亚洲综合| 97久久精品人人做人人爽| 精品国产av无码一区二区三区| 亚洲精品v亚洲精品v日韩精品| 久久久精品国产网站| 曰批又黄又爽免费视频| 国产精品久久网站| 中文字幕久久av| 久久久久亚洲| 亚洲伊人久久大香线蕉av| 国产写真视频在线观看| 欧美久久久一区| 午夜国产小视频| 国产综合色视频| 欧美交换配乱吟粗大25p| 精品久久亚洲| 欧美日韩国产成人| 性网爆门事件集合av| 亚洲国产精品自拍| 欧美成人三级伦在线观看| 亚洲视频大全| 日本免费一区二区三区| 国精产品一区二区三区有限公司| 一区二区三区无码高清视频| 中文字幕在线观看你懂的| 国产精品美女久久久久久 | 91丨porny丨国产入口| 少妇人妻大乳在线视频| 天堂日韩电影| 日韩av理论片| 欧美边添边摸边做边爱免费| 欧美一区二区久久久| 日韩毛片在线播放| 国产亚洲一区二区三区在线观看| 一区二区三区 日韩| 亚洲一区二区三区| 精品久久久久久乱码天堂| 欧美xxxxxx| 久久精品男人天堂| 男人天堂一区二区| 色婷婷激情综合| 国产精品国产三级国产传播| 国产成人av电影在线观看| 日本少妇高潮喷水视频| 欧美视频免费| 国产麻豆日韩| 日本欧美韩国| 色综合91久久精品中文字幕| 亚洲三级黄色片| 欧美精品v国产精品v日韩精品| 国产无遮挡又黄又爽| 国产片一区二区三区| 99视频在线观看视频| 西西人体一区二区| 国产欧美自拍视频| 亚洲免费成人av在线| 91在线视频免费| 在线天堂中文资源最新版| 日韩视频永久免费观看| 天天干天天色天天| 欧美电影影音先锋| 中文在线第一页| 亚洲曰韩产成在线| 日本免费www| 99精品视频一区| 日本一本在线视频| 欧美a级一区二区| 国产午夜大地久久| 亚洲综合自拍| 日产国产精品精品a∨| 成人av动漫| 亚洲free性xxxx护士白浆| 欧洲av不卡| 久久久久久亚洲| 在线āv视频| 最新国产精品拍自在线播放| 日韩a在线看| 精品国产精品一区二区夜夜嗨| 92久久精品一区二区| 日韩欧美在线看| 91久久国产视频| 亚洲激情中文1区| 91制片厂在线| 国产拍欧美日韩视频二区| 色噜噜在线观看| 成人aaaa免费全部观看| 色欲无码人妻久久精品| 蜜臀久久99精品久久久久宅男| 日本a级片免费观看| 一区久久精品| 丁香六月激情婷婷| 你懂的国产精品| 中文字幕超清在线免费观看| 青青草成人影院| 日韩国产美国| 欧洲乱码伦视频免费| 日本一区二区三区精品视频| 亚洲国产最新| 日本免费高清一区二区| 免费一区二区| 欧美在线日韩精品| 伊人久久大香线蕉av不卡| 久久久久久亚洲精品不卡4k岛国 | 玖玖精品在线视频| 久久久国产精品| 正在播放一区二区三区| 欧美激情国产在线| 在线天堂一区av电影| 91欧美大片| 偷拍盗摄高潮叫床对白清晰| 国产精品97| 青青草影院在线观看| 重囗味另类老妇506070| 国产精品久久久影院| 国产精品va| 北条麻妃69av| 视频在线观看91| 激情 小说 亚洲 图片: 伦| 美腿丝袜亚洲色图| 久久综合在线观看| 国产成人av福利| 亚洲第一黄色网址| 久久精品一二三| 亚洲欧美综合7777色婷婷| 日韩美女视频19| 久久精品波多野结衣| 亚洲国产精品麻豆| www五月天com| 欧美精品日韩一本| 黄色成人一级片| 日韩精品一区二区视频| 国产女人在线视频| 日韩在线免费观看视频| 丝袜在线观看| 91精品国产免费久久久久久 | 91传媒视频免费| 韩国精品福利一区二区三区| 久久久国产精品无码| 97精品视频| 黄色片免费在线观看视频| 伊人蜜桃色噜噜激情综合| 欧美 日韩精品| 激情五月激情综合网| av漫画在线观看| 国产三级三级三级精品8ⅰ区| 182在线观看视频| 亚洲国产美国国产综合一区二区| 日韩在线 中文字幕| 3d动漫精品啪啪1区2区免费 | 国产一区二区三区高清播放| 先锋资源av在线| 国产精品美女一区二区| 国产无码精品在线播放| 欧美日韩国产高清一区二区三区 | 26uuu国产精品视频| 午夜精品久久久久久毛片| 精品国产乱码久久久久久108| 欧美丰满老妇| 无码aⅴ精品一区二区三区浪潮| 韩国欧美一区二区| 少妇精品一区二区三区| 一区二区三区精品视频在线| 国产精品国产精品国产| 亚洲第一免费网站| 男人在线资源站| 日韩美女av在线免费观看| 日本伊人久久| 亚洲激情一区二区三区| 国产精品毛片| 成人欧美精品一区二区| 国产精品久久久久婷婷| 国产精品免费精品一区| 欧美大片免费久久精品三p| 最新国产在线观看| 日本精品久久久| 麻豆精品99| 在线观看av的网址| 黄一区二区三区| 欧美xxxx精品| 色激情天天射综合网| 天天干视频在线观看| 欧美黑人又粗大| 免费精品一区| 在线视频91| 麻豆国产91在线播放| 亚洲av无码一区二区二三区| 亚洲第一成年网| 午夜精品小视频| 欧美另类极品videosbest最新版本| 久久精品 人人爱| 亚洲国产精品www| 日日摸夜夜添夜夜添精品视频| 精品无码国产一区二区三区51安| 亚洲一区在线观看视频| jizz中国少妇| 美女视频久久黄| 精品国产一级| 激情成人开心网| 丁香婷婷综合五月| 精品爆乳一区二区三区无码av| 91精品婷婷国产综合久久竹菊| 麻豆影视在线观看_| 91青草视频久久| 欧美高清不卡| 久久精品aⅴ无码中文字字幕重口| 夜夜爽夜夜爽精品视频| 99热这里是精品| 欧美日韩国产123| 好吊妞国产欧美日韩免费观看网站| 少妇高潮毛片色欲ava片| 波多野结衣视频一区| 少妇一级淫片免费放中国 | 亚洲av无码一区二区三区人| 色综合久久久久网| 国产黄色片在线播放| 国产色综合天天综合网| 五月天激情综合网| 韩国av中国字幕| 欧美日韩国产色视频| 国产视频福利在线| 91久久国产精品| 亚洲午夜激情在线| 网站免费在线观看| 91激情在线视频| 超碰在线caoporn| 国产精品视频免费一区| 先锋影音久久| 91 在线视频| 亚洲成人av在线| 欧美电影h版| 中文字幕在线亚洲精品| 成人午夜av电影| 国产精品熟女视频| 日韩在线观看免费高清完整版| 玖玖精品一区| 116极品美女午夜一级| 国产精品久久久久aaaa樱花 | av在线一区二区三区| 成年人视频免费| 久久福利视频网| 亚欧洲精品视频在线观看| 一级片视频免费观看| 亚洲综合一区二区三区| 美丽的姑娘在线观看免费动漫| 成人激情免费在线| 一区二区三区高清视频在线观看| 国产精品久久久视频| 精品国产1区二区| 91av一区| 日本国产在线播放| 国产精品不卡一区| 凸凹人妻人人澡人人添| 国产日韩欧美电影在线观看| 亚洲人妖在线| 日韩在线视频网址| 精品亚洲精品福利线在观看| 亚洲热av色在线播放| 国内性生活视频| 亚洲激情中文1区| av在线播放网| 国模一区二区三区私拍视频| 久久成人免费日本黄色| av资源免费观看| 欧美大片大片在线播放| 日本一区二区在线看|