色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網運營的一線實戰(zhàn)洞察。

Spring Boot系統(tǒng)屬性解密:屬性源優(yōu)先級與解密層實踐

Spring Boot系統(tǒng)屬性解密:屬性源優(yōu)先級與解密層實踐 寫在最前面系統(tǒng)屬性這層東西平時誰都不會特意去看它可一旦里面塞了加密值問題就會變得很別扭——配置文件里寫明文的那套經驗全失效了。前段時間我接手一個項目運維在啟動腳本里用-D傳了一串加密后的數(shù)據(jù)庫口令結果 Spring 容器起來之后拿到的還是密文連接池直接報認證失敗。后來折騰了大半天才把整條鏈路捋順索性把過程整理一下從屬性源的優(yōu)先級、解密層的插入位置到幾個幾乎必踩的坑一次說清楚。這篇內容適合已經寫過 Spring Boot、但沒系統(tǒng)研究過屬性加載鏈路的朋友也適合正在給老項目補安全加固的同學照著做。1. 系統(tǒng)屬性在 Spring Boot 屬性鏈路里的真實位置1.1 一次 setProperty 之后值究竟被誰讀走了System.setProperty(key, value)寫進去的東西本質上是 JVM 全局的一張Properties表底層是Hashtable進程內所有線程共享生命周期跟 JVM 一致。Spring Boot 在啟動早期會把這張表包裝成一個PropertySource名字固定叫systemProperties塞進MutablePropertySources里。你后面寫的Value(${xxx})、ConfigurationProperties、environment.getProperty(xxx)最終都會順著這條鏈一路找下來。關鍵在于包裝這兩個字。Spring 拿到的不是你原始那張Properties而是一個只讀視圖getProperty每次調用都會實時去問 JVM。也就是說你在容器啟動之后調System.setPropertyenvironment.getProperty是能立刻讀到新值的。但已經完成綁定的 Bean、已經解析完的占位符不會自動刷新這一點后面會專門講。理解這一層很重要。很多人以為系統(tǒng)屬性就是環(huán)境變量的小名其實兩者在 Spring Boot 里是兩個獨立的屬性源名字分別是systemProperties和systemEnvironment優(yōu)先級也不一樣系統(tǒng)屬性排在環(huán)境變量前面。這個順序直接決定了你的加密值會不會被別的配置蓋掉。1.2 屬性源優(yōu)先級決定了你的加密值會被誰覆蓋Spring Boot 的屬性源是有明確順序的靠前的優(yōu)先。下面這張表是我實際排查時整理的只列了日常最常撞上的幾層優(yōu)先級屬性源典型來源1命令行參數(shù)--app.secret.xxx...2SPRING_APPLICATION_JSON環(huán)境變量里的 JSON3Servlet 相關參數(shù)少見4JNDI少見5systemProperties-Dkeyvalue、System.setProperty6systemEnvironment操作系統(tǒng)環(huán)境變量7random.*隨機值8外部配置文件jar 同級的application.yml9jar 內配置文件classpath:/application.yml10PropertySource代碼里聲明的11默認值SpringApplication.setDefaultProperties從這個順序能看出來兩件事。第一系統(tǒng)屬性天然壓過application.yml你在配置文件里寫同名 key 是蓋不住它的這是好事方便運維用啟動參數(shù)覆蓋。第二命令行參數(shù)又壓過系統(tǒng)屬性所以如果有人用--app.secret.xxx明文啟動你的加密邏輯就白做了——這一點在做兜底校驗時值得加一條判斷。還有個容易忽略的細節(jié)Profile 相關的配置文件application-prod.yml排在同名非 Profile 文件前面但它們整體都排在系統(tǒng)屬性之后。所以只要 key 對得上系統(tǒng)屬性永遠贏。這也解釋了為什么有些團隊喜歡把所有敏感配置都通過-D注入而不是寫進配置文件。1.3 三個必須提前想清楚的時間點做加解密之前有三個時間點必須先確認否則代碼寫得再漂亮也不生效。設置時間點System.setProperty是在SpringApplication.run()之前、之中還是之后調的之前最穩(wěn)Spring 能完整讀到之中取決于具體階段之后只能保證environment.getProperty讀到已經綁定的 Bean 拿不到。解密層插入時間點解密邏輯必須插在所有讀取動作之前。Spring Boot 提供了EnvironmentPostProcessor、ApplicationContextInitializer、BeanFactoryPostProcessor三個常見鉤子它們的執(zhí)行階段完全不同選錯了就會出現(xiàn)配置文件里的能解密、系統(tǒng)屬性里的不能這種詭異現(xiàn)象。占位符解析時間點Value的占位符由PropertySourcesPlaceholderConfigurer在 Bean 實例化階段解析晚于環(huán)境準備。所以只要在環(huán)境準備階段把屬性源包一層Value就能拿到解密值。我見過最典型的翻車方式是在某個PostConstruct方法里調System.setProperty塞密鑰然后指望Value能讀到。結果 Bean 初始化順序稍微一變讀到的就是 null。這類問題排查起來極其費勁因為不報錯只是值不對。2. 方案選型三種落地路徑的邊界與取舍2.1 路徑一在設置源頭就地解密最直接的做法是在main方法里、SpringApplication.run之前把系統(tǒng)屬性里的加密值解密后重新setProperty回去。代碼大概長這樣public static void main(String[] args) { decryptSystemProperties(); SpringApplication.run(DemoApplication.class, args); } private static void decryptSystemProperties() { Properties props System.getProperties(); for (String name : props.stringPropertyNames()) { String raw props.getProperty(name); if (raw ! null raw.startsWith(enc:v1:)) { System.setProperty(name, AesGcmCipher.decrypt(raw)); } } }這段代碼的優(yōu)勢是簡單、無框架依賴、執(zhí)行時機絕對早。缺點是它會把解密后的明文回寫到 JVM 系統(tǒng)屬性里任何能讀System.getProperties()的代碼包括某些診斷工具都能看到明文。另外它只處理系統(tǒng)屬性配置文件里的加密值管不著如果你的項目兩種來源都有就得維護兩套邏輯。這條路徑適合什么場景我總結下來是項目規(guī)模小、敏感配置全部走啟動參數(shù)、團隊不想引入額外依賴。反過來說如果配置文件里也有加密值或者需要按環(huán)境切換密鑰版本就別選它了后期會很難受。2.2 路徑二用 Jasypt 兜住所有屬性源Jasypt 的 Spring Boot Starter 是這類需求里出場率最高的方案。它的思路是提供一個EncryptablePropertySourceConverter在容器 refresh 之前把所有PropertySource逐個包一層讀取時遇到ENC(...)包裹的值就解密。配置成本很低加個依賴、配個密鑰就行。它對系統(tǒng)屬性同樣有效因為systemProperties也在被包裝的名單里。我實測過-Dapp.secret.db-passwordENC(xxx)這種寫法Spring 讀出來是解密后的值。具體流程是EnableEncryptablePropertiesBeanFactoryPostProcessor在BeanFactory后置處理階段觸發(fā)屬性源轉換此時Environment已經準備好了所以Value和ConfigurationProperties都能拿到明文。但 Jasypt 有幾個需要提前知道的邊界。它的密鑰本身要通過jasypt.encryptor.password配置這個值如果也從系統(tǒng)屬性來就得保證包裝之前已經就位它的默認算法是PBEWITHHMACSHA512ANDAES_256需要 BouncyCastle 支持JDK 版本低的項目要額外引依賴它對值的前綴匹配是ENC(開頭、)結尾如果你的密文里恰好包含這個模式會被二次解密產生莫名其妙的錯誤。還有一個隱蔽的問題Jasypt 的包裝發(fā)生在BeanFactory后置處理階段比EnvironmentPostProcessor晚。如果某個EnvironmentPostProcessor在更早的階段就要讀加密屬性比如決定加載哪個配置文件那時候還是密文。這種情況雖然少見但一旦碰上就很難定位。2.3 路徑三自己包裝 PropertySource第三種是自己寫一個EnvironmentPostProcessor在環(huán)境準備階段遍歷所有屬性源把需要處理的那幾個替換成解密包裝器。這種做法可控性最高能精確控制包裝哪些源、能自定義密文前綴、能支持密鑰版本、能在解密失敗時給出明確日志。代價是要自己寫代碼大概一百多行包括一個加解密工具類、一個PropertySource包裝器、一個EnvironmentPostProcessor實現(xiàn)和注冊文件。聽著多其實拆開看每一塊都不復雜后面第三章會給出完整實現(xiàn)。這條路徑適合對安全有明確要求、或者需要和現(xiàn)有密鑰管理流程對接的項目。比如你的密鑰來自某個配置中心需要在啟動時拉取那用自定義處理器就比 Jasypt 靈活得多。2.4 三條路徑的橫向對比維度源頭就地解密Jasypt Starter自定義 PropertySource實現(xiàn)成本極低低中覆蓋配置文件否是是覆蓋系統(tǒng)屬性是是是密鑰版本支持需自己實現(xiàn)弱強明文殘留會回寫系統(tǒng)屬性不回寫不回寫執(zhí)行時機最早較晚可調排查難度低中中選型上我的建議是新項目、配置來源統(tǒng)一走啟動參數(shù)的選路徑一夠用且省事已經在用 Spring Boot 且只想快速補上的選 Jasypt對密鑰輪換、審計日志有要求的老老實實寫自定義處理器。三條路徑也可以混用比如配置文件走 Jasypt、系統(tǒng)屬性走源頭解密但混用會讓排查變復雜不建議。3. 手寫一個能識別系統(tǒng)屬性的解密層3.1 先寫一個靠譜的 AES-GCM 工具類算法選擇上我不推薦再用PBEWithMD5AndDES這個在 Jasypt 老版本里是默認值強度已經不夠看了。直接上AES/GCM/NoPadding帶認證標簽能同時防篡改。public final class AesGcmCipher { private static final String TRANSFORMATION AES/GCM/NoPadding; private static final int IV_LENGTH 12; private static final int TAG_LENGTH_BIT 128; private static final String PREFIX enc:v1:; private static final SecureRandom RANDOM new SecureRandom(); private AesGcmCipher() { } public static String encrypt(String plain, SecretKey key) throws Exception { byte[] iv new byte[IV_LENGTH]; RANDOM.nextBytes(iv); Cipher cipher Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH_BIT, iv)); byte[] cipherText cipher.doFinal(plain.getBytes(StandardCharsets.UTF_8)); ByteBuffer buffer ByteBuffer.allocate(iv.length cipherText.length); buffer.put(iv).put(cipherText); return PREFIX Base64.getUrlEncoder().withoutPadding() .encodeToString(buffer.array()); } public static String decrypt(String encoded, SecretKey key) throws Exception { if (encoded null || !encoded.startsWith(PREFIX)) { return encoded; } byte[] all Base64.getUrlDecoder() .decode(encoded.substring(PREFIX.length())); ByteBuffer buffer ByteBuffer.wrap(all); byte[] iv new byte[IV_LENGTH]; buffer.get(iv); byte[] cipherText new byte[buffer.remaining()]; buffer.get(cipherText); Cipher cipher Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH_BIT, iv)); return new String(cipher.doFinal(cipherText), StandardCharsets.UTF_8); } }幾個點值得說明。Base64.getUrlEncoder()用的是 URL 安全字符集把和/換成了-和_這樣密文丟進啟動腳本、環(huán)境變量、URL 查詢串都不會被轉義。我就吃過這個虧標準 Base64 里的在某個 CI 平臺的變量傳遞環(huán)節(jié)被轉成了空格解密直接報填充異常查了兩小時。前綴enc:v1:有兩個作用一是避免誤傷普通值二是為密鑰輪換預留版本號。以后換密鑰就上enc:v2:解密時按版本選對應密鑰老數(shù)據(jù)不用一次性全刷。IV 長度選 12 字節(jié)是 GCM 的推薦值性能最好。認證標簽 128 位是標準配置別為了省幾個字節(jié)改成 96 位收益微乎其微。3.2 包裝屬性源時的關鍵選擇Enumerable 不能丟寫包裝器的時候有個坑必須提前避開如果你把一個EnumerablePropertySource包裝成普通的PropertySourcegetPropertyNames()就返回不了了。后果是ConfigurationProperties的寬松綁定失效、Environment.getProperty的下標查找失效、actuator 的/env端點看不到這些屬性。所以包裝類要按源的類型分兩種實現(xiàn)或者直接寫一個繼承EnumerablePropertySource的版本public class DecryptingPropertySource extends EnumerablePropertySourcePropertySource? { private final SecretResolver resolver; private final PredicateString keyFilter; public DecryptingPropertySource(String name, PropertySource? source, SecretResolver resolver, PredicateString keyFilter) { super(name, source); this.resolver resolver; this.keyFilter keyFilter; } Override public Object getProperty(String name) { Object value source.getProperty(name); if (value instanceof String str keyFilter.test(name)) { return resolver.resolve(str); } return value; } Override public String[] getPropertyNames() { if (source instanceof EnumerablePropertySource? enumerable) { return enumerable.getPropertyNames(); } return new String[0]; } Override public boolean containsProperty(String name) { return source.containsProperty(name); } }SecretResolver負責真正的解密內部加一層ConcurrentHashMap緩存同一個密文只解一次。啟動階段屬性可能被讀幾百次緩存能省下不少開銷。public class SecretResolver { private final MapString, SecretKey keys; private final MapString, String cache new ConcurrentHashMap(); public SecretResolver(MapString, SecretKey keys) { this.keys keys; } public String resolve(String raw) { if (raw null || !raw.startsWith(enc:)) { return raw; } return cache.computeIfAbsent(raw, this::doResolve); } private String doResolve(String raw) { String version raw.substring(4, raw.indexOf(:, 4)); SecretKey key keys.get(version); if (key null) { throw new IllegalStateException(未找到密鑰版本: version); } try { return AesGcmCipher.decrypt(raw, key); } catch (Exception e) { throw new IllegalStateException(屬性解密失敗請檢查密鑰與密文是否匹配, e); } } }注意異常信息里不要帶明文也不要帶完整密文。帶上密鑰版本號就夠了生產日志里泄露密文等于泄露了一半信息。3.3 EnvironmentPostProcessor 的注冊和生效時機處理器本身很簡單核心是遍歷屬性源、替換、保持順序public class DecryptingEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { SecretResolver resolver SecretKeyLoader.load(environment); MutablePropertySources sources environment.getPropertySources(); ListString names new ArrayList(); for (PropertySource? ps : sources) { names.add(ps.getName()); } PredicateString filter name - name.startsWith(app.secret.) || name.startsWith(spring.datasource.); for (String name : names) { PropertySource? original sources.get(name); if (original null || original instanceof DecryptingPropertySource) { continue; } sources.replace(name, new DecryptingPropertySource(name, original, resolver, filter)); } } Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } }getOrder()返回LOWEST_PRECEDENCE是有講究的。Spring Boot 2.4 之后配置文件通過ConfigDataEnvironmentPostProcessor加載它的 order 很靠前。如果你的處理器 order 太小執(zhí)行時application.yml還沒進屬性源列表就漏掉了。設成最低優(yōu)先級能保證所有配置文件都加載完之后再統(tǒng)一包裝。迭代時要先收集名字快照不能在遍歷MutablePropertySources的同時調用replace會拋ConcurrentModificationException。這個坑我在第一次寫的時候踩過啟動直接掛掉。SecretKeyLoader負責從環(huán)境變量或外部密鑰文件讀取主密鑰。這里要強調一點密鑰絕不能和密文放在同一個屬性源里。密文在啟動參數(shù)、密鑰在環(huán)境變量這是最低要求再好一點是密鑰從掛載的 secret 文件讀只有特定用戶可讀。3.4 Spring Boot 3.x 的注冊差異與兼容寫法Spring Boot 2.x 的注冊文件是META-INF/spring.factoriesorg.springframework.boot.env.EnvironmentPostProcessor\ com.example.config.DecryptingEnvironmentPostProcessorSpring Boot 3.x 改成了META-INF/spring/org.springframework.boot.env.EnvironmentPostProcessor.imports內容直接寫類名一行一個com.example.config.DecryptingEnvironmentPostProcessor如果項目要同時兼容 2.x 和 3.x兩個文件都放內容各寫各的格式。Spring Boot 3 會優(yōu)先讀 imports 文件找不到再回退到spring.factories放兩份不會沖突。另外 3.x 對spring.factories的很多擴展點都做了遷移如果你還依賴其他擴展點建議一次性檢查一遍別只改了這一處。3.5 讓 Value、ConfigurationProperties、Environment 三條讀取路徑都走通包裝完之后要驗證三條路徑是不是都拿到明文。Value走的是PropertySourcesPlaceholderConfigurer它讀的是Environment的propertySources包裝后的源直接生效沒問題。ConfigurationProperties走的是ConfigurationPropertySources這是一個在環(huán)境準備末尾 attach 上去的視圖。因為它在 attach 時持有的是MutablePropertySources的引用遍歷是動態(tài)的所以后包裝也生效。但要注意 attach 的時機在你的處理器之后——Ordered.LOWEST_PRECEDENCE恰好能保證這一點。environment.getProperty(key)直接遍歷propertySources同樣生效。有一個例外是PropertySource注解引入的屬性源。它的加載時機在ConfigurationClassPostProcessor階段晚于EnvironmentPostProcessor所以不會被包裝到。如果這個源里也有加密值需要單獨處理比如在BeanFactoryPostProcessor里再包一次或者干脆把加密值挪到application.yml里。4. 從加密一個值到項目跑起來的完整實操4.1 生成 256 位密鑰并加密目標值密鑰生成用 KeyGenerator 就行別自己拼字節(jié)數(shù)組KeyGenerator generator KeyGenerator.getInstance(AES); generator.init(256, new SecureRandom()); SecretKey key generator.generateKey(); String base64Key Base64.getEncoder().encodeToString(key.getEncoded()); System.out.println(主密鑰: base64Key);256 位 AES 在 JDK 8u161 之后默認就支持不需要額外裝策略文件。如果你的運行環(huán)境是很老的 JDK 8 小版本跑的時候會拋InvalidKeyException: Illegal key size那就得升級 JDK 或者裝無限強度策略文件。這個報錯信息很明確一看就知道原因。拿到密鑰之后加密目標值SecretKey key new SecretKeySpec(Base64.getDecoder().decode(base64Key), AES); String encrypted AesGcmCipher.encrypt(Pssw0rd-2024, key); System.out.println(encrypted);輸出大概長這樣enc:v1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx長度 60 到 80 個字符之間具體取決于明文長度。4.2 啟動腳本里注入系統(tǒng)屬性的幾種寫法Linux 下用-D傳參java -Dapp.secret.db-passwordenc:v1:xxxxx \ -Dspring.profiles.activeprod \ -jar demo.jar注意值里的特殊字符。雖然用了 URL 安全 Base64理論上只有字母數(shù)字和-_但前綴里有個冒號在 YAML 或某些腳本里冒號后面跟空格會被當成分隔符。所以建議整個值用單引號包起來別圖省事。容器環(huán)境里更推薦用環(huán)境變量避免命令行參數(shù)被ps看到env: - name: APP_SECRET_DB_PASSWORD valueFrom: secretKeyRef: name: app-secret key: db-password環(huán)境變量名APP_SECRET_DB_PASSWORD會被 Spring Boot 的寬松綁定映射成app.secret.db-password所以你的代碼里照常寫Value(${app.secret.db-password})就行。這個映射規(guī)則是全大寫、下劃線轉點、點轉短橫線。搞清楚這條規(guī)則很多環(huán)境變量明明設了卻讀不到的問題就迎刃而解了。如果值里必須帶加密前綴環(huán)境變量這種方式反而更安全因為不需要經過 shell 解析。4.3 寫個測試驗證解密鏈路真的生效測試這塊有個坑SpringBootTest會緩存ApplicationContext如果第一個測試類啟動時系統(tǒng)屬性還沒設后面再設也不會重新加載。所以要么用DirtiesContext要么在BeforeAll里設置并確保測試類順序。SpringBootTest DirtiesContext(classMode DirtiesContext.ClassMode.AFTER_CLASS) class SecretPropertyTest { static final String KEY 測試用密鑰的Base64; BeforeAll static void setUp() throws Exception { SecretKey key new SecretKeySpec(Base64.getDecoder().decode(KEY), AES); System.setProperty(app.secret.db-password, AesGcmCipher.encrypt(Pssw0rd-2024, key)); System.setProperty(APP_SECRET_KEY, KEY); } AfterAll static void tearDown() { System.clearProperty(app.secret.db-password); System.clearProperty(APP_SECRET_KEY); } Value(${app.secret.db-password}) String dbPassword; Autowired Environment environment; Test void 系統(tǒng)屬性應被解密讀取() { assertThat(dbPassword).isEqualTo(Pssw0rd-2024); assertThat(environment.getProperty(app.secret.db-password)) .isEqualTo(Pssw0rd-2024); } }AfterAll里清理系統(tǒng)屬性這一步別省。系統(tǒng)屬性是 JVM 級別的測試跑完不清理會影響同一個 JVM 里的其他測試類癥狀是單跑通過、全跑失敗特別難查。4.4 長度、性能與緩存的實際測算密文長度可以精確算出來。明文n字節(jié)GCM 加密后是n 16字節(jié)認證標簽加上 12 字節(jié) IV總共n 28字節(jié)。Base64 URL 無填充編碼后的長度是ceil((n 28) * 4 / 3)再減去填充再加上 7 個字符的前綴。拿一個 12 字符的口令舉例12 28 40字節(jié)Base64 后約 54 字符加前綴總共 61 字符。這個長度對啟動參數(shù)和環(huán)境變量來說毫無壓力。性能方面AES-GCM 在現(xiàn)代 CPU 上有硬件加速指令單次加解密在微秒級。真正影響啟動時間的是屬性被讀取的次數(shù)——一個中等規(guī)模的應用啟動時屬性讀取可能上萬次。所以緩存是必須的用ConcurrentHashMap以密文為 key 緩存明文命中率接近 100%。我實測過一個有 8 個加密屬性的項目加了緩存之后解密耗時從 40 毫秒降到 3 毫秒以內。要提醒一句緩存里存的是明文內存 dump 能看到。如果對內存安全有極高要求可以考慮用char[]并在用完后清零但這會把代碼復雜度拉高不少一般業(yè)務系統(tǒng)不必做到這個程度。5. 踩坑實錄那些配置看著對但就是不生效的情況5.1 值被配置文件覆蓋的排查順序最常見的問題是系統(tǒng)屬性設了但讀出來還是配置文件里的值。排查順序我一般是這樣的第一步看 key 是否完全一致。系統(tǒng)屬性里的點號、短橫線、大小寫都有講究。app.secret.dbPassword和app.secret.db-password在寬松綁定下是同一個但在environment.getProperty里是兩個不同的 key。用Value時尤其容易搞混。第二步看屬性源順序有沒有被人為改過。有些項目啟動時會調用environment.getPropertySources().addFirst(...)塞自定義源把系統(tǒng)屬性擠下去了。這種情況在引入了某些配置中心客戶端的項目里很常見。第三步看是不是加密前綴沒匹配上。比如你的密文是ENC(xxx)格式但處理器只認enc:v1:那就原樣返回了原始字符串看著像沒解密。第四步看處理器有沒有真的被注冊。spring.factories里類名寫錯一個字母就靜默不加載不報任何錯。可以在處理器里打一行 info 日志啟動時確認一下。5.2 解密異常與亂碼的定位方法解密報錯無非幾類。AEADBadTagException說明密鑰不對或者密文被改過這是 GCM 的認證失敗屬于最明確的一類。IllegalBlockSizeException通常是密文被截斷比如傳輸過程中丟了字符。IllegalArgumentException: Illegal base64 character說明 Base64 解碼失敗基本可以斷定是特殊字符被轉義了。亂碼問題多數(shù)出在編碼上。加密時用 UTF-8 取字節(jié)解密時也必須用 UTF-8 還原中間任何一步用了平臺默認編碼都可能出問題。特別是在 Windows 上開發(fā)、Linux 上部署的場景默認編碼不一樣很容易踩。還有一種隱蔽情況屬性值本身就是空字符串。System.setProperty(key, )設進去之后environment.getProperty返回的是空串而不是 null某些框架會把空串當成未配置處理走了默認值分支。如果加密后的值恰好解出空串行為會很怪。建議在解密之后加一句判空把空串轉成 null 或者直接拋異常。5.3 常見問題速查表現(xiàn)象可能原因處理方式讀到的是密文原文處理器未注冊或 order 太靠前檢查注冊文件order 設 LOWEST_PRECEDENCE讀到的是配置文件的值屬性源被 addFirst 覆蓋檢查是否有自定義源插到最前面啟動報 InvalidKeyExceptionJDK 版本低不支持 256 位升級 JDK 或裝無限強度策略報 AEADBadTagException密鑰不匹配或密文損壞核對密鑰版本檢查傳輸過程報 Illegal base64 character密文中特殊字符被轉義改用 URL 安全 Base64ConfigurationProperties 綁不上包裝時丟了 Enumerable包裝類繼承 EnumerablePropertySource測試單跑通過全跑失敗系統(tǒng)屬性污染AfterAll 里清理系統(tǒng)屬性環(huán)境變量設了但讀不到命名映射規(guī)則不匹配全大寫、下劃線分詞5.4 密鑰管理和日志里的安全紅線有幾個紅線是必須守住的。密鑰不能出現(xiàn)在代碼倉庫里包括測試代碼。測試用的密鑰要單獨生成只用于測試環(huán)境而且要明確標注僅測試使用。密鑰不能和密文在同一個屬性源。如果兩部分都在application.yml里那加密等于沒做任何一個能看配置文件的人都能解密。日志里不能打印解密后的值。很多框架在 debug 級別會打印屬性綁定的過程如果你的屬性名比較敏感比如帶password要確認這些日志不會上線。異常堆棧里不能帶明文。Cipher.doFinal拋異常時不會帶明文但如果你自己包裝異常時把原值拼進 message那就漏了。前面給的SecretResolver里我只帶了密鑰版本就是這個考慮。還有一點容易被忽略actuator 的/env和/configprops端點默認會做脫敏脫敏規(guī)則是匹配password、secret、key、token這類關鍵詞。如果你的屬性名叫app.datasource.credential不在這份名單里就會被原樣展示。這個名單可以自定義但更穩(wěn)妥的做法是直接限制這些端點的訪問權限。6. 上線前的加固清單6.1 actuator 端點的脫敏處理Spring Boot 的脫敏靠SanitizingFunction實現(xiàn)2.6 之后可以自定義。默認規(guī)則只覆蓋常見關鍵詞業(yè)務自定義的屬性名很容易漏。Bean public SanitizingFunction customSanitizer() { return property - { String name property.getName().toLowerCase(); if (name.contains(credential) || name.contains(passwd) || name.contains(private)) { return property.withValue(******); } return property; }; }這段代碼注冊到容器后/env端點里匹配到的值都會顯示成星號。注意這只是展示層面的保護屬性值在內存里仍然是明文別把它當成加密手段。更徹底的做法是把 actuator 端點限制在內網訪問或者干脆在生產環(huán)境只暴露health和info。配置項management.endpoints.web.exposure.include設成health,info就夠用了。6.2 密鑰輪換與多版本密鑰的共存設計密鑰輪換是安全實踐里的常規(guī)操作但在配置加密這個場景下很容易做砸。核心思路是解密時支持多個版本加密時只用最新版本。前面給的enc:v1:前綴就是為此設計的。輪換時先生成 v2 密鑰把SecretResolver的 keys 映射表里同時放 v1 和 v2重新加密所有敏感值并替換成enc:v2:前綴確認沒有 v1 的密文殘留之后再把 v1 從映射表里移除。這個過程可以分多次發(fā)布完成不需要一次性切換。第一版發(fā)布只加 v2 密鑰的支持密文還是 v1第二版發(fā)布把密文換成 v2第三版發(fā)布移除 v1 密鑰。每次發(fā)布都可回滾風險可控。要注意的是如果密鑰來自外部服務輪換時要考慮服務的可用性。密鑰服務掛了會導致應用完全起不來所以本地最好有一份降級密鑰或者把密鑰緩存到本地文件。6.3 測試環(huán)境與生產環(huán)境的隔離測試環(huán)境的密鑰和生產環(huán)境必須完全不同這是基本要求。但實際項目里經常出現(xiàn)測試密鑰硬編碼在代碼里、生產環(huán)境復用的情況。我的做法是把密鑰來源做成可配置的通過app.secret.key-source指定可選值是env、file、vault。測試環(huán)境用env配合 CI 的變量注入生產環(huán)境用file掛載只讀的密鑰文件。這樣同一份代碼在不同環(huán)境走不同路徑不需要改代碼。同時要在啟動時加一條校驗如果檢測到當前是生產 Profile 但密鑰來源是env且密鑰長度不足直接啟動失敗。寧可起不來也別帶著弱密鑰跑起來。另外測試環(huán)境的數(shù)據(jù)最好也是脫敏的。有些團隊為了圖省事把生產數(shù)據(jù)導到測試庫密碼還是同一套這種時候加密配置就形同虛設了。我個人在實際操作中的體會是配置加密這件事真正的難點不在算法而在讓所有人都按同一套規(guī)則來。代碼里寫得再完善運維在啟動腳本里直接寫明文整條鏈路就破了。所以落地的時候除了技術方案最好再配一條啟動校驗檢測到關鍵屬性沒有加密前綴時打一條 WARN 日志慢慢把習慣糾正過來。踩過幾次坑之后我發(fā)現(xiàn)日志比文檔管用得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美日动态视频| 国产亚洲欧美每日在线| 人人摸人人干| 亚洲精品久| 丁香六月东京热| 偷拍盗拍亚洲色图图片| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 91性网| 久久久久久久久久黄色网| 五月激情啪啪| 国模少妇一区二区三区| 欧美精品日韩久久久九| 成人自拍三级在线观看| 婷婷色综合欧美日韩| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 啊啊啊好想要| 欧美偷拍区| 久久六六| 精品福利| 清纯唯美亚洲综合| 亚洲综合网91| 91国模| 欧美后入式| 岛国999| 国产精品熟女AV中文字幕在线播放| 无码WWW免费视频网站| 免费一级精品啪啪视频| 中文字幕在线观看永久| 国岛片视频| 大黄片做爱的大的| 久久社区一区二区三区| 在线无码网站| 成人乱码一区二区三少妇| 久久久久久久伊人精品| 日韩在线一区高清在线| 开心五月婷婷激情| 国内外色色色色色成人视频| 麻豆久久视频在线地址| 婷婷日韩一区二区三区中文字幕在线| 丁香五月综合| 天天干天天日天天射黄色| 国产成人亚洲精品自产在线 | 综合九九| 视频黄站| 亚洲风情在线观看| 欧美激情久操网| 欧美人与动性人交a| 久久久久亚洲Av无码专区老牛影视 | 欧美色就是色| 在线观看不卡一区二区三区| JIZZJIZZ国产精品喷水| 国产乱码久久| 91撸色网 玖玖网 欧美| 久久久草草精品| 日韩欧视频| 久久久久久久唑| 国产精品女aA片爽爽视频| 成人性爱免费播放| 自拍偷拍 高清无码| 精品中文字幕一区二区l - 百度| 97在线视频观看| 四虎 精品 WWW| 草久久久| 九九九免费视频| 欧美精品99久久久**| 2024人人操人人摸| 99re在线视频国产| 69一区二区| 午夜亚洲WWW湿好大| 国产毛片久久久久久久| 婷婷综合五月| 国产天美传媒精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 婷婷大香蕉| 91网站18在线| 日韩精品-原创伙伴| 波多野结衣AV无码一区| 丁香六月综合激情| 欧美大片一区二区三区 | 强奸xx国产| 中文字幕精品人妻丝袜| 天天综合网亚洲综合网| 九月丁香| 亚洲欧洲无码一区夜| 精品人妻一区二区三区视频在线| 免费?级毛片无码?∨蜜芽试看| 一级久久久久久久久久久| 亚洲色人妻综合| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 蜜臀视频网站| 国产一区二区在线电影| 中文字幕人妻色偷偷久久皮 | 91狠婷| 2017天天透天天通天天擦| 九九九九精| 91 亚洲 欧美 日韩 国产 综合| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 超碰在线1234区| 操婢日韩| 日韩欧美被操黄免费观看| 97超碰久久| 久99久视频| 一区二区三区在线日韩影院观看| 高潮毛片无遮挡高清免费| 欧美日韩国产中文精品字幕自在自线,| 午夜乱轮操逼视频免费看| 久久激情婷婷| 色狠狠色| 欧美中日韩XXXX| av无码av无码专区| 一区二区三区成人| 操逼天美3区| 欧美色三级片91| 亚洲色婷婷综合久久一区二区三区| 精品毛片av一区二区| 国产欧美一区二区| 久久久久亚洲熟妇熟女| 婷婷激情一区二区三区俺也去| 色欧美亚洲| 荡小穴在线观看| 蜜臀久久99精品久久久久久婷婷 | 95精品在线| 亚洲少妇在线观看| 超碰午夜在线| 免费一级性爱久久| 亚洲综合69| 多毛小伙内射老太婆| 五月天久久婷婷亚洲| 欧美一级黄色免费专区| 99热 按摩 日韩| 操操操日本的逼| 久久一本大香蕉 | 日韩无码操逼片| 综合天天网| h无码动漫在线观看| 区自美91| 日产狠狠干| 国产成人亚洲精品无| 插入综合网| 五月丁香黄色网| 亚洲中文电影| 玖玖资源综合在线视频| 在线洲亚线| 玖色AV| 日韩视频中文字幕| 久久精品国产精品| 91丨九色丨熟女高潮| 精品福利| 春色91| 国产日本熟女顶级一区二区三区视频| 久久国产免费激情视频| 欧美综合色图片| 熟妇在线视频一区二区| 99色热国产视频精品| 亚洲97网站| 亚洲人成网www| 久久首页| 亚洲国产97| 久久天天躁日日躁狠狠躁| 亚洲AV噜噜狠狠网址蜜桃动漫| 亚洲风情综合网| 国产原创精品| 国产成人自拍视频在线| 欧美日日操| 日日骚av| 亚州色图片在线色| 熟女人妻av在线资源,黄色的资源| 日韩性爱人人爱人人操| 一起草在线视频| 欧美色道啊| 国产人妻精品久久久一区二区三区| 久久男人精品| 十八禁视频一区二区| 亚洲骚男同com| 日本啊啊啊啊啊视频| 在线无码操| 日韩黄色片子| 一区二区三区国产在线播放| 亚洲色性| 白丝在线一区| 欧美视频第二页| 91久久久久免| 黑丝内射一区二区三区| 911粉嫩人妻| 中文字幕日韩电影人妻| 啪啪综合网| 热久久无毒不卡| 欧美熟女丝袜| 男人网站婷婷| 国产精品视频播放| 日日干夜夜操视频h| 99爱精品| 色999人与兽| 天天日天天爽| 香蕉久久国产AV一区二区| 2018天天干在线视频| 亚洲无码 国产无码| 无码78| 欧美自拍网| 久草老司机| 青青草玖玖爱| 啊嗯嗯啊好大好爽| 国产日韩中文字幕欧美| 天天影视之亚洲综合网| 色五月激情AV在线| 蜜桃AV天堂| 亚洲双插| 日本操逼无码| av一区二区三区四区| A 天堂| 91操操操操| 亚洲成人激情小说视频| 性爱网站一区二区| 亚洲成人无码影院| 国产免费久久久久| 99热精品在线观看| 中文字幕五区| 黑丝91视频| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 情色五月天网| 91在线国产后入风骚翘臀美女素人| 色妇91| 天美传媒av一区二区| 99热日| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 操一操摸一摸| 免费一级性爱久久| 婷婷亚洲综合| 无码9区| 久久久亚洲精品电影免费看| 人妻熟女一区二区| 青青在线视频日韩欧美| 亚洲AV无码乱码| 美国一区二区三区视频| 无码伊人久久大杳蕉中文无码| 九九色婷婷| 激激五月| 超碰久在线天天做| 欧美日韩另类激情图片| 伊人操你| 久99久视频| 亚洲熟妇乱女区二区三区| 好吊色一区| 成人日本片久久久蜜桃| 女同女同恋久久级三级| 亚洲一区日韩| 中文字幕av丝袜| 久久三区四区| 国模私拍一区二区三区神乳| 99色视频| 日韩不卡网操逼中文字幕日韩| 无码九九九九| 自拍偷拍第26| 亚洲熟妇极品| 蜜臀va69| 伦伦成年午夜免费视频| 亚洲色图在线视频| 中文字幕一区二区三区人妻不卡 | 殴美日韩m| 91超碰在线观看| 精品亚洲成人免费在线| 九热视频| 蜜臀网址在线| 久久av一级av少妇av高潮 | 亚洲久久久| 久草免费福利在线播放| 久草资源欧美在线视频| 亚洲欧美人妻| 五月天啪啪| 伊人在线大香蕉二。| 成·人免费午夜在线观看| 免费综合亚洲中文| 欧美在线干| 国产成人无码a| http://qxhbdz.com| 久久99干一本高清| 国产精品免费视频人成| AV色五月| 国产精品制服丝袜清纯唯美| AV在线资源| 日本东京热久久久电影| 大香蕉 222| 碰碰97| 久久99网站| 少妇久久久免费| 99久久久无码精品国产人| 男人的天堂成人的社区| 欧美成人A√在线一区二区| 性色一线| 成人av影院在线观看| 日本一二区免费| 精品人妻一区二区三区免费视频| 亚洲综合成人网| 日韩BBN| 91干熟女| 女人香蕉久久毛毛片精品| 亚洲精品无码成人久久久99| 男人成人黄色视频在线观看免费下载| 国产女同视频在线播放| 天天色踪合| 天天色综亚洲91污| 人妻少妇久久| 天美麻花大全视频| 极品色综合| 亚洲激情网一二三四区| 日韩欧美性爱电影在线观看| 免费看污网站| 在线观看成人性爱免费小视频| 天天享受天天看| 国产99精品一区二区三区免费| 日韩一级二级三级免费看完整版国语版 | 激情文学小说一区二区| 超碰97国产欧美| 色婷视频| 亚洲啪啪视频免费| 亚洲图片视频小说| 蜜臀av在线播放一区二区三区| 亚洲久久久久| 岛国不卡超碰护士AV在线播放| 日韩免费在线视频观看| 亚洲欧美综合图片| 97亚洲国产影视| 色操逼网| 欧美综合中文| 高跟伊人julia ann| 国产AV激情无码久久无码| 插B在线观看| 91亚·色| α√在线| 黄色激情电影在线观看| 91青青| 亚91亚洲网| 久久亚洲AV无码专区国产精品| 欧洲一区二区| 精品国产91久久久久久一区黄无| 亚洲高清无码在线桃色| 国产真实子伦对白| 91热色| 校园春色综合色| 欧美在线播放aaaa| 国产一区二区成人av在线播放| 98福利在线视频| 欧美制服网站美腿丝袜| 久热香蕉精品在线视频| 一区二区三区美女超清| 深夜激情| 欧美日韩国产电影| 天天操av懂色| 欧美性爱另类综合| 丝袜熟女一区二区三区| 日韩乱伦AⅤ| 91精片| 精品中文一区二区| 伊人久久大香线综合无码| 五月丁香啪| 少妇3P性爱自拍| 人人操欧美风骚| 国产丁香精品露脸视频| 中国小夫妻勾搭露脸淫荡对白| 婷婷五月天成人| 睡产熟女乱伦| 亚洲无吗在线视频| 日韩欧美综合激情| 亚洲精品国产无码高清| 久久精品一区二区一8| 九久久精| 天天综合青苹果| 国产超碰欧美| 国产精品3| 亚洲激情色片| 素颜老阿姨乱情色| 激情综合av| 欧美九九爱| 大胆91| 人人爱操| 先锋精品av色鲁| AV九九| 色色色综合网| 大香蕉520| 日本片日本片祼观看网站在线看中文版网页在线看 | 久久‘黄片视频| 亚洲精品一区二区三区在线播放 | 欧美洲精品一级| 日韩美女高潮喷水视频| 中文字幕精品久久久久人妻红杏ⅰ| 日韩精品人妻中文字幕有码午| 男人的天堂啪啪| 天美麻豆精品视频99| 天天做天天爱天天爽| 五月天婷婷色色| 久操大香蕉手机视频在线看| 麻豆久久久一区二区| 日本在线一二| 日本一二区免费| 欧美性色综合网| 91国产大片| 91色爽欧美| 久久人爽| 日韩欧美麻豆 | 欧美欧美啪啪视频| 为用户提供免费看黄网址在线观看| 麻豆综合一区av| av网站在线观看了| 亚洲色图欧美视频| 天天操狠狠日夜夜干超碰撸com视频在线观看| 大香蕉婷婷| 狼人综合婷婷激情四射 | 亚洲有码视频二区| 女人被男人桶爽视频网站| 午夜福利精品| 久青草影院| av婷婷色网| 日本九九久久99| 91M一社| 97精品久久| 午夜亚洲国产理论秋霞| 大香蕉丝袜一级片| 91在线限制级| 不卡视频一区蜜桃视频 | 亚洲精品1区| 欧美色蜜桃97| 亚洲国产ⅴ高清在线观看| 日本操BAV| 国产精品九9| 91n免费处女| 欧美激情专区| 国产小黄片在线免费观看| 亚洲激情网| 国产超碰在线一区| 97干色| 国模精品一区二区三区苹果色戒| 久久综合久久综合人久久夜精品| 97在线欧| 天天爽夜夜爽夜夜爽精| 蜜臀国产AV中文字幕| 国产地址二三| 久久成年片色大黄全免费网站| 欧亚乱色熟女一区二区| 少妇人妻无码| 色图综合| 午夜男女爽爽爽在线视频| 91在线免费观看处女| 青青草一区二区三区四| 日欧操屄| 亚洲、日韩、综合、另类| 88在线一区二区三区| 蜜乳AV.COM| 97二区四区| 91白嫩| 久久精品国产亚洲AV片多多 | 日本色日夜干| 天天弄天天操| 亚洲色图欧美色图综合| 亚洲国产成人精品无码专区| 蜜臀人妻少妇久久在线观看| 97综合| 色婷婷丁香五月| 人妻少妇久久| 91操人| 九99久久| 久操不卡视频| 亚洲AV色图一区| 91在线视频观看国产| 鸥美精品一区二区久久婷婷| 久久的免费性爱视频| 一区二区 韩日AV| 亚州性色| 淫淫总合网| 九九热精品| 992这里有精品| 亚洲综合伊人无码久久| 五月天精品| 欧洲视频在线| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 日韩av影片在线观看| 久久久久网站-538在线视频-欧美永久乱码| 欧美男人天堂| 亚洲永久永久永久永久一级一级一级精品 | 欧美国产精品久久九九| 欧亚不卡| 亚洲精品人妻在线| 国产少妇内射| 91 刺激在线| 黄骗免费网站| 国产精品视频播放| 看黄片视频免费| 精品无人区麻豆乱码1区2区图片| 啊啊好多水| 一线黄色免费性爱片| 欧美日产国产在线成人第一区| 欧美色图片| 97香蕉网| 天天日天天搞天天干| 男女猛烈无遮掩视频免费软件| 人妻夜夜爽天天爽三区麻豆AV网站| 综合色欧美| 超碰在线一区二区| 天天看天天日| 亚洲91在线播放影院| 亚洲另类小说卡通动漫| 人妻系列无码专区中文有码| 午夜偷拍久久熟女| 色情综合| 不卡九肏| 九九国产| 日韩欧美三级| 囯产精品久久久久久久久久梁医生 | 先锋激情∨在线视频播放| 免费啪啪av| 成人乱码一区二区三少妇| 日韩中文字幕在线视频观看| 一本久道久久综合狠狠爱| 久jiu久神马影院| 91伊人大香蕉| 四虎精品一区| 青春草莓视频在线观看网址| AV一区观看| 色官网在线| 亚洲最大91网| AV99热18这里只有精品| 4tube欧美女厕所| 超碰在线人人射| 1二区9| 久久精品一区二区三区蜜桃臀| 欧美性色欧美| 国产午夜福利电影免费在线观看 | 免费视频一二三区| 尤物黄色在线观看网站| 五月丁香婷婷色| 中文字幕天天天天天| 久湿久久| 五月天婷婷在线看 | 九九精品99| 婷婷五月影院| 九九九九九九九九九九精品视频| 97资源站日韩| 天堂中文资源在线bt| 日韩乱码Av| 免费超碰97久久| 91情色| 国产精品久久久久久片| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产精品久久久久久久黄无码| 日本日逼视频网| 成人色女网| 久9久9久9久9久9久9| 夜夜草天天| 欧美日韩999| 人人超碰在线观看黄| www欧美91| 久久美女国产| 成人精品视频一区二区| 黄色工厂这里只有精品| 约操熟妇| 亚洲精品国产精品乱码不卡| 美女91AV| 久久久婷婷| 午夜久久久| 极品综合| 97色爱| 九九九九精| 精品超碰国产| 国产AV人人夜夜澡人人爽麻豆| 黄总AV色图| 老女人综合网| 69超碰综合| 欧美色图片色哟哟| 久久精品三级影视| 无码男人天堂| 日本无码1| 人妻在线大香蕉| 日本成人免费一区二区三区| 国产不卡片| 97综合国产| 久久亚洲不卡| 亚洲综合在线第一页| AV九九| 密臀在线视频| 蜜桃臀av在线观看| 成人无码欧美一级A片狼牙直播| 8050无码八戒| 天美久久久久| 久久久网站| 99少妇内射| 狠狠狠狠狠狠| 91天堂网| 嗯嗯啊啊用力视频免费| 大香蕉乱级| 91嫩草欧美| 九九视频黄色片| 亚洲欧洲色情高清| av午夜影院在线播放| 91美女视频在线免费观看| 精品久久久高清无码| 国产乱码久久久久久| 91强热人妻| 久男人久久| 久久久内射良家| 人妻在线视频| 亚洲高清91| 精品夜夜澡人妻无码| 91老熟妇| 久干网| 亚洲二区精品在线观看| 国产尤物在线三区| 女色视频社区| 国产一区二区三三视频| 在线小视频| 色婷婷视频| 日韩三级伦理中文字幕| 亚洲污一污二| 超碰av在线| 亚洲?V高清一区二区三区尤物| 人人澡综合涩| 日韩女模中文造逼| 天天综合97| 伊人网在线视频| 色婷婷综合视频| 丁香色狠狠色综合久久小说| 亚洲凸凹超碰成人| 99热这里是精品| 操国产逼| 免费男人的天堂| 久久久精久久久| 91在线视频观看国产| 日本一二三免费久久| 999久久久九| 国产高清精品福利| 国产强奸乱伦无码视频| 亚洲情色综合网| 99青草| 婷婷激情五月天小说网| 亚洲综合电影| 欧美天天影院| 四虎884a| 91色碰| 国产AV久久久蜜爱影集| 最近2018中文字幕在线高清第一页| 色香91| 精品视频97| 91黑丝露脚| 熟女色综合久久| 亚洲熟伦熟妇AV无码春色| 五十路熟女在线不卡观看一区二区| 香蕉99秘 精品一区丁香| 亚洲aV性爱| 国产毛片久久久久久久| 欧美天天弄| 中出20p| 加勒比AV天堂| 口爆欧美91| 97超碰jingpin| 亚洲偷拍自拍在线视频| 91午夜无码| 精品日韩人妻视频| 亚洲97综| 好吊色综合| 国产馆| 97视频一区| 国产风韵犹存熟妇三区| 加勒比海成人视频网| 欧美在线伊人色| 校园春色制服丝袜中文字亚洲| 亚洲精品无码少妇久久| 久久精品中文字幕无码l| 久久亚洲欧美中文字幕国语| 最新av中文字幕高清| 日本成人在线不卡一区二区三区| 性一级黄色录像片网站导航| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 久久激情亚洲精品无码?V| 精品国产91内射久久| 偷拍 欧美 日韩| 日韩性爱啪啪视频| 1769一区| 久久午夜鲁丝片| 色视频蜜乳| 久久伊人亚洲AV无码网站| 88xx成人精品视频| 亚洲人妻中文在线视频| 日韩精品一区二区高清| 国产福利视频精品视频| 琪琪精品免费一区二区三区| 国产亚洲日韩在线三区黑人| 性在久久久久久| 岛国视频免费在线观看| 操逼网站视频漫画国产| 超碰久热| 大香蕉碰碰| 九久9热| oumeisetupian| 男生女生啊啊啊啊| 亚洲青青草| 91中文字幕在线观看| 国产成人五月天丁香花| 日韩97| 免费啪啪av| 午夜久久无码1000合集| 二色av| 91女在线观看| 99精品人人爽| 99re28在线观看| 黄骗免费网站| 欧美黄色大片在线观看 | 永久免费av无码网站国产app| 九九综合久久中文字幕| 一级久久久久久久久久久| 成人电影一区| 亚洲综合影视| 日韩欧美中文字亚洲慕| …亚洲黄色厕厕女女在线播…| 日韩国产精品人妻无码久久久| 日韩熟女乱伦中出| 日本福利二区视频| 高树玛利亚无码流出| 男人的亚洲天堂| 欧美日韩狠狠爱| 久久久国产av美女私房| 人人操人人大香蕉| 啊啊啊啊啊啊啊国| 久久综合久色欧美综合狠狠| 人妻精品一区二区| 在线色导航| 91久久久久免| 国产久久久久影院老熟女| 日本 情色 1区| 999精品国产高清一区二区| 欧美很很操视频| 日本加靬比网站发布页| 日韩无码人妻中字久久三区四区| 99久久久无码国产精品性啊聊| 日本精品无码三级网站| 96AV精品| 国产黑白丝在线| 浓厚中出中文字幕在线| 日韩性爱播放| 91嫩草欧美| 九九九久| 人妻一二三区| 日本123区操B视频| 色色色综合| av久日| 亚洲中文字幕熟女| 亚洲一区二区三区四区视频| 99re不伦| 综合久久9| 日韩无码黄色片| 久久欧美1卡2卡3| 国产精品3| 久久人妻| 天天干美少妇一区| 亚洲男人天堂视频| 久久午夜鲁丝片| 国产人妻精品久久久一区二区三区| 色偷综合| 少妇久久久久久| 嫩草影院在线观看精品| 5252色欧美在线| 97欧美日韩综合| 草莓精品视频| 国产精品 亚洲情色| 精品国产乱码久久久A| 国产乱码精品一区二区三区四川| 4141514逼喷水三级片| 激情欧美97| 黄aaaaaaaaaaaaaaaaaa色网站| 超碰这里只有精品| 91亚洲综合| 久久久98网站免费视频| 欧美男人的天堂| 狠狠激情综合狠狠操中文字幕| 99热精品国产| 日婷婷| 操九九九九九九| 视频不卡中文字幕| 女人爽到高潮潮喷18禁网站| 91无摭挡| 看一级特黄a大一片| 日韩啪啪啪视频| A级国产欧美激情在线| 99热这里只有精| 日本视频在线中文字幕| 开心激情站| 97综合国产| 男人天堂一区二区| 2017天天拍大香蕉| 五月婷婷色| 9999久久久| 亚洲有码 视频一区| 亚洲中文字幕熟女少妇一区二区| 大香网站| 五月天亚洲网| 六月丁香啪啪| 亚洲人妻爽爽爽| 天天影视网综合少妇| 91精品丝袜久久久久久| 欧美综合站| 我要色综合网| 鸥美精品一区二区久久婷婷| 999久久久免费精品国产牛牛| 日韩传媒在线| 啊啊啊啊啊啊好多水| 亚洲成人一二三区| 可以在线观看的黄色网址| 亚洲精品国产av天美传媒| 国产高清MV操逼视频| 亚洲的天堂网| 99操碰| 嗯嗯啊好爽| 亚洲中文电影| 青青久久手机线视频| 国产精品午夜福利| 人妻中文在线| 午夜超碰| 欧美国产有色电影| 99精品成人免费看| 成年人黄色| 97久久精品亚洲中六字幕| 欧美色性爱| 日韩无码第3页| 久久久久国产精品片区无码直播| 久草电影网| 丁香九月婷婷| 久久精品日韩| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 一区二区三区蜜桃成人撸久久东京热 | 一本大道青青| 另类亚洲图色| 在线观看色视频| 上特色A在线| 精品国产乱码久久久久久影片| 国产在线激情视频| 麻豆AV一区二区天美传媒| 男人下部插入女人下部| 成人免费福利在线观看| 少妇激情一区二区三区视频| 久久欧洲| 久久久97| 国产Aα| 日本欧美不卡| 欧美激情亚洲情色| 日少妇亚洲版| 国产福利精品最新在线 | 欧美天天谢综合网| 性色av网站| 91精品国产91久久青草| 久久 亚洲 日韩 人妻| 日韩av在线播放不卡| 国产激情视频一区区三区| 97超碰欧美手机在线| 手机av天堂久久久久| www.人人cao| 无码一区免费在线不卡| 男人的天堂com| 99精品久久久久久| 青青青国产| 久久久人妻| 久久久亚洲欧美综合| 日韩极品无码B| 91久热| 中文日韩欧美熟| 欧洲亚洲人妻无码中字久久三区四区| 久久久久久久久久8888| 91社操逼| 欧美福利视频啊啊啊啊| 熟女人妻一区二区三区| 热久久无毒不卡| 男人把坤坤插入女人的下体| 天天综合网91入口| 色五月网址| 亚洲精品人妻吞精av| 免费看黄片现成| 97超碰精品| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 大香蕉青青9| 国产成人主播| 插入综合网| 亚洲综合小说另类图欧美视频激情小说色五月天| 五月天久久综合网| 国产一区二区三区免费视频在性观看 | 强奸熟女一区二区三区| 亚洲色图国产另类| 亚洲成人一二三区| 啊嗯好大视频在线观看| 9 9精品一区二区三区| 五月天婷婷色| 免费簧片在线观看| 国产精品一级特黄aaa大片在线观看| 黑人精品XXX一区一二区| 精品视频一二三中文| 成人久久久| 久久久久久久唑| 久久久久久久精| 天天综合91| 青娱乐啪啪视频| 国产成人在线观看网址| 国产精品视屏| 91国产操逼视频| 免费视频在线一区二区不卡| 大肥女高潮bbwbbwhd视频| 在线日韩日本亚洲国产| 极品销魂美女一区二区| 尹人免费观看视频在线| 欧美色网| 欧美日韩性爱电影在线| 国产探花精品在线| 可能人人看人人摸| www.人人cao| 欧美亚洲中文字幕| 99热精品在线观看| 中文字幕高清20页视频| 殴美,日韩国产伦精品| 日日夜夜骚| 久久99精品九九久久久婷婷| 骚货 中文字幕 av| 玖玖久久久| 夜夜操美女| 国产亚洲精品第一最新| 天天干美少妇一区| 欧美久久婷婷| 一本一道久久综合久久| 亚洲成人ab| 一区二区三区美女超清| 草草网站影院白丝内射| 日本国产欧美一区三区二区 | 大香蕉淫人网| 欧美精品三区| 精品亚洲黄色片 国产精品导航一区二区| 91色人妻| 欧美十八禁在线看| 欧美少妇一区二区三区| 欧美 日韩 另类 亚洲| 欧美三四五区| 99久久精品欧美国产| 欧美人妻精品一区二区| 国产999精品久久久久久| 99啪啪视频| 深夜激情| 欧美Aⅴ| 欧美日韩中文亚洲v在线综合| 丝袜美腿欧美| 黄色不卡视频| 女生久久网| 成人 日本A片无码8888| 丁香五月天啪啪| 欧美暴力猛交| 国产极品馒头逼| 久久亚洲欧美中文字幕国语 | 又粗又长又爽在线观看| 小情侣高清国产在线视频| 国产精品天美传媒| 亚洲AV色图一区| 色色青青久久| 中文字幕在线免费观看2| 亚洲欧美中文一区二区三| 激情五月综合网| 久久久久ab| 日韩亚洲欧美中文字幕| 呦呦一区| 激情视频网址| 国产精品动态一区二区三区四四| 国产久久久久久| 国内毛片免费h片在线| 一本一首道人妻少妇免费久久| 国产熟女一区二区| 色成人Www精品永久观看| 丁香五月综合| 51一区二区三区| 人人操人人插人www| 夜夜操二区| 97在线免费公开视频| 少妇xx精品| 色盈盈影院| 日韩成人无码| 3571色综合一区二区二区| 精吧天堂| 在线欧美69V免费观看视频| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 一区二区三区国产在线播放 | 999综合网| 97人人超| 成人精品久久| 国产自产自拍| 欧美乱妇狂野欧美在线视频| 欧美v亚洲v综合v国产v妖精| 九九在线视频| 欧美亚洲今日在线| 97av在线视频| 日韩无码服务区| 操屄不卡视频| 伊人丝袜美腿高跟在线观看高清| 色色毛片| 在线人妻熟女一区二区三区四区五区| 色九九久九九| 大香蕉久久| 91制服丝袜中文字幕| 亚洲天堂电影精品一区| 久久岛国| 亚洲图片欧美日韩| 天天澡天天爽日日AV| 人妻天天爽夜夜爽爽| 亚洲中文字幕在现观看| 7月婷婷综合| 欧美日韩啪啪电影| 330dv亚洲成年视频网| 午夜AV人气不卡| 久久精品国产精品| 99热99在线播放激情| 97超碰色中文字幕| 亚洲五月婷| 我爱操| 人妻天堂综合网| 亚洲av性爱电影| 日韩97视频!在线| 欧美日韩午夜精品一区二区三区| 99热导航| 国产日韩在线播放av| 另类专区加勒比| 五月婷婷丁香| 超碰97国产欧美| 日本伦理一区二区| 中文日本免费高清| 欧美色图91p| 五月婷婷基地| 91天天| 精品久久久av| 波多野结衣一级视频| 91亚.色| 欧美激情综合| 国产一区二区免费福利片| 一区二区三区成人| 日韩性爱电影一区| 97在线免费视频观看| 亚洲精品 超碰| 国产精品无码av嫩草| 婷婷激情丁香| 青青草视频久久久久| 岛国免费黄色网址| 日比av无码| 久久久性爱视频| 亚州操逼图| 特色a在线上| 极品AV网站在线观看| 国产亚洲禁久一区二区| 96久久久| 欧美第二页午夜| 国产日比| 91精品人妻偷情| 国产精品在线一区二区| 激情五月天网站| 日韩色欲久久一二三四区| 亚州性色| 精品乱子一区二区三区99| 国产 亚洲 丝袜 制服| 久久久亚洲熟妇熟女| 中文字幕一区二区三四五区日日骚| 国产精品免费视频人成| 久久精品 六十路 熟女 欧美| 久9综合在线| 亚洲精品一二三四区| www色婷婷| 先锋激情∨在线视频播放| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 夜夜夜久久| 丁香六月婷婷综合| 麻豆国产97在线| 日韩欧美中文字幕搭讪巨乳美人妻视频| 欧美久久久15P| 亚洲夜夜欢无码一区二区 | 久久久9 9 9精品| 东京成人一区| 欧洲综合视频| 熟妇操花| 日韩激情小说一区二区| 日本成a人v网站在线观看| 十八禁电影伊人网| 久久久18禁| 按摩中文字幕| 无码国产精品午夜不卡( | www久久精品| 蜜臀久久久| 国产精品肉丝自拍| 男人的天堂网免费| 日本一级二级三级网站| 国产AV色黄看到爽| TS人妖另类精品视频系列| 伊人网在线点播| 亚欧美色图| 啊啊啊啊啊啊啊网址在线观看| 2020视频1区2区3区| 99在线观看| 一区二区三区机械有限公司| 思思热一热婷婷热一热| 久久久久人妻二区精品叶可怜| 人人操,人人液| 无码人妻精品酒店| 国内精品99999| 大色网久久| 日本高清视频在线观看黄已三辽| www. 男人天堂成人在线| 久久超碰、| 97玖玖超碰| 人妻社区男人天堂| 91亚洲不卡一区| 婷婷国产精品九区| 91女神在线视频| www.99在线| 狠狠五月天| 920日本午夜免费| 熟妇熟女视频一区二区三区| 在线看免费无码AV天堂的| 色官网在线| 操91| 久久xxxx| 情色AV电影| 欧美色图亚洲色图成人在在线| 亚洲骚女一区二区三区| 99热这里都是精品| 日本在线不卡123| 少妇诱惑视频| 嗯嗯嗯不要不要免费视频| 青青草黑寡妇男人天堂| 久久久18禁| 超碰伊人在线| 亚洲诱惑天堂| 国内毛片四区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 日本天天干天天操一区| 九热久| 大二网站亚洲| 国产高清免费不卡av| 亚洲影院成人| 成人免费看吃奶视频网站| 亚欧无码在线| 日本久久999| 18禁精品网站在线看| 欧美成人A天堂片在线观看| 亚洲色图殴美色图激情乱伦| 美国人人操人人操| 亚洲AV无码乱码在线观看性色| 亚洲操操操| 在线天堂999| 国产AV人人 夜夜人人澡| 91女优在线观看| 久久中文字幕在线观看| 亚洲欧美国产va在线播放频| 99av| 亚洲欧美高清| 日本黄色精品专区网站| 国产日韩精品人妻久久久久色欲网站| 日本 色 导航| 亚洲一区二区性爱电影| 99这里只有精品| 嗯嗯啊啊啊好舒服| AV在线资源| 日韩成人人妻网站| 国产97亚洲| 99这里只有精品国产| 深夜激情无码| 色噜噜人妻av 中文字幕|