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

Spring Boot 開發(fā)者必看:輕松搞定許可證管控,讓項目變現(xiàn)無憂!

開發(fā) 項目管理
本文將帶你實(shí)現(xiàn)一個基于?Spring Boot 3.x + RSA2048 非對稱加密?的許可證管理方案,覆蓋?硬件綁定、權(quán)限控制、到期驗(yàn)證?等核心能力。我們將從整體架構(gòu)、技術(shù)選型,到代碼實(shí)現(xiàn)逐步拆解,并提供完整的 API 設(shè)計,幫助開發(fā)者快速構(gòu)建商業(yè)化必備的管控體系。

在軟件產(chǎn)品逐漸走向商業(yè)化的過程中,許可證管控已經(jīng)成為必不可少的環(huán)節(jié)。無論你是在構(gòu)建企業(yè)級管理系統(tǒng)、獨(dú)立桌面應(yīng)用,還是在線化的 SaaS 服務(wù),都需要一種可靠機(jī)制來限制授權(quán)范圍、控制功能模塊、以及設(shè)置到期時間。

缺少許可證機(jī)制,意味著你的軟件隨時可能被非法拷貝或無授權(quán)使用,直接威脅到商業(yè)收益與知識產(chǎn)權(quán)。而一個設(shè)計完善的許可證系統(tǒng)不僅能保證軟件安全,還能提供差異化定價策略,靈活支撐 按時間、按功能的付費(fèi)模式

因此,本文將帶你實(shí)現(xiàn)一個基于 Spring Boot 3.x + RSA2048 非對稱加密 的許可證管理方案,覆蓋 硬件綁定、權(quán)限控制、到期驗(yàn)證 等核心能力。我們將從整體架構(gòu)、技術(shù)選型,到代碼實(shí)現(xiàn)逐步拆解,并提供完整的 API 設(shè)計,幫助開發(fā)者快速構(gòu)建商業(yè)化必備的管控體系。

系統(tǒng)設(shè)計思路

許可證系統(tǒng)基于 非對稱加密,核心邏輯如下:

  • 廠商端:使用私鑰對許可證文件進(jìn)行簽名;
  • 客戶端:使用公鑰驗(yàn)證許可證真實(shí)性;

這樣做的優(yōu)勢:

  1. 安全性高:私鑰僅存儲在廠商側(cè),公鑰即使被泄露也無法偽造許可證;
  2. 部署靈活:支持 離線校驗(yàn),不依賴中央服務(wù)器;
  3. 擴(kuò)展性強(qiáng):可以靈活加上 功能點(diǎn)控制用戶數(shù)限制 等規(guī)則。

技術(shù)選型

  • 后端棧

Spring Boot 3.x → 快速開發(fā) Web API

Java Security API → 內(nèi)置 RSA 非對稱加密支持

Jackson → JSON 序列化和反序列化

  • 前端棧

原生 JavaScript → 保持輕量級

TailwindCSS → 快速構(gòu)建現(xiàn)代化 UI

RESTful API → 前后端標(biāo)準(zhǔn)交互

  • 加密算法

RSA2048 → 足夠安全的密鑰長度

SHA256withRSA → 數(shù)字簽名算法

Base64 → 簽名編碼

核心功能實(shí)現(xiàn)

以下代碼全部放在 Linux 風(fēng)格的目錄結(jié)構(gòu)中,例如:

src/main/java/com/icoderoad/license

硬件指紋獲取

硬件綁定是防止盜版的第一道防線。我們以主板序列號作為唯一標(biāo)識:

package com.icoderoad.license.util;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;


@Component
public class HardwareUtil {


    private static final Logger logger = LoggerFactory.getLogger(HardwareUtil.class);


    /**
     * 獲取主板序列號(Windows / Linux)
     */
    public String getMotherboardSerial() {
        String os = System.getProperty("os.name").toLowerCase();
        try {
            if (os.contains("windows")) {
                return getWindowsSerial();
            } else if (os.contains("linux")) {
                return getLinuxSerial();
            } else {
                logger.warn("不支持的系統(tǒng): {}", os);
                return "UNKNOWN";
            }
        } catch (Exception e) {
            logger.error("獲取主板序列號失敗", e);
            return "UNKNOWN";
        }
    }


    private String getWindowsSerial() throws Exception {
        Process process = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                line = line.trim();
                if (!line.isEmpty() && !"SerialNumber".equalsIgnoreCase(line)) {
                    return line;
                }
            }
        }
        process.waitFor();
        return "UNKNOWN";
    }


    private String getLinuxSerial() throws Exception {
        Process process = Runtime.getRuntime().exec("sudo dmidecode -s baseboard-serial-number");
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) {
            String line = reader.readLine();
            if (line != null && !line.contains("Not Specified")) {
                return line.trim();
            }
        }
        process.waitFor();
        return getLinuxSerialFromSys();
    }


    private String getLinuxSerialFromSys() {
        try {
            Process process = Runtime.getRuntime().exec("cat /sys/class/dmi/id/board_serial");
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) {
                String line = reader.readLine();
                return (line != null && !line.isEmpty()) ? line.trim() : "UNKNOWN";
            }
        } catch (Exception e) {
            logger.warn("讀取/sys失敗", e);
            return "UNKNOWN";
        }
    }
}

關(guān)鍵點(diǎn):

  • 多重策略:優(yōu)先 dmidecode,失敗則 fallback 到 /sys/class/dmi/id
  • 異常兜底:保證失敗返回 "UNKNOWN"
  • 統(tǒng)一編碼:避免中文亂碼

RSA 加密工具類

用于密鑰生成、簽名、驗(yàn)簽:

package com.icoderoad.license.crypto;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.*;
import java.util.Base64;


@Component
public class RSAUtil {


    private static final Logger logger = LoggerFactory.getLogger(RSAUtil.class);
    private static final String ALGORITHM = "RSA";
    private static final String SIGN_ALGO = "SHA256withRSA";


    public KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
        keyGen.initialize(2048);
        logger.info("RSA密鑰對生成完成");
        return keyGen.generateKeyPair();
    }


    public String sign(String data, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance(SIGN_ALGO);
        signature.initSign(privateKey);
        signature.update(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(signature.sign());
    }


    public boolean verify(String data, String sign, PublicKey publicKey) throws Exception {
        Signature signature = Signature.getInstance(SIGN_ALGO);
        signature.initVerify(publicKey);
        signature.update(data.getBytes(StandardCharsets.UTF_8));
        return signature.verify(Base64.getDecoder().decode(sign));
    }


    public PrivateKey loadPrivateKey(String pem) throws Exception {
        String key = pem.replaceAll("-----\\w+ PRIVATE KEY-----", "").replaceAll("\\s", "");
        byte[] decoded = Base64.getDecoder().decode(key);
        return KeyFactory.getInstance(ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(decoded));
    }


    public PublicKey loadPublicKey(String pem) throws Exception {
        String key = pem.replaceAll("-----\\w+ PUBLIC KEY-----", "").replaceAll("\\s", "");
        byte[] decoded = Base64.getDecoder().decode(key);
        return KeyFactory.getInstance(ALGORITHM).generatePublic(new X509EncodedKeySpec(decoded));
    }
}

許可證實(shí)體類

package com.icoderoad.license.model;


import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;


import java.time.LocalDate;
import java.util.List;


@JsonPropertyOrder({"subject", "issuedTo", "hardwareId", "expireAt", "features"})
public class License {


    private String subject;
    private String issuedTo;
    private String hardwareId;


    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate expireAt;


    private List<String> features;
    private String signature;


    // getters, setters, toString...
}

許可證服務(wù)邏輯

負(fù)責(zé) 生成許可證 和 驗(yàn)證許可證

package com.icoderoad.license.service;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.icoderoad.license.crypto.RSAUtil;
import com.icoderoad.license.model.License;
import com.icoderoad.license.util.HardwareUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;


import java.security.PrivateKey;
import java.security.PublicKey;
import java.time.LocalDate;


@Service
public class LicenseService {


    private static final Logger logger = LoggerFactory.getLogger(LicenseService.class);


    private final RSAUtil rsaUtil;
    private final HardwareUtil hardwareUtil;
    private final ObjectMapper objectMapper;


    public LicenseService(RSAUtil rsaUtil, HardwareUtil hardwareUtil, ObjectMapper objectMapper) {
        this.rsaUtil = rsaUtil;
        this.hardwareUtil = hardwareUtil;
        this.objectMapper = objectMapper;
    }


    public String generateLicense(License license, PrivateKey privateKey) throws Exception {
        if (license.getHardwareId() == null) {
            license.setHardwareId(hardwareUtil.getMotherboardSerial());
        }
        String data = objectMapper.writeValueAsString(license);
        String signature = rsaUtil.sign(data, privateKey);


        ObjectNode node = (ObjectNode) objectMapper.readTree(data);
        node.put("signature", signature);


        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(node);
    }


    public boolean verifyLicense(String licenseJson, PublicKey publicKey) {
        try {
            ObjectNode node = (ObjectNode) objectMapper.readTree(licenseJson);
            String signature = node.remove("signature").asText();
            License license = objectMapper.treeToValue(node, License.class);


            if (!rsaUtil.verify(objectMapper.writeValueAsString(license), signature, publicKey)) {
                return false;
            }
            if (!hardwareUtil.getMotherboardSerial().equals(license.getHardwareId())) {
                return false;
            }
            return !license.getExpireAt().isBefore(LocalDate.now());
        } catch (Exception e) {
            logger.error("驗(yàn)證失敗", e);
            return false;
        }
    }
}

REST API

package com.icoderoad.license.controller;


import com.icoderoad.license.service.LicenseService;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("/api/license")
@CrossOrigin
public class LicenseController {


    private final LicenseService licenseService;


    public LicenseController(LicenseService licenseService) {
        this.licenseService = licenseService;
    }


    @PostMapping("/generate")
    public String generateLicense() {
        // 簡化演示,實(shí)際需接收請求參數(shù)
        return "生成的許可證JSON...";
    }


    @PostMapping("/verify")
    public String verifyLicense(@RequestBody String licenseJson) {
        return licenseService.verifyLicense(licenseJson, null) ? "驗(yàn)證通過" : "驗(yàn)證失敗";
    }
}

總結(jié)

通過本文的實(shí)現(xiàn),我們構(gòu)建了一個 輕量級、可擴(kuò)展、安全可靠 的許可證管控系統(tǒng),核心特性包括:

  • 非對稱加密保障安全 → 私鑰只存廠商,客戶端僅驗(yàn)證公鑰
  • 硬件指紋綁定 → 防止許可證被隨意拷貝
  • 三重驗(yàn)證機(jī)制 → 簽名 + 硬件 + 時間
  • 離線驗(yàn)證能力 → 無需中心化服務(wù)器

這種設(shè)計既能保護(hù)軟件知識產(chǎn)權(quán),又能靈活支持商業(yè)化運(yùn)營(試用、訂閱、按功能收費(fèi))。 對于正計劃將軟件推向市場的開發(fā)者而言,這套方案是構(gòu)建 商業(yè)化閉環(huán) 的堅實(shí)基礎(chǔ)。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2013-09-04 09:21:04

2017-11-01 15:20:55

開源開源許可證

2023-03-19 15:51:25

開源開源許可證開發(fā)

2013-07-17 10:16:57

Github項目許可證

2025-02-14 08:30:49

SpringJava開發(fā)

2014-07-09 10:53:58

軟件許可證

2024-12-12 08:44:14

JabbaJDK工具

2024-08-09 08:52:26

2016-07-22 15:34:35

WindowsWin10開發(fā)者

2021-03-29 12:54:31

Ruby許可證代碼

2012-11-12 09:34:03

SDNOpenStackCloudStack

2011-05-05 09:41:56

開源軟件許可證

2009-07-23 09:25:28

SaaS成本

2014-10-23 17:36:19

百度

2011-08-04 10:32:33

Ruby 1.9.3BSD 許可證

2014-04-04 10:07:46

ApacheWinJS

2011-08-01 16:39:21

Xcode 目錄結(jié)構(gòu)

2018-08-24 09:32:15

開源技術(shù) 項目

2012-06-11 15:23:27

2014-12-19 10:04:12

華為
點(diǎn)贊
收藏

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

欧美一区二区二区| 中国av一区二区三区| 91高清视频在线免费观看| 蜜桃传媒一区二区亚洲av| 8av国产精品爽爽ⅴa在线观看| 国产精品久久久久久久久快鸭| 亚洲最大av在线| 久久久久久少妇| 久久理论电影| 日韩av在线网址| 亚洲免费999| 男人av在线播放| 国产精品盗摄一区二区三区| 国产欧美一区二区在线播放| 在线免费av网| 性色av一区二区怡红| 久久综合伊人77777蜜臀| 内射中出日韩无国产剧情| 91成人在线网站| 欧美性猛交xxxx乱大交| 国产精品一二三在线观看| 九色视频网站在线观看| 国产精品 日产精品 欧美精品| 国产97在线|日韩| 久久一区二区三| 国产精品精品| 亚洲午夜av久久乱码| 野战少妇38p| 国产一区二区在线观| 色狠狠色狠狠综合| av动漫在线看| 大桥未久在线播放| 亚洲欧美福利一区二区| 亚洲高清在线观看一区| 免费资源在线观看| 99久久99久久久精品齐齐| 91精品黄色| 一区二区精品视频在线观看| 秋霞av亚洲一区二区三| 日韩美女免费观看| 欧美日韩一二三四区| 亚洲国内自拍| 久久久久国产一区二区三区| 天天天天天天天天操| 日韩在线欧美| 日韩在线视频网站| 长河落日免费高清观看| 欧美日韩在线网站| 亚洲欧美日韩国产中文专区| 亚洲av网址在线| 神马午夜久久| 精品亚洲国产成av人片传媒| 自拍视频一区二区| 免费成人高清在线视频theav| 精品亚洲永久免费精品| 人妻丰满熟妇aⅴ无码| 欧美福利在线播放网址导航| 亚洲精品久久久久久久久久久久 | 蜜臀av一区二区在线观看| 日韩av免费网站| www.欧美色| 男人的天堂久久精品| 国产精品日日摸夜夜添夜夜av| 999视频在线| 裸体一区二区三区| 亚洲va电影大全| 亚洲精品综合久久| 99精品视频一区二区| 久久久免费看| shkd中文字幕久久在线观看| 综合在线观看色| 大桥未久一区二区三区| 男人天堂亚洲天堂| 午夜激情久久久| 大肉大捧一进一出好爽动态图| 欧美日韩免费观看视频| 欧美日韩国产综合一区二区三区| 国产福利精品一区二区三区| 日韩在线精品强乱中文字幕| 亚洲电影在线观看| 精品无码一区二区三区| 四季av在线一区二区三区| 欧美人与性动交| 精品免费囯产一区二区三区 | 精品成人av一区| 蜜臀av午夜一区二区三区| 欧美亚洲人成在线| 欧美成人a在线| 精品人妻一区二区三区香蕉| 色乱码一区二区三区网站| 欧美人与性动交| 中文字幕一区二区三区四区欧美| 激情偷乱视频一区二区三区| 国产日韩精品一区观看| avav免费在线观看| 亚洲第一综合色| 尤蜜粉嫩av国产一区二区三区| 深夜福利一区二区三区| 亚洲天堂av高清| 久久久91视频| 日本在线不卡一区| 国内精品久久久久久久果冻传媒| 婷婷在线视频| 欧美午夜丰满在线18影院| 精品亚洲视频在线| 国产亚洲一区二区三区啪| 超薄丝袜一区二区| 波多野结衣一区二区三区四区| 国产精品资源站在线| 日本黄网免费一区二区精品| 激情图片在线观看高清国产| 欧美三级三级三级| 亚洲一区二区观看| 欧美aⅴ99久久黑人专区| 国产成人黄色av| 蜜桃视频在线观看www| 国产精品日韩成人| 日韩av综合在线观看| 麻豆国产一区| 日韩一级黄色av| 欧美成人精品网站| 91亚洲精华国产精华精华液| 日韩一级免费看| vam成人资源在线观看| 亚洲欧美日韩天堂| 欧美极品视频在线观看| 美女mm1313爽爽久久久蜜臀| 免费h精品视频在线播放| 国产丝袜在线播放| 日韩欧美成人午夜| 极品久久久久久| 精品一区二区三区视频| 午夜精品美女久久久久av福利| 欧美另类老肥妇| 亚洲精品一区二区精华| 欧美激情国产精品免费| 国产精品一区二区久久不卡| 亚洲精品一区二| 国模一区二区| 国产亚洲免费的视频看| 免费看日批视频| 91麻豆蜜桃一区二区三区| 无码av天堂一区二区三区| 亚洲开心激情| 欧美激情二区三区| 不卡视频免费在线观看| 亚洲女女做受ⅹxx高潮| 91精品国产三级| 亚洲国产不卡| 亚洲精品日产aⅴ| 影音先锋男人资源在线| 日韩一区二区在线看| 麻豆视频在线观看| 成人综合在线观看| 久久精品xxx| 日韩高清影视在线观看| 欧美专区福利在线| 国产在线观看高清视频| 欧美亚洲综合另类| 久久久久人妻一区精品色| 精品伊人久久久久7777人| 中文字幕中文字幕一区三区| 久久综合偷偷噜噜噜色| 国产做受69高潮| 天堂资源最新在线| 在线观看日韩精品| 在线看的片片片免费| 国产成人综合视频| 热99这里只有精品| 精品免费一区二区| 亚洲va久久久噜噜噜久久天堂| 欧美性爽视频| 亚洲精品视频免费在线观看| 亚洲男人天堂网址| 亚洲精品免费在线| 国产精品第七页| 日韩av高清在线观看| 警花观音坐莲激情销魂小说| 国产精品丝袜在线播放| 国产成人精品久久二区二区91| 99re在线视频| 日韩欧美一二区| 国产精品第5页| 中文字幕在线观看一区| www.四虎在线| 蜜臀av性久久久久蜜臀av麻豆 | 中文字幕高清视频| 久久精品国内一区二区三区| 国内少妇毛片视频| 激情婷婷综合| 99久久一区三区四区免费| 天堂√8在线中文| 久久久精品免费| 青青青免费视频在线2| 91精品欧美综合在线观看最新| 日操夜操天天操| 国产精品久久免费看| 日韩少妇一区二区| 久久国产精品99久久久久久老狼| 水蜜桃色314在线观看| 欧美a级成人淫片免费看| 国产精品一区二区三区在线| 国产精品久久久久久久久久齐齐| 欧美黄色免费网站| 日本暖暖在线视频| 精品视频在线播放色网色视频| 国产农村妇女毛片精品久久| 色老汉一区二区三区| 久久精品国产亚洲AV无码麻豆| 中文字幕欧美激情| 亚洲图片综合网| 韩国一区二区三区| 999精品视频在线| 亚洲精选在线| 欧美视频在线第一页| 欧美激情偷拍自拍| 热re99久久精品国99热蜜月| 加勒比色老久久爱综合网| 91免费版网站入口| 国产精品麻豆成人av电影艾秋| 欧美亚洲一区在线| 欧美1—12sexvideos| 久久久精品在线观看| 国产理论电影在线观看| 亚洲欧美综合区自拍另类| 六月婷婷中文字幕| 日韩精品在线一区二区| 国产毛片毛片毛片毛片毛片| 欧美日韩精品二区第二页| 五月天婷婷导航| 欧美三级免费观看| 久草视频在线观| 性久久久久久久| 国产一级久久久| 亚洲一区视频在线| 妺妺窝人体色www聚色窝仙踪| 最近日韩中文字幕| 久久99久久99精品免费看小说| 中文字幕欧美日韩一区| jizz日本在线播放| 国产精品毛片久久久久久久| 成熟人妻av无码专区| 国产日产亚洲精品系列| 久久久视频6r| 国产女主播视频一区二区| 91成年人网站| 国产日韩欧美精品电影三级在线| 国产手机在线观看| 欧美国产日韩一二三区| 亚洲精品国产精品国自| 国产精品毛片无遮挡高清| 99热在线观看精品| 亚洲色图丝袜美腿| 久草中文在线视频| 午夜电影网亚洲视频| 国产精品视频久久久久久久| 狠狠久久亚洲欧美专区| 日韩一级在线视频| 欧美色区777第一页| 亚洲一区二区影视| 日韩欧美国产不卡| 天天干天天爱天天操| 亚洲精品视频免费| 亚洲成a人v欧美综合天堂麻豆| 久久影视免费观看 | 日韩理论电影| 亚洲国产精品女人| 国产主播一区| 国产成人精品视频免费看| 日韩在线一区二区| 99日在线视频| 91香蕉视频mp4| 影音先锋男人在线| 樱桃国产成人精品视频| 日本亚洲欧美在线| 欧美在线观看一区| 国产成人三级在线播放| 亚洲福利视频免费观看| 国产一级在线观看| 久热精品视频在线| 成人免费看黄| 2014国产精品| 伊人久久大香线蕉av不卡| 亚洲人成网站在线播放2019| 国产精品hd| 高清一区二区视频| 福利一区在线观看| 欧美人妻一区二区三区| 一区二区免费看| 337p粉嫩色噜噜噜大肥臀| 91精品国产福利在线观看| 国产精品国产高清国产| 日韩少妇与小伙激情| 色黄视频在线观看| 91久久国产精品| 国产videos久久| 免费看欧美黑人毛片| 老司机精品视频在线| 亚洲永久无码7777kkk| 亚洲欧美一区二区久久| 中文在线第一页| 精品少妇一区二区| 婷婷在线视频| 国产成人涩涩涩视频在线观看| 日韩中文字幕一区二区高清99| 日本精品一区二区三区高清 久久| 欧美视频在线观看| 一起操在线视频| 久久久久久久性| 91香蕉在线视频| 日韩一区二区在线看| 91精品专区| 日本亚洲欧洲色α| 牛牛精品成人免费视频| 在线观看18视频网站| 老司机免费视频一区二区| caopeng视频| 欧美性猛交xxxx富婆| 人妻无码一区二区三区久久99| 久久av在线看| 亚洲精品66| 亚洲一卡二卡三卡四卡无卡网站在线看| 亚洲美女一区| 美女搡bbb又爽又猛又黄www| 综合久久综合久久| 中文字幕日本视频| 亚洲欧美国产精品| 这里有精品可以观看| 国产一区二区高清不卡| 国产精品av久久久久久麻豆网| 色天使在线观看| 国产精品国产三级国产| 欧美日韩在线视频播放| 亚洲人成77777在线观看网| 在线视频cao| 欧美日韩一区在线视频| 久久久久久网| 亚洲久久久久久久| 在线观看网站黄不卡| 都市激情在线视频| 国产精品久久9| 欧美一区二区三| 国产精品自拍视频在线| 国产精品萝li| 91精品国产色综合久久不8| 日韩综合视频在线观看| 色综合久久久| 特级西西人体www高清大胆| 国产成人免费在线观看不卡| 久久综合色综合| 亚洲第一免费网站| 亚洲精品永久免费视频| 日本精品一区二区三区高清 久久| 日韩国产欧美一区二区三区| 亚洲精品91在线| 欧美日韩免费一区二区三区| 免费av毛片在线看| 91精品国产99久久久久久红楼| 国产精品s色| 久久久久亚洲AV成人无码国产| 亚洲www啪成人一区二区麻豆 | 日韩在线观看免费| 精品中文字幕一区二区三区四区 | 日韩欧美一二三四区| 国产传媒av在线| 青青草成人激情在线| 卡一卡二国产精品| 日韩黄色免费观看| 日韩大片免费观看视频播放| 亚洲精品一级二级| 中文字幕在线亚洲三区| 成熟亚洲日本毛茸茸凸凹| 国产免费av一区| 久久精品99国产精品酒店日本| 一区中文字幕| 无码人妻丰满熟妇区五十路百度| 国产精品沙发午睡系列990531| 精品国产亚洲AV| 日本久久久a级免费| 2023国产精品久久久精品双| 老司机免费视频| 欧美日韩国产高清一区二区三区| 国产后进白嫩翘臀在线观看视频| 欧美一区二区综合| 国产精品 欧美精品| 国产视频1区2区| 欧美久久久精品| 国产精品入口久久| 97免费公开视频| 91精品福利视频| 欧洲精品二区| 亚洲国产精品日韩| 成人免费视频免费观看| 中文字幕自拍偷拍| 亚洲 日韩 国产第一| 9999国产精品| 精品人妻少妇嫩草av无码| 欧美一区二区三区色| 国产精品迅雷| 全黄性性激高免费视频|