<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # F.25\. pgcrypto `pgcrypto`模塊為PostgreSQL提供cryptographic函數。 ## F.25.1\. 一般散列函數 ### F.25.1.1\. `digest()` ``` digest(data text, type text) returns bytea digest(data bytea, type text) returns bytea ``` 計算給定`data`的二進制散列。`type`是要使用的算法。 標準算法是`md5`, `sha1`, `sha224`, `sha256`, `sha384` 和 `sha512`。 如果`pgcrypto`帶有OpenSSL建立,那么更多算法可用,在 [Table F-18](#calibre_link-2295)中詳細說明。 如果你希望digest作為一個十六進制字符串,那么在結果上使用`encode()`。 例如: ``` CREATE OR REPLACE FUNCTION sha1(bytea) returns text AS $$ SELECT encode(digest($1, 'sha1'), 'hex') $$ LANGUAGE SQL STRICT IMMUTABLE; ``` ### F.25.1.2\. `hmac()` ``` hmac(data text, key text, type text) returns bytea hmac(data bytea, key text, type text) returns bytea ``` 為帶有鍵`key`的`data`計算散列的MAC。`type` 和在`digest()`中相同。 類似于`digest()`但是散列只能在知道鍵的時候計算。 這樣就阻止了某個人更改數據并改變匹配的散列的情況。 如果鍵比散列塊大小要大,那么將首先把鍵散列然后散列的結果作為鍵使用。 ## F.25.2\. 口令散列函數 函數`crypt()`和`gen_salt()`是特別為散列口令設計的。 `crypt()`做散列法,`gen_salt()`為其準備算法參數。 `crypt()`中的算法與普通散列算法(如MD5或SHA1)有以下方面的不同: 1. 他們的速度很慢。因為數據很少,所以這是唯一的讓蠻力破解口令困難些的方法。 2. 它們使用隨機值,稱為_salt_,所以有相同口令的用戶將會有不同加密了的口令。 也是也對反向算法的附加防御。 3. 它們在結果中包括算法類型,所以不同算法的口令散列可以共存。 4. 它們中的一些是自適應的,這意味著當計算機更快速時,你可以將算法調整的慢一些, 而不會引入與現有口令的不相容。 [Table F-15](#calibre_link-2296)列出了`crypt()` 函數支持的算法。 **Table F-15\. `crypt()`支持的算法** | 算法 | 最大口令長度 | 自適應? | Salt位 | 描述 | | --- | --- | --- | --- | --- | | `bf` | 72 | yes | 128 | 基于Blowfish,2a的變體 | | `md5` | unlimited | no | 48 | 基于MD5加密 | | `xdes` | 8 | yes | 24 | 擴展的DES | | `des` | 8 | no | 12 | 原始的UNIX加密 | ### F.25.2.1\. `crypt()` ``` crypt(password text, salt text) returns text ``` 計算一個`password`的crypt(3)類型散列。當存儲一個新的口令時, 需要使用`gen_salt()`生成一個新的`salt`值。 要檢查一個口令,作為`salt`傳遞存儲的散列值, 然后檢驗結果是否匹配存儲的值。 設置一個新的口令的示例: ``` UPDATE ... SET pswhash = crypt('new password', gen_salt('md5')); ``` 認證的示例: ``` SELECT pswhash = crypt('entered password', pswhash) FROM ... ; ``` 如果輸入的口令是正確的這個就返回`true`。 ### F.25.2.2\. `gen_salt()` ``` gen_salt(type text [, iter_count integer ]) returns text ``` 為`crypt()`的使用生成一個新的隨機salt字符串。 salt字符串也告訴`crypt()`使用哪種算法。 `type`參數指定散列算法。接受的類型有:`des`, `xdes`, `md5` 和 `bf`。 `iter_count`參數讓用戶指定重復計數,為這一個算法。計數值越高, 拿它去散列口令的次數越多,因此解開它的次數也越多。盡管太高的計數來計算一個散列可能會用幾年的時間, 這有點不切實際。如果省略了`iter_count`參數,那么使用缺省的重復計數。 `iter_count`的允許值取決于算法,在[Table F-16](#calibre_link-2297)中顯示。 **Table F-16\. `crypt()`的重復計數** | 算法 | 缺省 | 最小 | 最大 | | --- | --- | --- | --- | | `xdes` | 725 | 1 | 16777215 | | `bf` | 6 | 4 | 31 | 對于`xdes`,這里有一個附加的限制,那就是重復計數必須是奇數。 要選擇一個合適的重復計數,考慮原始的DES加密設計是要在那個時間的硬件上每秒有4個散列的速度。 比4個散列每秒慢的可能會降低可用性。高于100散列每秒的可能太快了。 [Table F-17](#calibre_link-2298)給出了不同散列算法的相對緩慢的概述。 該表顯示了在8字符口令里嘗試所有字符的組合將會花費多長時間,假設口令只包含小寫字母, 或者包含大小寫字母和數字。在`crypt-bf`記錄中, 斜線后的數字是`gen_salt`的`iter_count`參數。 **Table F-17\. 散列算法速度** | 算法 | 散列/sec | 對于 `[a-z]` | 對于 `[A-Za-z0-9]` | | --- | --- | --- | --- | | `crypt-bf/8` | 28 | 246 年 | 251322 年 | | `crypt-bf/7` | 57 | 121 年 | 123457 年 | | `crypt-bf/6` | 112 | 62 年 | 62831 年 | | `crypt-bf/5` | 211 | 33 年 | 33351 年 | | `crypt-md5` | 2681 | 2.6 年 | 2625 年 | | `crypt-des` | 362837 | 7 天 | 19 年 | | `sha1` | 590223 | 4 天 | 12 年 | | `md5` | 2345086 | 1 天 | 3 年 | 注意: * 使用的這個機器是1.5GHz Pentium 4。 * `crypt-des`和`crypt-md5`計算的數字是從 John the Ripper v1.6.38 `-test`的輸出獲得的。 * `md5`數字來自mdcrack 1.2。 * `sha1`數字來自lcrack-20031130-beta。 * `crypt-bf`數字使用一個簡單的程序獲得,這個程序重復超過1000次8字符口令。 這樣可以顯示速度和不同數字的迭代。例如:`john -test`顯示了 `crypt-bf/5`的213次循環/秒。(結果中非常小的不同與事實一致, `pgcrypto`中的`crypt-bf`實現和John the Ripper中使用的是同一個。) 請注意,"嘗試所有組合"是不現實的。不尋常的密碼破解在字典的幫助下完成, 包含普通的單詞和它們的各種轉變。所以,即使有點類似單詞的密碼可能比上述建議的數字破解的更快, 而一個6字符不像單詞的密碼可能避開破解。或者不能。 ## F.25.3\. PGP 加密功能 該功能實現了部分OpenPGP (RFC 4880)標準的加密。支持對稱秘鑰和公共秘鑰的加密。 一條加密的PGP消息包含2個部分,或_數據包_: * 數據包包含一個會話秘鑰—加密了的對稱秘鑰或者是公共秘鑰。 * 數據包包含帶有會話秘鑰的加密數據。 當帶有對稱秘鑰(如一個口令)加密時: 1. 給定的口令使用String2Key (S2K)算法散列。這和`crypt()`算法很相似— 自覺地變慢并且帶有隨機salt—但是它產生一個全長的二進制秘鑰。 2. 如果需要一個單獨的會話秘鑰,將會產生一個新的隨機秘鑰。否則將直接使用S2K秘鑰作為會話秘鑰。 3. 如果直接使用S2K秘鑰,那么只有S2K設置將被放入到會話秘鑰包。 否則會話秘鑰將用S2K秘鑰加密然后放入會話秘鑰包。 當使用公共秘鑰加密時: 1. 將會產生一個新的隨機會話秘鑰。 2. 它使用公共密鑰加密并放入會話秘鑰包中。 兩種情況下數據被加密的處理如下: 1. 可選的數據操作:壓縮,轉換成UTF-8,和/或行尾的轉換。 2. 數據帶有一塊隨機字節的前綴。這相當于使用一個隨機的IV。 3. 附加上一個隨機前綴和數據的SHA1散列。 4. 所有這些都帶有會話秘鑰加密,并放入數據包中。 ### F.25.3.1\. `pgp_sym_encrypt()` ``` pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea ``` 帶有一個對稱的PGP秘鑰`psw`加密`data`。 `options`參數可以包含選項設置,就像下面描述的那樣。 ### F.25.3.2\. `pgp_sym_decrypt()` ``` pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea ``` 解密一個對稱秘鑰加密的PGP信息。 用`pgp_sym_decrypt`解密`bytea`數據是不允許的。 這是為了避免輸出不合法的字符數據。用`pgp_sym_decrypt_bytea` 解密原始的文本數據是可以的。 `options`參數可以包含選項設置,就像下面描述的那樣。 ### F.25.3.3\. `pgp_pub_encrypt()` ``` pgp_pub_encrypt(data text, key bytea [, options text ]) returns bytea pgp_pub_encrypt_bytea(data bytea, key bytea [, options text ]) returns bytea ``` 用一個公共的PGP秘鑰`key`加密`data`。 給這個函數一個秘密秘鑰將產生一個錯誤。 `options`參數可以包含選項設置,就像下面描述的那樣。 ### F.25.3.4\. `pgp_pub_decrypt()` ``` pgp_pub_decrypt(msg bytea, key bytea [, psw text [, options text ]]) returns text pgp_pub_decrypt_bytea(msg bytea, key bytea [, psw text [, options text ]]) returns bytea ``` 解密一個公共密鑰加密的信息。`key`必須是與用來加密的公共秘鑰對應的秘密秘鑰。 如果該秘密秘鑰是密碼保護的,你必須在`psw`中給出密碼。 如果沒有密碼,但是你希望指定選項,你需要給出一個空的密碼。 用`pgp_pub_decrypt`解密`bytea`數據是不允許的。 這是為了避免輸出不合法的字符數據。用`pgp_pub_decrypt_bytea` 解密原始的文本數據是可以的。 `options`參數可以包含選項設置,就像下面描述的那樣。 ### F.25.3.5\. `pgp_key_id()` ``` pgp_key_id(bytea) returns text ``` `pgp_key_id`摘取一個PGP公共或秘密秘鑰的秘鑰 ID。 或如果給出一個加密的信息,它給出用于加密數據的秘鑰 ID。 它可以返回兩個特殊的秘鑰 ID: * `SYMKEY` 該信息是用對稱秘鑰加密的。 * `ANYKEY` 該信息是公共秘鑰加密的,但是秘鑰ID已經刪除了。這意味著你將要嘗試所有你的秘密秘鑰, 看看哪個能解密它。`pgcrypto`本身并不產生這樣的信息。 請注意,不同的秘鑰可能有相同的ID。這是稀少的,但是是一個普通事件。 然后客戶端應用應該嘗試解密每一個,看看哪個合適—類似處理`ANYKEY`。 ### F.25.3.6\. `armor()`, `dearmor()` ``` armor(data bytea) returns text dearmor(data text) returns bytea ``` 這些功能打包/解包二進制數據到PGP ASCII-armor格式, 這些基本上是帶有CRC的Base64和額外的格式。 ### F.25.3.7\. PGP功能的選項 選項的命名類似于GnuPG。選項的值應該在等號后面給出;選項之間用逗號隔開。例如: ``` pgp_sym_encrypt(data, psw, 'compress-algo=1, cipher-algo=aes256') ``` 除了`convert-crlf`之外的所有選項只應用到加密函數。 解密函數從PGP數據中獲得參數。 最有趣的選項可能就是`compress-algo`和`unicode-mode`了。 其余的應該有合理的默認值。 #### F.25.3.7.1\. cipher-algo 要使用的密碼算法。 值:?bf,?aes128,?aes192,?aes256?(OpenSSL-only:?`3des`,?`cast5`) 缺省:?aes128 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt #### F.25.3.7.2\. compress-algo 要使用的壓縮算法。只有PostgreSQL帶有zlib建立時可以使用。 值: ??0?-?沒有壓縮 ??1?-?ZIP?壓縮 ??2?-?ZLIB?壓縮?(=?ZIP?加上元數據和塊?CRCs) 缺省:?0 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt #### F.25.3.7.3\. 壓縮級別 壓縮多少。較高層次壓縮較小但是較慢。0表示禁用壓縮。 值:?0,?1-9 缺省:?6 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt #### F.25.3.7.4\. 轉換 crlf 在加密時是否將`\n`轉換為`\r\n`和在解密時是否將 `\r\n`轉換為`\n`。RFC 4880指定文本數據應該使用 `\r\n`換行存儲。使用這個獲得全部的RFC兼容性能。 值:?0,?1 缺省:?0 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt,?pgp_sym_decrypt,?pgp_pub_decrypt #### F.25.3.7.5\. 禁用 mdc 不要用SHA-1保護數據。唯一使用這個選項的理由是為了實現與古老的PGP產品的兼容, 該產品早于SHA-1受保護的包添加到RFC 4880。最近的gnupg.org和pgp.com軟件也很好的支持它。 值:?0,?1 缺省:?0 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt #### F.25.3.7.6\. 啟用會話秘鑰 使用單獨的會話秘鑰。公共秘鑰加密總是使用一個單獨的會話秘鑰;這是為了對稱秘鑰加密, 這在默認情況下是直接使用S2K秘鑰的。 值:?0,?1 缺省:?0 適用于:?pgp_sym_encrypt #### F.25.3.7.7\. s2k 模式 使用S2K算法。 值: ??0?-?沒有salt。?危險的! ??1?-?有salt但是帶有固定的重復計數。 ??3?-?變量重復計數。 缺省:?3 適用于:?pgp_sym_encrypt #### F.25.3.7.8\. s2k 摘要算法 在S2K計算中使用哪個摘要算法。 值:?md5,?sha1 缺省:?sha1 適用于:?pgp_sym_encrypt #### F.25.3.7.9\. s2k 密碼算法 加密單獨的會話秘鑰使用哪個密碼。 值:?bf,?aes,?aes128,?aes192,?aes256 缺省:?use?cipher-algo 適用于:?pgp_sym_encrypt #### F.25.3.7.10\. unicode 模式 是否要轉換文本數據從數據庫內部編碼到UTF-8及以前。如果你的數據庫已經是UTF-8, 將不需要轉換,但是消息將被標記為UTF-8。沒有這個選項將不會這樣。 值:?0,?1 缺省:?0 適用于:?pgp_sym_encrypt,?pgp_pub_encrypt ### F.25.3.8\. 用 GnuPG 產生 PGP 秘鑰 要生成一個新的秘鑰: ``` gpg --gen-key ``` 首選的秘鑰類型是"DSA and Elgamal"。 對于RSA加密,你必須創建DSA或RSA唯一簽署秘鑰作為主秘鑰,然后用 `gpg --edit-key`添加一個RSA加密子秘鑰。 要列出秘鑰: ``` gpg --list-secret-keys ``` 以ASCII-armor格式導出一個公共秘鑰: ``` gpg -a --export KEYID > public.key ``` 以ASCII-armor格式導出一個秘密秘鑰: ``` gpg -a --export-secret-keys KEYID > secret.key ``` 在將它們送給PGP函數之前需要在這些秘鑰上使用`dearmor()`。 或者如果你可以處理二進制數據,你可以從命令行中刪除`-a`。 要獲取更多詳細信息,請參閱`man gpg`, [The GNU Privacy Handbook](http://www.gnupg.org/gph/en/manual.html)和其他[http://www.gnupg.org](http://www.gnupg.org)上的文檔。 ### F.25.3.9\. PGP 代碼的限制 * 不支持簽名。這也意味著不檢查加密子秘鑰是否屬于主秘鑰。 * 不支持加密秘鑰作為主秘鑰。因為通常不建議這樣的做法,這應該不是一個問題。 * 不支持幾個子秘鑰。這可能看起來像是一個問題,因為這是習慣的做法。另一方面, 不應該使用帶有`pgcrypto`的定期GPG/PGP秘鑰,而是創建一個新的秘鑰, 因為使用場景相當不同。 ## F.25.4\. 行加密功能 這些功能在數據上只運行一個密碼;它們沒有任何比PGP加密更先進的特性。 因此它們有一些主要的問題: 1. 它們使用用戶秘鑰直接作為加密秘鑰。 2. 它們不提供任何完整性檢查,來看看加密的數據是否被修改了。 3. 它們希望用戶自己管理所有加密參數,即使是IV。 4. 它們不處理文本。 所以,隨著PGP加密的引入,不建議使用行加密功能了。 ``` encrypt(data bytea, key bytea, type text) returns bytea decrypt(data bytea, key bytea, type text) returns bytea encrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea decrypt_iv(data bytea, key bytea, iv bytea, type text) returns bytea ``` 加密/解密數據使用`type`指定的加密方法。 `type`字符串的語法是: ``` _algorithm_ [ `-` `_mode_` ] [ `/pad:` `_padding_` ] ``` 而`_algorithm_`是下列之一: * `bf` — Blowfish * `aes` — AES (Rijndael-128) `_mode_`是下列之一: * `cbc` — 下一個塊取決于前一個塊(缺省) * `ecb` — 每個塊單獨加密(只為了測試) `_padding_`是下列之一: * `pkcs` — 數據可以是任意長度(缺省) * `none` — 數據必須是加密塊尺寸的幾倍 所以,例如,這些是相等的: ``` encrypt(data, 'fooz', 'bf') encrypt(data, 'fooz', 'bf-cbc/pad:pkcs') ``` 在`encrypt_iv`和`decrypt_iv`中,`iv` 參數是CBC模式的初始值;在ECB中忽略。如果不正好是塊的大小則截斷或用0補齊。 在沒有這個參數的函數里缺省全部為0。 ## F.25.5\. 隨機數據函數 ``` gen_random_bytes(count integer) returns bytea ``` 密碼強隨機字節的返回`count`。一次最多可以提取1024個字節。 這是為了避免排干隨機發生器池。 ## F.25.6\. 注意 ### F.25.6.1\. 配置 `pgcrypto`根據主PostgreSQL `configure`腳本的調查結果配置它本身。 影響它的選項是`--with-zlib`和`--with-openssl`。 當用zlib編譯時,PGP加密函數可以在加密之前壓縮數據。 當用OpenSSL編譯時,有更多算法可用。公共秘鑰加密函數也會更快, 因為OpenSSL有更多優化了的BIGNUM函數。 **Table F-18\. 帶有和不帶有 OpenSSL 的功能性總結** | 功能性 | 內建 | 帶有 OpenSSL | | --- | --- | --- | | MD5 | yes | yes | | SHA1 | yes | yes | | SHA224/256/384/512 | yes | yes (注意 1) | | 其他摘要算法 | no | yes (注意 2) | | Blowfish | yes | yes | | AES | yes | yes (注意 3) | | DES/3DES/CAST5 | no | yes | | 行加密 | yes | yes | | PGP 對稱加密 | yes | yes | | PGP 公共秘鑰加密 | yes | yes | 注意: 1. SHA2算法在版本 0.9.8 的時候添加到了OpenSSL。對于更老的版本, `pgcrypto`使用內建的代碼。 2. 任何OpenSSL支持的摘要算法是自動獲得的。這對于密碼來說是不可能的,密碼需要明確的支持。 3. AES自版本 0.9.7 以來包含在OpenSSL中了。對于更老的版本, `pgcrypto`使用內建的代碼。 ### F.25.6.2\. NULL 處理 就像SQL中的標準,如果任一參數是NULL,那么所有函數都返回NULL。 這在粗心的使用中可能會造成安全風險。 ### F.25.6.3\. 安全限制 所有`pgcrypto`函數在數據庫服務器內部運行。這意味著`pgcrypto` 和客戶端應用之間的所有數據和口令移動都是以明文的形式。因此必須: 1. 本地連接或使用SSL連接。 2. 同時信任系統和數據庫管理員。 如果你做不到,那么最好在客戶端應用內部做crypto。 ### F.25.6.4\. 有用的閱讀 * [http://www.gnupg.org/gph/en/manual.html](http://www.gnupg.org/gph/en/manual.html) GNU 隱私手冊。 * [http://www.openwall.com/crypt/](http://www.openwall.com/crypt/) crypt-blowfish算法描述。 * [http://www.stack.nl/~galactus/remailers/passphrase-faq.html](http://www.stack.nl/~galactus/remailers/passphrase-faq.html) 如何選擇一個好的密碼。 * [http://world.std.com/~reinhold/diceware.html](http://world.std.com/~reinhold/diceware.html) 選擇密碼的有趣想法。 * [http://www.interhack.net/people/cmcurtin/snake-oil-faq.html](http://www.interhack.net/people/cmcurtin/snake-oil-faq.html) 描述密碼學的優劣。 ### F.25.6.5\. 技術參考文獻 * [http://www.ietf.org/rfc/rfc4880.txt](http://www.ietf.org/rfc/rfc4880.txt) OpenPGP 消息格式。 * [http://www.ietf.org/rfc/rfc1321.txt](http://www.ietf.org/rfc/rfc1321.txt) MD5 消息摘要算法。 * [http://www.ietf.org/rfc/rfc2104.txt](http://www.ietf.org/rfc/rfc2104.txt) HMAC:散列的消息認證。 * [http://www.usenix.org/events/usenix99/provos.html](http://www.usenix.org/events/usenix99/provos.html) crypt-des、crypt-md5和bcrypt算法的比較。 * [http://csrc.nist.gov/cryptval/des.htm](http://csrc.nist.gov/cryptval/des.htm) DES、3DES和AES標準。 * [http://en.wikipedia.org/wiki/Fortuna_(PRNG)](http://en.wikipedia.org/wiki/Fortuna_(PRNG)) Fortuna CSPRNG的描述。 * [http://jlcooke.ca/random/](http://jlcooke.ca/random/) 基于Jean-Luc Cooke Fortuna的Linux `/dev/random`驅動器。 * [http://research.cyber.ee/~lipmaa/crypto/](http://research.cyber.ee/~lipmaa/crypto/) 密碼學指針集合。 ## F.25.7\. 作者 Marko Kreen `&lt;[markokr@gmail.com](mailto:markokr@gmail.com)&gt;` `pgcrypto`使用來自下列源碼的代碼: | 算法 | 作者 | 起源 | | --- | --- | --- | | DES 加密 | David Burren 和其他人 | FreeBSD libcrypt | | MD5 加密 | Poul-Henning Kamp | FreeBSD libcrypt | | Blowfish 加密 | Solar Designer | www.openwall.com | | Blowfish 密碼 | Simon Tatham | PuTTY | | Rijndael 密碼 | Brian Gladman | OpenBSD sys/crypto | | MD5 和 SHA1 | WIDE Project | KAME kame/sys/crypto | | SHA256/384/512 | Aaron D. Gifford | OpenBSD sys/crypto | | BIGNUM math | Michael J. Fromberger | dartmouth.edu/~sting/sw/imath |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看