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

安全無憂!在 Spring Boot 3.3 中輕松實現 TOTP 雙因素認證

開發 架構
本 TOTP 注冊系統通過結合現代前端技術與穩健的后端架構,成功實現了高效、安全的用戶注冊流程。系統的設計充分考慮了安全性與用戶體驗,確保用戶在注冊過程中能夠快速獲取所需信息,而不影響安全標準。

隨著互聯網的快速發展,網絡安全問題日益嚴峻。傳統的用戶名和密碼認證方式已經無法滿足現代應用對安全性的要求,因此雙因素認證(2FA)成為了提升安全性的有效手段。雙因素認證不僅要求用戶輸入密碼,還需通過第二種方式進行身份驗證,例如手機生成的動態驗證碼。

時間同步一次性密碼(TOTP)是一種基于時間的雙因素認證方式,它通過算法生成短期有效的驗證碼。用戶在登錄時,需要輸入從手機應用(如 Google Authenticator)獲取的 TOTP 代碼。由于 TOTP 代碼每 30 秒更新一次,即使攻擊者獲取了用戶的密碼,沒有有效的 TOTP 代碼,也無法登錄賬戶。

本文將詳細介紹如何在 Spring Boot 3.3 中實現基于 TOTP 的雙因素認證,涵蓋從依賴配置、服務實現到前端展示的完整過程。

什么是 TOTP?

TOTP(Time-based One-Time Password)是一種用于雙因素認證的算法,它基于當前時間和用戶的共享秘密(密鑰)生成一次性密碼。TOTP 主要遵循以下步驟:

  1. 密鑰生成:在用戶賬戶創建時生成一個共享密鑰,并與用戶的身份綁定。該密鑰通常以 Base32 編碼格式存儲。
  2. 時間戳使用:TOTP 使用當前時間戳,將時間分成固定的時間段(例如,30 秒)。每個時間段生成一個唯一的 TOTP 密碼。
  3. 動態密碼生成:通過將共享密鑰和當前時間戳作為輸入,使用 HMAC-SHA1 或類似算法生成一次性密碼。
  4. 驗證過程:在用戶登錄時,服務器端也使用相同的共享密鑰和當前時間戳生成 TOTP 密碼,并與用戶輸入的密碼進行比對。

這種機制保證了每次登錄時生成的密碼都是唯一且短暫的,極大地提升了賬戶的安全性。

運行效果:

圖片

若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。

項目依賴配置

首先,在 pom.xml 中添加所需的依賴:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.icoderoad</groupId>
	<artifactId>totp-authentication</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>totp-authentication</name>
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
        <dependency>
            <groupId>dev.samstevens.totp</groupId>
            <artifactId>totp</artifactId>
            <version>1.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

配置文件

接下來,我們在 application.yml 中配置所需的屬性:

server:
  port: 8080
  
totp:
  time-step: 30
  length: 6

生成和配置密鑰

生成密鑰服務類

package com.icoderoad.totp.service;

import org.springframework.stereotype.Service;

import dev.samstevens.totp.secret.DefaultSecretGenerator;
import dev.samstevens.totp.secret.SecretGenerator;

@Service
public class SecretService {
    private final SecretGenerator secretGenerator = new DefaultSecretGenerator();

    public String generateSecret() {
        // 生成安全的隨機 base32 編碼字符串
        return secretGenerator.generate();
    }
}

屬性配置類

package com.icoderoad.totp.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

@Data
@Component
@ConfigurationProperties(prefix = "totp")
public class TotpProperties {
    private int timeStep = 30; // 默認值為 30 秒
    private int length = 6;     // 默認值為 6 位
}

配置 TOTP 生成器

package com.icoderoad.totp.service;

import com.icoderoad.totp.config.TotpProperties;
import dev.samstevens.totp.time.TimeProvider;
import dev.samstevens.totp.time.SystemTimeProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TotpConfiguration {

    private final TotpProperties totpProperties;

    public TotpConfiguration(TotpProperties totpProperties) {
        this.totpProperties = totpProperties;
    }

    @Bean
    public TimeProvider timeProvider() {
        return new SystemTimeProvider(); // 使用系統時間提供者
    }

    @Bean
    public int getTotpLength() {
        return totpProperties.getLength();
    }

    public int getTimeStepInSeconds() {
        return totpProperties.getTimeStep();
    }
}

TOTP 生成和驗證

TOTP 生成服務

package com.icoderoad.totp.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.icoderoad.totp.config.TotpProperties;

import dev.samstevens.totp.code.CodeGenerator;
import dev.samstevens.totp.code.DefaultCodeGenerator;
import dev.samstevens.totp.exceptions.CodeGenerationException;
import dev.samstevens.totp.time.SystemTimeProvider;
import dev.samstevens.totp.time.TimeProvider;

@Service
public class TotpGeneratorService {
	
	@Autowired
	private TotpProperties totpProperties;
	
    private final CodeGenerator codeGenerator;
    private final TimeProvider timeProvider;

    @Autowired
    public TotpGeneratorService(TimeProvider timeProvider) {
        this.timeProvider = timeProvider != null ? timeProvider : new SystemTimeProvider();
        this.codeGenerator = new DefaultCodeGenerator(); // 使用默認構造函數
    }

    public String generateTotp(String secret) {
        long counter = getCounter();
        try {
			return codeGenerator.generate(secret, counter);
		} catch (CodeGenerationException e) {
			return "";
		}
    }

    private long getCounter() {
        long timeStep = totpProperties.getTimeStep();
        return timeProvider.getTime() / timeStep;
    }
}

TOTP 驗證服務

package com.icoderoad.totp.service;

import dev.samstevens.totp.code.CodeVerifier;
import dev.samstevens.totp.code.DefaultCodeVerifier;
import dev.samstevens.totp.code.DefaultCodeGenerator;
import dev.samstevens.totp.exceptions.CodeGenerationException;
import dev.samstevens.totp.time.TimeProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.icoderoad.totp.config.TotpProperties;

@Service
public class TotpVerificationService {
    private final DefaultCodeVerifier codeVerifier;
    private final TimeProvider timeProvider;
    
	private final TotpProperties totpProperties;

    @Autowired
    public TotpVerificationService(TimeProvider timeProvider, TotpProperties totpProperties) {
    	this.totpProperties = totpProperties;
        this.timeProvider = timeProvider;
        this.codeVerifier = new DefaultCodeVerifier(new DefaultCodeGenerator(), timeProvider);
        this.codeVerifier.setTimePeriod(this.totpProperties.getTimeStep()); // 從配置文件中讀取或設置
        this.codeVerifier.setAllowedTimePeriodDiscrepancy( this.totpProperties.getLength() ); // 可配置的時間誤差
    }

    public boolean verifyTotp(String secret, String code) {
        return codeVerifier.isValidCode(secret, code);
    }
}

用戶注冊與 TOTP 集成

UserService 類

package com.icoderoad.totp.service;

import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class UserService {
    // 使用 HashMap 模擬用戶存儲(可以替換為數據庫實現)
    private final Map<String, String> userSecrets = new HashMap<>();

    /**
     * 保存用戶的 TOTP 秘密
     *
     * @param username 用戶名
     * @param secret   用戶的 TOTP 秘密
     */
    public void saveUserSecret(String username, String secret) {
        userSecrets.put(username, secret);
    }

    /**
     * 根據用戶名獲取 TOTP 秘密
     *
     * @param username 用戶名
     * @return TOTP 秘密
     */
    public String findSecretByUsername(String username) {
        return userSecrets.get(username);
    }

    // 可以添加更多與用戶相關的方法,如驗證用戶、獲取用戶信息等
}

QRCodeGenerator類

package com.icoderoad.totp.generator;

import org.springframework.stereotype.Component;

import dev.samstevens.totp.exceptions.QrGenerationException;
import dev.samstevens.totp.qr.QrData;
import dev.samstevens.totp.qr.ZxingPngQrGenerator;

@Component
public class QRCodeGenerator {

    private final ZxingPngQrGenerator qrGenerator;

    public QRCodeGenerator() {
        this.qrGenerator = new ZxingPngQrGenerator();
    }

    public byte[] generate(String secret, String username, String issuer, int digits, int period) throws QrGenerationException {
        // 創建 QR 數據
        QrData qrData = new QrData.Builder()
                .label(username)
                .secret(secret)
                .issuer(issuer)
                .digits(digits)
                .period(period)
                .build();

        // 生成 QR 代碼
        return qrGenerator.generate(qrData);
    }

    public String generateQrCodeUrl(String secret, String username, String issuer, int digits, int period) throws QrGenerationException {
        byte[] qrCodeBytes = generate(secret, username, issuer, digits, period);
        
        // 將生成的 QR 代碼轉換為 Base64 URL,便于在 HTML 中顯示
        return "data:image/png;base64," + java.util.Base64.getEncoder().encodeToString(qrCodeBytes);
    }
}

RegistrationResponse類

package com.icoderoad.totp.controller;

public class RegistrationResponse {
    private final String secret;
    private final String qrCodeUrl;

    public RegistrationResponse(String secret, String qrCodeUrl) {
        this.secret = secret;
        this.qrCodeUrl = qrCodeUrl;
    }

    public String getSecret() {
        return secret;
    }

    public String getQrCodeUrl() {
        return qrCodeUrl;
    }
}

注冊控制器

package com.icoderoad.totp.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.icoderoad.totp.dto.UserDto;
import com.icoderoad.totp.generator.QRCodeGenerator;
import com.icoderoad.totp.service.SecretService;
import com.icoderoad.totp.service.UserService;

import dev.samstevens.totp.exceptions.QrGenerationException;

@RestController
public class RegistrationController {

總結

本 TOTP 注冊系統通過結合現代前端技術與穩健的后端架構,成功實現了高效、安全的用戶注冊流程。系統的設計充分考慮了安全性與用戶體驗,確保用戶在注冊過程中能夠快速獲取所需信息,而不影響安全標準。總體而言,該系統不僅提升了用戶賬戶的安全性,也通過友好的操作流程增強了用戶的信任感,為未來的擴展和優化打下了堅實基礎。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2020-05-25 07:00:00

雙因素認證身份認證密碼

2022-08-01 00:08:03

雙因素認證2FA

2011-10-31 14:57:37

2022-11-10 19:49:29

2024-09-05 09:35:58

CGLIBSpring動態代理

2022-12-19 16:17:21

CDN

2013-06-19 11:26:39

2011-08-15 09:31:55

2021-12-28 11:13:05

安全認證 Spring Boot

2021-06-10 10:26:37

網絡安全/智慧醫療

2011-03-16 16:00:06

內網安全

2020-09-30 11:22:16

帳戶安全

2013-05-23 18:03:25

2024-10-07 08:18:05

SpringBOM管理

2023-04-25 10:59:56

2018-08-08 05:03:31

2020-12-24 17:12:29

賬戶安全雙因素認證Facebook

2025-05-13 07:13:25

點贊
收藏

51CTO技術棧公眾號

日韩电影在线观看电影| 在线高清av| 丁香网亚洲国际| 欧美在线视频观看| 国产jizz18女人高潮| 秋霞影院一区| 欧美影院精品一区| 2018中文字幕第一页| 国际av在线| 国产成人精品影院| 国产精品视频地址| 亚洲精品www久久久久久| 凹凸成人精品亚洲精品密奴| 欧美成人精品3d动漫h| 国产免费999| 黄色的视频在线观看| 国产精品丝袜一区| 久久久精品动漫| 国产夫妻性生活视频| 日韩精品一二三四| 91国内精品久久| 黄色一级免费视频| 久久高清精品| 亚洲天堂网站在线观看视频| 亚洲精品久久一区二区三区777 | 欧美日韩一二| 亚洲国产欧美一区二区丝袜黑人| 男生操女生视频在线观看| 欧美日韩大片| 欧美视频在线观看 亚洲欧| 成人在线免费观看视频网站| 欧美人xxx| 国产精品色一区二区三区| 韩国成人动漫在线观看| 国产激情无套内精对白视频| 六月婷婷色综合| 国产精品∨欧美精品v日韩精品| 久久久国产成人| 影视一区二区| 美女av一区二区| 欧美性x x x| 精品国产1区| 亚洲日韩中文字幕在线播放| av网站有哪些| 婷婷精品在线| 亚洲免费成人av电影| 亚洲av成人片色在线观看高潮 | 亚洲人线精品午夜| 熟女少妇一区二区三区| 亚州精品视频| 亚洲人午夜色婷婷| 国产伦理片在线观看| 精品大片一区二区| 中文字幕日韩精品在线| 男人的天堂av网| 日本一区二区在线看| 亚洲性69xxxbbb| 亚洲国产日韩av| 一区二区三区无码高清视频| 波多野结衣办公室双飞 | 91精品国产综合久久久久久蜜臀| 瑟瑟视频在线免费观看| 免费在线欧美视频| 9i在线看片成人免费| 91精品国产自产在线观看永久| 伊人免费在线观看| 九九久久精品视频| 国产福利一区二区三区在线观看| 丰满人妻一区二区三区免费| 菠萝蜜视频在线观看一区| 精品伦精品一区二区三区视频 | www.久久久久久久久| 精品国产一区二区三区四区精华 | 国产精品一区高清| 视频在线一区二区| 欧美黄色免费看| 国产精品久久久久久模特| 国产91色在线播放| 国产男女裸体做爰爽爽| 成人高清视频在线| 日韩高清av| h视频在线免费观看| 一区二区欧美国产| 国产激情在线观看视频| 亚洲成人毛片| 亚洲加勒比久久88色综合| 国产精品20p| 中文字幕一区二区三三| 久久人人爽人人| 久久这里只有精品9| 国产河南妇女毛片精品久久久 | 中文字幕人妻熟女人妻a片| 欧美美女啪啪| 久久人人爽人人爽人人片亚洲| 精品无码人妻一区二区三区| 久久午夜影视| 99国产在线视频| 免费在线看v| 亚洲乱码中文字幕| 别急慢慢来1978如如2| 视频免费一区二区| 在线日韩欧美视频| 日韩黄色在线视频| 国产一区二区三区av电影| 久久精品一二三区| 色老头在线观看| 欧美性生活影院| 少妇户外露出[11p]| 亚洲情侣在线| 国产精品黄视频| 少妇高潮久久久| 最新热久久免费视频| 青青青在线播放| 精品国产影院| 色与欲影视天天看综合网| 一二三区免费视频| 不卡视频免费播放| www国产免费| 日本精品久久| 国产一区二区三区视频| 五月婷婷视频在线| 99在线视频精品| 国产欧美精品aaaaaa片| 成人精品在线| 日韩有码在线播放| 色婷婷久久综合中文久久蜜桃av| 91蝌蚪porny| www.射射射| 99久久香蕉| 欧美高清视频免费观看| 国产黄色av网站| 亚洲精品免费在线播放| 亚洲一区二区中文字幕在线观看| 久久精品国产68国产精品亚洲| 欧美中文字幕在线视频| 四虎精品在永久在线观看| 亚洲一区在线视频| 久久久男人的天堂| 欧美激情在线| 成人免费视频视频在| 深夜国产在线播放| 精品精品欲导航| 久久久精品91| 99视频一区二区| 日韩欧美亚洲天堂| 色天天色综合| 日韩av高清不卡| 搞黄视频在线观看| 欧美视频在线观看一区二区| 国产又粗又猛又爽又黄的视频小说| 日韩中文字幕91| 亚洲第一在线综合在线| 丁香久久综合| 正在播放亚洲1区| 亚洲天堂久久久久| 亚洲同性gay激情无套| aaa一级黄色片| 欧美日韩国产高清| 国产一区在线免费| 成人美女视频| 中文字幕亚洲一区二区三区五十路| 亚洲熟女乱色一区二区三区久久久 | 一二三区精品| 欧美极品一区| 成人黄色免费观看| 久久九九有精品国产23| 不卡视频免费在线观看| 精品久久久久久久久久| 在哪里可以看毛片| 欧美诱惑福利视频| 精品在线视频免费| a在线欧美一区| 欧美韩国日本在线| 色喇叭免费久久综合| 91免费欧美精品| 激情在线视频播放| 日韩成人在线播放| 天天天天天天天干| 一区二区三区蜜桃网| 800av在线播放| 免费成人在线视频观看| 欧美一级爱爱视频| 亚洲福利天堂| 亚洲va国产va天堂va久久| f2c人成在线观看免费视频| 国产亚洲欧美日韩一区二区| 国产又大又长又粗| 欧美日韩色婷婷| 激情高潮到大叫狂喷水| 成人av在线播放网址| 牛夜精品久久久久久久| 亚洲成人中文| 亚洲人成77777| 国产精品xxxav免费视频| 国产精品精品一区二区三区午夜版| a级片国产精品自在拍在线播放| 日韩av在线免费| 91欧美日韩麻豆精品| 亚洲18女电影在线观看| 精品熟妇无码av免费久久| 成人av资源在线观看| 99re精彩视频| 免费视频一区| 久久久性生活视频| 久久精品久久久| 欧美日韩精品不卡| 动漫3d精品一区二区三区乱码| 国产精品无av码在线观看| a√中文在线观看| 欧美大尺度激情区在线播放| www日韩tube| 日韩电影中文字幕一区| www.激情五月| 欧美日本在线看| 国产免费www| 日韩欧美黄色动漫| 国产第一页第二页| 一区二区高清视频在线观看| 欧美自拍偷拍网| 国产欧美一区二区精品性色超碰 | 亚洲国产成人精品女人久久| 亚洲国产精品欧美一二99| 精品国产视频一区二区三区| 中文字幕不卡在线观看| 免费国产在线视频| 精品日韩欧美一区二区| 亚洲天堂777| 欧美在线高清视频| 久久国产视频精品| 欧美日韩另类视频| 日产精品久久久久久久| 亚洲午夜av在线| 精品无码一区二区三区电影桃花| 亚洲女同ⅹxx女同tv| 人人澡人人澡人人看| 国产精品国产自产拍在线| 2019男人天堂| 中文字幕欧美日韩一区| 变态另类ts人妖一区二区| 久久女同精品一区二区| 成人精品999| 国产色产综合产在线视频| 六月婷婷七月丁香| 国产网站一区二区| 91成人精品一区二区| 国产欧美日韩另类视频免费观看| 日韩一级av毛片| 中文字幕高清不卡| 欧美日韩色视频| 亚洲夂夂婷婷色拍ww47| 日本熟妇乱子伦xxxx| 狠狠色狠狠色综合日日五| 亚洲不卡视频在线观看| 日本高清成人免费播放| 亚洲天堂手机版| 日韩一区二区在线看| 丰满熟女一区二区三区| 亚洲国产91色在线| 精品久久久久一区二区三区| 中文字幕亚洲天堂| 成人免费在线| 韩日欧美一区二区| av有声小说一区二区三区| 国产精品视频xxxx| 日韩精品中文字幕吗一区二区| 成人在线免费观看一区| 琪琪久久久久日韩精品| 日本在线播放一区| 婷婷综合网站| 男人插女人视频在线观看| 久久久777| 一级淫片在线观看| 91丨九色porny丨蝌蚪| 呻吟揉丰满对白91乃国产区| 亚洲精品菠萝久久久久久久| 日韩免费黄色片| 欧美日韩专区在线| 亚洲精品国产av| 亚洲图片欧洲图片av| 国产一区久久精品| 欧美一级片在线播放| 91成人短视频在线观看| 国产亚洲一区二区三区在线播放| 九九久久成人| 久久香蕉视频网站| 视频精品一区二区| 在线播放国产视频| 国产欧美精品在线观看| 久久免费精彩视频| 欧美日韩免费高清一区色橹橹| 亚洲精品一区二区三区新线路| 亚洲人成在线观| 青春草视频在线| 国产精品嫩草影院久久久| 福利电影一区| 在线免费一区| 丝袜亚洲另类丝袜在线| 久草福利在线观看| 国产精品视频一二三区| 日韩精品人妻中文字幕| 在线不卡免费av| 国产一区二区三区不卡在线| 欧美国产日产韩国视频| 国产成人a视频高清在线观看| 国产一区二区自拍| 午夜亚洲福利| 鲁一鲁一鲁一鲁一av| 91原创在线视频| 国产亚洲精品久久777777| 欧美色图第一页| 国产视频三级在线观看播放| 久久青草福利网站| 一区二区视频| 男人天堂成人网| 美女视频网站久久| 久久久久亚洲av成人无码电影| 亚洲福利电影网| 超碰人人人人人人| 两个人的视频www国产精品| 国产成人午夜性a一级毛片| 欧美亚洲国产免费| 国产亚洲精品自拍| 国产精品果冻传媒| 夜夜精品浪潮av一区二区三区| 中文字幕无线码一区| 亚洲天堂免费视频| 日韩视频网站在线观看| 久久综合狠狠综合久久综青草| 亚洲欧洲综合| 日本一卡二卡在线| 性做久久久久久免费观看欧美| 亚洲精品一区二区三区区别| 欧美激情视频在线观看| 美女国产精品久久久| 国产又粗又硬又长| 国产呦萝稀缺另类资源| 亚洲av无一区二区三区| 欧美日韩国产综合一区二区 | 天堂va欧美ⅴa亚洲va一国产| 曰韩不卡视频| 国产美女主播视频一区| 国产高清在线免费观看| 日韩精品一区二区三区中文精品 | 日韩在线不卡| 中文字幕日韩综合| 亚洲欧美日韩久久精品| 国产福利资源在线| 久久久久久久激情视频| 久久电影在线| 国产一区亚洲二区三区| 久久精品人人做人人爽97| 中文字幕精品无| 深夜福利一区二区| 精品三级国产| 男人添女人下部高潮视频在观看| 白白色亚洲国产精品| caoporn国产| 中文字幕久精品免费视频| 综合久久伊人| 久久久亚洲精品无码| 久久久久久电影| 97超碰中文字幕| 久久久久久国产免费| 伊人久久大香线蕉综合网蜜芽| 亚洲最大综合网| 亚洲色大成网站www久久九九| 亚洲精品18在线观看| 日韩av电影在线播放| 午夜精品一区二区三区国产| 色哟哟在线观看视频| 五月激情综合色| 成人午夜在线观看视频| 91在线精品观看| 国产精品乱看| 91香蕉一区二区三区在线观看| 精品国产乱码久久久久久闺蜜| 亚洲性色av| 国产一级片91| 久久久精品日韩欧美| 国产手机视频在线| 欧美重口另类videos人妖| 午夜精品视频一区二区三区在线看| 国产精品成人99一区无码| 欧美视频你懂的| a级片免费在线观看| 亚洲欧美日韩综合一区| 成人视屏免费看| 97视频免费在线| 欧美在线亚洲在线| 欧美日韩免费| 综合 欧美 亚洲日本| 日韩av网站在线| 精品国产欧美| 中文字幕第36页| 天涯成人国产亚洲精品一区av| 黄色动漫在线观看| 日韩欧美一区二区视频在线播放| 成人性生交大合| 97在线公开视频| 国产精品亚洲美女av网站|