多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

nodejs教程

Node.js 加密

閱讀 (2508)

加密

穩定性: 2 - 不穩定; 正在討論未來版本的 API 改進,會盡量減少重大變化。詳見后文。

使用 require('crypto') 來訪問這個模塊。

加密模塊提供了 HTTP 或 HTTPS 連接過程中封裝安全憑證的方法。

它也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 簽名(sign) 和 驗證(verify) 方法的封裝。

crypto.setEngine(engine[, flags])

為某些/所有 OpenSSL 函數加載并設置引擎(根據參數 flags 來設置)。

engine 可能是 id,或者是指向引擎共享庫的路徑。

flags 是可選參數,默認值是ENGINE_METHOD_ALL ,它可以是以下一個或多個參數的組合(在constants里定義):

  • ENGINE_METHOD_RSA
  • ENGINE_METHOD_DSA
  • ENGINE_METHOD_DH
  • ENGINE_METHOD_RAND
  • ENGINE_METHOD_ECDH
  • ENGINE_METHOD_ECDSA
  • ENGINE_METHOD_CIPHERS
  • ENGINE_METHOD_DIGESTS
  • ENGINE_METHOD_STORE
  • ENGINE_METHOD_PKEY_METH
  • ENGINE_METHOD_PKEY_ASN1_METH
  • ENGINE_METHOD_ALL
  • ENGINE_METHOD_NONE

crypto.getCiphers()

返回支持的加密算法名數組。

例如:

var ciphers = crypto.getCiphers();
console.log(ciphers); // ['AES-128-CBC', 'AES-128-CBC-HMAC-SHA1', ...]

crypto.getHashes()

返回支持的哈希算法名數組。

例如:

var hashes = crypto.getHashes();
console.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...]

crypto.createCredentials(details)

穩定性: 0 - 拋棄. 用 [tls.createSecureContext][] 替換.

根據參數 details,創建一個加密憑證對象。參數為字典,key 包括:

  • pfx : 字符串或者buffer對象,表示經PFX或PKCS12編碼產生的私鑰、證書以及CA證書
  • key : 進過 PEM 編碼的私鑰
  • passphrase : 私鑰或 pfx 的密碼
  • cert : PEM 編碼的證書
  • ca : 字符串或字符串數組,PEM 編碼的可信任的 CA 證書。
  • crl : 字符串或字符串數組,PEM 編碼的 CRLs(證書吊銷列表Certificate Revocation List)。
  • ciphers: 字符串,使用或者排除的加密算法。參見http://www.openssl.org/docs/apps/ciphers.html

如果沒有指定 'ca',Node.js將會使用下面列表中的CAhttp://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt

crypto.createHash(algorithm)

創建并返回一個哈希對象,使用指定的算法來生成哈希摘要。

參數 algorithm 取決于平臺上 OpenSSL 版本所支持的算法。例如,'sha1', 'md5','sha256', 'sha512' 等等。在最近的版本中,openssllist-message-digest-algorithms 會顯示所有算法。

例如: 這個程序會計算文件的 sha1 的和。

var filename = process.argv[2];
var crypto = require('crypto');
var fs = require('fs');

var shasum = crypto.createHash('sha1');

var s = fs.ReadStream(filename);
s.on('data', function(d) {
  shasum.update(d);
});

s.on('end', function() {
  var d = shasum.digest('hex');
  console.log(d + '  ' + filename);
});

類: Hash

用來生成數據的哈希值。

它是可讀寫的流 stream 。寫入的數據來用計算哈希值。當寫入流結束后,使用 read() 方法來獲取計算后的哈希值。也支持老的 updatedigest 方法。

通過 crypto.createHash 返回。

hash.update(data[, input_encoding])

根據 data 來更新哈希內容,編碼方式根據 input_encoding 來定,有 'utf8', 'ascii''binary'。如果沒有傳入值,默認編碼方式是'binary'。如果 dataBufferinput_encoding 將會被忽略。

因為它是流式數據,所以可以使用不同的數據調用很多次。

hash.digest([encoding])

計算傳入的數據的哈希摘要。encoding 可以是 'hex', 'binary''base64',如果沒有指定encoding ,將返回 buffer。
注意:調用 digest() 后不能再用 hash 對象。

crypto.createHmac(algorithm, key)

創建并返回一個 hmac 對象,用指定的算法和秘鑰生成 hmac 圖譜。

它是可讀寫的流 stream 。寫入的數據來用計算 hmac。當寫入流結束后,使用 read() 方法來獲取計算后的值。也支持老的 updatedigest 方法。

參數 algorithm 取決于平臺上 OpenSSL 版本所支持的算法,參見前面的 createHash。key是 hmac 算法中用的 key。

類: Hmac

用來創建 hmac 加密圖譜。

通過 crypto.createHmac 返回。

hmac.update(data)

根據 data 更新 hmac 對象。因為它是流式數據,所以可以使用新數據調用多次。

hmac.digest([encoding])

計算傳入數據的 hmac 值。encoding可以是 'hex', 'binary''base64',如果沒有指定encoding ,將返回 buffer。

注意:調用 digest() 后不能再用 hmac 對象。

crypto.createCipher(algorithm, password)

使用傳入的算法和秘鑰來生成并返回加密對象。

algorithm 取決于 OpenSSL,例如'aes192'等。最近發布的版本中, openssl list-cipher-algorithms 將會展示可用的加密算法。password 用來派生 key 和 IV,它必須是一個'binary' 編碼的字符串或者一個buffer

它是可讀寫的流 stream 。寫入的數據來用計算 hmac。當寫入流結束后,使用 read() 方法來獲取計算后的值。也支持老的updatedigest 方法。

注意,OpenSSL 函數EVP_BytesToKey摘要算法如果是一次迭代(one iteration),無需鹽值(no salt)的 MD5 時, createCipher 為它派生秘鑰。缺少鹽值使得字典攻擊,相同的密碼總是生成相同的key,低迭代次數和非加密的哈希算法,使得密碼測試非常迅速。

OpenSSL推薦使用 pbkdf2 來替換 EVP_BytesToKey,推薦使用 crypto.pbkdf2 來派生 key 和iv ,推薦使用 createCipheriv() 來創建加密流。

crypto.createCipheriv(algorithm, key, iv)

創建并返回一個加密對象,用指定的算法,key 和 iv。

algorithm 參數和 createCipher() 一致。key 在算法中用到.iv 是一個initialization vector.

keyiv 必須是 'binary' 的編碼字符串或buffers.

類: Cipher

加密數據的類。.

通過 crypto.createCiphercrypto.createCipheriv 返回。

它是可讀寫的流 stream 。寫入的數據來用計算 hmac。當寫入流結束后,使用 read() 方法來獲取計算后的值。也支持老的updatedigest 方法。

cipher.update(data[, input_encoding][, output_encoding])

根據 data 來更新哈希內容,編碼方式根據 input_encoding 來定,有 'utf8', 'ascii' or'binary'。如果沒有傳入值,默認編碼方式是'binary'。如果dataBufferinput_encoding 將會被忽略。

output_encoding 指定了輸出的加密數據的編碼格式,它可用是 'binary', 'base64''hex'。如果沒有提供編碼,將返回 buffer 。

返回加密后的內容,因為它是流式數據,所以可以使用不同的數據調用很多次。

cipher.final([output_encoding])

返回加密后的內容,編碼方式是由 output_encoding 指定,可以是 'binary', 'base64''hex'。如果沒有傳入值,將返回 buffer。

注意:cipher 對象不能在 final() 方法之后調用。

cipher.setAutoPadding(auto_padding=true)

你可以禁用輸入數據自動填充到塊大小的功能。如果 auto_padding 是false, 那么輸入數據的長度必須是加密器塊大小的整倍數,否則 final 會失敗。這對非標準的填充很有用,例如使用0x0而不是PKCS的填充。這個函數必須在 cipher.final 之前調用。

cipher.getAuthTag()

加密認證模式(目前支持:GCM),這個方法返回經過計算的認證標志 Buffer。必須使用final方法完全加密后調用。

cipher.setAAD(buffer)

加密認證模式(目前支持:GCM),這個方法設置附加認證數據( AAD )。

crypto.createDecipher(algorithm, password)

根據傳入的算法和密鑰,創建并返回一個解密對象。這是 createCipher() 的鏡像。

crypto.createDecipheriv(algorithm, key, iv)

根據傳入的算法,密鑰和 iv,創建并返回一個解密對象。這是 createCipheriv() 的鏡像。

類: Decipher

解密數據類。

通過 crypto.createDeciphercrypto.createDecipheriv 返回。

解密對象是可讀寫的流 streams 。用寫入的加密數據生成可讀的純文本數據。也支持老的updatedigest 方法。

decipher.update(data[, input_encoding][, output_encoding])

使用參數 data 更新需要解密的內容,其編碼方式是 'binary','base64''hex'。如果沒有指定編碼方式,則把 data 當成 buffer 對象。

如果 dataBuffer,則忽略 input_encoding 參數。

參數 output_decoding 指定返回文本的格式,是 'binary', 'ascii''utf8' 之一。如果沒有提供編碼格式,則返回 buffer。

decipher.final([output_encoding])

返回剩余的解密過的內容,參數 output_encoding'binary', 'ascii''utf8',如果沒有指定編碼方式,返回 buffer。

注意,decipher對象不能在 final() 方法之后使用。

decipher.setAutoPadding(auto_padding=true)

如果加密的數據是非標準塊,可以禁止其自動填充,防止 decipher.final 檢查并移除。僅在輸入數據長度是加密塊長度的整數倍的時才有效。你必須在 decipher.update 前調用。

decipher.setAuthTag(buffer)

對于加密認證模式(目前支持:GCM),必須用這個方法來傳遞接收到的認證標志。如果沒有提供標志,或者密文被篡改,將會拋出 final 標志,認證失敗,密文會被拋棄,

decipher.setAAD(buffer)

對于加密認證模式(目前支持:GCM),用這個方法設置附加認證數據( AAD )。

crypto.createSign(algorithm)

根據傳入的算法創建并返回一個簽名數據。 OpenSSL 的最近版本里,openssl list-public-key-algorithms 會列出所有算法,比如'RSA-SHA256'

類: Sign

生成數字簽名的類。

通過 crypto.createSign 返回。

簽名對象是可讀寫的流 streams。可寫數據用來生成簽名。當所有的數據寫完,sign 簽名方法會返回簽名。也支持老的 updatedigest 方法。

sign.update(data)

用參數 data 來更新簽名對象。因為是流式數據,它可以被多次調用。

sign.sign(private_key[, output_format])

根據傳送給sign的數據來計算電子簽名。

private_key 可以是一個對象或者字符串。如果是字符串,將會被當做沒有密碼的key。

private_key:

  • key : 包含 PEM 編碼的私鑰
  • passphrase : 私鑰的密碼

返回值output_format 包含數字簽名, 格式是 'binary','hex''base64' 之一。如果沒有指定 encoding ,將返回 buffer。

注意:sign 對象不能在 sign() 方法之后調用。

crypto.createVerify(algorithm)

根據傳入的算法,創建并返回驗證對象。是簽名對象(signing object)的鏡像。

類: Verify

用來驗證簽名的類。

通過 crypto.createVerify 返回。

是可寫流 streams。可寫數據用來驗證簽名。一旦所有數據寫完后,如簽名正確 verify 方法會返回 true

也支持老的 update 方法。

verifier.update(data)

用參數 data 來更新驗證對象。因為是流式數據,它可以被多次調用。

verifier.verify(object, signature[, signature_format])

使用 objectsignature 驗證簽名數據。參數 object 是包含了 PEM 編碼對象的字符串,它可以是 RSA 公鑰, DSA 公鑰, 或 X.509 證書。signature 是之前計算出來的數字簽名。signature_format 可以是 'binary', 'hex''base64' 之一,如果沒有指定編碼方式 ,則默認是buffer 對象。

根據數據和公鑰驗證簽名有效性,來返回 true 或 false。

注意:verifier 對象不能在 verify() 方法之后調用。

crypto.createDiffieHellman(prime_length[, generator])

創建一個 Diffie-Hellman 密鑰交換(Diffie-Hellman key exchange)對象,并根據給定的位長度生成一個質數。如果沒有指定參數 generator,默認為 2

crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])

使用傳入的 primegenerator 創建 Diffie-Hellman 秘鑰交互對象。

generator 可以是數字,字符串或Buffer。

如果沒有指定 generator,使用 2.

prime_encodinggenerator_encoding 可以是 'binary', 'hex', 或 'base64'

如果沒有指定 prime_encoding, 則 Buffer 為 prime

如果沒有指定 generator_encoding ,則 Buffer 為 generator

類: DiffieHellman

創建 Diffie-Hellman 秘鑰交換的類。

通過 crypto.createDiffieHellman 返回。

diffieHellman.verifyError

在初始化的時候,如果有警告或錯誤,將會反應到這。它是以下值(定義在 constants 模塊):

  • DH_CHECK_P_NOT_SAFE_PRIME
  • DH_CHECK_P_NOT_PRIME
  • DH_UNABLE_TO_CHECK_GENERATOR
  • DH_NOT_SUITABLE_GENERATOR

diffieHellman.generateKeys([encoding])

生成秘鑰和公鑰,并返回指定格式的公鑰。這個值必須傳給其他部分。編碼方式: 'binary', 'hex',或 'base64'。如果沒有指定編碼方式,將返回 buffer。

diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])

使用 other_public_key 作為第三方公鑰來計算并返回共享秘密(shared secret)。秘鑰用input_encoding 編碼。編碼方式為:'binary', 'hex', 或 'base64'。如果沒有指定編碼方式 ,默認為 buffer。

如果沒有指定返回編碼方式,將返回 buffer。

diffieHellman.getPrime([encoding])

用參數 encoding 指明的編碼方式返回 Diffie-Hellman 質數,編碼方式為: 'binary', 'hex', 或 'base64'。 如果沒有指定編碼方式,將返回 buffer。

diffieHellman.getGenerator([encoding])

用參數 encoding 指明的編碼方式返回 Diffie-Hellman 生成器,編碼方式為: 'binary', 'hex', 或 'base64'. 如果沒有指定編碼方式 ,將返回 buffer。

diffieHellman.getPublicKey([encoding])

用參數 encoding 指明的編碼方式返回 Diffie-Hellman 公鑰,編碼方式為: 'binary', 'hex', 或 'base64'. 如果沒有指定編碼方式 ,將返回 buffer。

diffieHellman.getPrivateKey([encoding])

用參數 encoding 指明的編碼方式返回 Diffie-Hellman 私鑰,編碼方式為: 'binary', 'hex', 或 'base64'. 如果沒有指定編碼方式 ,將返回 buffer。

diffieHellman.setPublicKey(public_key[, encoding])

設置 Diffie-Hellman 的公鑰,編碼方式為: 'binary', 'hex', 或 'base64',如果沒有指定編碼方式 ,默認為 buffer。

diffieHellman.setPrivateKey(private_key[, encoding])

設置 Diffie-Hellman 的私鑰,編碼方式為: 'binary', 'hex', 或 'base64',如果沒有指定編碼方式 ,默認為 buffer。

crypto.getDiffieHellman(group_name)

創建一個預定義的 Diffie-Hellman 秘鑰交換對象。支持的組: 'modp1', 'modp2', 'modp5' (定義于RFC 2412) and 'modp14', 'modp15', 'modp16', 'modp17','modp18' (定義于RFC 3526). 返回對象模仿了上述創建的crypto.createDiffieHellman()對象,但是不允許修改秘鑰交換(例如,diffieHellman.setPublicKey())。使用這套流程的好處是,雙方不需要生成或交換組組余數,節省了計算和通訊時間。

例如 (獲取一個共享秘密):

var crypto = require('crypto');
var alice = crypto.getDiffieHellman('modp5');
var bob = crypto.getDiffieHellman('modp5');

alice.generateKeys();
bob.generateKeys();

var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);

crypto.createECDH(curve_name)

使用傳入的參數 curve_name,創建一個 Elliptic Curve (EC) Diffie-Hellman 秘鑰交換對象。

類: ECDH

這個類用來創建 EC Diffie-Hellman 秘鑰交換。

通過 crypto.createECDH 返回。

ECDH.generateKeys([encoding[, format]])

生成 EC Diffie-Hellman 的秘鑰和公鑰,并返回指定格式和編碼的公鑰,它會傳遞給第三方。

參數 format'compressed', 'uncompressed', 或 'hybrid'. 如果沒有指定,將返回'uncompressed' 格式.

參數encoding'binary', 'hex', 或 'base64'. 如果沒有指定編碼方式 ,將返回 buffer。

ECDH.computeSecret(other_public_key[, input_encoding][, output_encoding])

other_public_key 作為第三方公鑰計算共享秘密,并返回。秘鑰會以input_encoding來解讀。編碼是:'binary', 'hex', 或 'base64'。如果沒有指定編碼方式 ,默認為 buffer。

如果沒有指定編碼方式 ,將返回 buffer。

ECDH.getPublicKey([encoding[, format]])

用參數 encoding 指明的編碼方式返回 EC Diffie-Hellman 公鑰,編碼方式為: 'compressed', 'uncompressed', 或'hybrid'. 如果沒有指定編碼方式 ,將返回'uncompressed'

編碼是:'binary', 'hex', 或 'base64'。如果沒有指定編碼方式 ,默認為 buffer。

ECDH.getPrivateKey([encoding])

用參數 encoding 指明的編碼方式返回 EC Diffie-Hellman 私鑰,編碼是:'binary', 'hex', 或 'base64'。如果沒有指定編碼方式 ,默認為 buffer。

ECDH.setPublicKey(public_key[, encoding])

設置 EC Diffie-Hellman 的公鑰,編碼方式為: 'binary', 'hex', 或 'base64',如果沒有指定編碼方式 ,默認為 buffer。

ECDH.setPrivateKey(private_key[, encoding])

設置 EC Diffie-Hellman 的私鑰,編碼方式為: 'binary', 'hex', 或 'base64',如果沒有指定編碼方式 ,默認為 buffer。

例如 (包含一個共享秘密):

var crypto = require('crypto');
var alice = crypto.createECDH('secp256k1');
var bob = crypto.createECDH('secp256k1');

alice.generateKeys();
bob.generateKeys();

var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);

crypto.pbkdf2(password, salt, iterations, keylen[, digest], callback)

異步 PBKDF2 提供了一個偽隨機函數 HMAC-SHA1,根據給定密碼的長度,salt 和 iterations 來得出一個密鑰。回調函數得到兩個參數 (err, derivedKey)。

例如:

crypto.pbkdf2('secret', 'salt', 4096, 512, 'sha256', function(err, key) {
  if (err)
    throw err;
  console.log(key.toString('hex'));  // 'c5e478d...1469e50'
});

crypto.getHashes() 里有支持的摘要函數列表。

crypto.pbkdf2Sync(password, salt, iterations, keylen[, digest])

異步 PBKDF2 函數. 返回 derivedKey 或拋出錯誤。

crypto.randomBytes(size[, callback])

生成一個密碼強度隨機的數據:

// async
crypto.randomBytes(256, function(ex, buf) {
  if (ex) throw ex;
  console.log('Have %d bytes of random data: %s', buf.length, buf);
});

// sync
try {
  var buf = crypto.randomBytes(256);
  console.log('Have %d bytes of random data: %s', buf.length, buf);
} catch (ex) {
  // handle error
  // most likely, entropy sources are drained
}

注意:如果沒有足夠積累的熵來生成隨機強度的密碼,將會拋出錯誤,或調用回調函數返回錯誤。換句話說,沒有回調函數的 crypto.randomBytes 不會阻塞,即使耗盡所有的熵。

crypto.pseudoRandomBytes(size[, callback])

生成非密碼學強度的偽隨機數據。如果數據足夠長會返回一個唯一數據,但是這個數可能是可以預期的。因此,當不可預期很重要的時候,不要用這個函數。例如,在生成加密的秘鑰時。

用法和 crypto.randomBytes 相同。

類: Certificate

這個類和簽過名的公鑰打交道。最重要的場景是處理 <keygen> 元素,http://www.openssl.org/docs/apps/spkac.html

通過 crypto.Certificate 返回.

Certificate.verifySpkac(spkac)

根據 SPKAC 返回 true 或 false。

Certificate.exportChallenge(spkac)

根據提供的SPKAC,返回加密的公鑰。

Certificate.exportPublicKey(spkac)

輸出和 SPKAC 關聯的編碼 challenge。

crypto.publicEncrypt(public_key, buffer)

使用 public_key 加密 buffer。目前僅支持 RSA。

public_key 可以是對象或字符串。如果 public_key 是一個字符串,將會當做沒有密碼的key,并會用RSA_PKCS1_OAEP_PADDING

public_key:

  • key : 包含有 PEM 編碼的私鑰。
  • padding : 填充值,如下
    • constants.RSA_NO_PADDING
    • constants.RSA_PKCS1_PADDING
    • constants.RSA_PKCS1_OAEP_PADDING

注意: 所有的填充值 定義于constants 模塊.

crypto.privateDecrypt(private_key, buffer)

使用 private_key 來解密 buffer.

private_key:

  • key : 包含有 PEM 編碼的私鑰
  • passphrase : 私鑰的密碼
  • padding : 填充值,如下:
    • constants.RSA_NO_PADDING
    • constants.RSA_PKCS1_PADDING
    • constants.RSA_PKCS1_OAEP_PADDING

注意: 所有的填充值 定義于constants 模塊.

crypto.DEFAULT_ENCODING

函數所用的編碼方式可以是字符串或 buffer ,默認值是 'buffer'。這是為了加密模塊兼容默認 'binary' 為編碼方式的遺留程序。

注意,新程序希望用 buffer 對象,所以這是暫時手段。

Recent API Changes

在統一的流 API 概念出現前,在引入 Buffer 對象來處理二進制數據之前,Crypto 模塊就已經添加到 Node。

因此,流相關的類里沒有其他的 Node 類里的典型方法,并且很多方法接收并返回二級制編碼的字符串,而不是 Buffers。在最近的版本中,這些函數改成默認使用 Buffers。

對于一些場景來說這是重大變化。

例如,如果你使用默認參數給簽名類,將結果返回給認證類,中間沒有驗證數據,程序會正常工作。之前你會得到二進制編碼的字符串,并傳遞給驗證類,現在則是 Buffer。

如果你之前使用的字符串數據在 Buffers 對象不能正常工作(比如,連接數據,并存儲在數據庫里 )。或者你傳遞了二進制字符串給加密函數,但是沒有指定編碼方式,現在就需要提供編碼參數。如果想切換回原來的風格,將 crypto.DEFAULT_ENCODING 設置為 'binary'。注意,新的程序希望是 buffers,所以之前的方法只能作為臨時的辦法。

關閉
程序員人生
主站蜘蛛池模板: 久久国产欧美日韩高清专区 | 日本网络视频www色高清免费 | 亚洲韩精品欧美一区二区三区 | 欧美性受xxxx喷水大胸 | 成人在激情在线视频 | 羞羞视频入口网站 | 亚洲高清中文字幕 | 成人精品视频一区二区三区 | 亚洲人成综合在线播放 | 日韩精品大片 | 在线亚洲欧国产精品专区 | 麻豆精品国产自产在线 | 亚洲三级自拍 | 性激烈的欧美三级视频中文字幕 | 亚洲日本中文字幕天堂网 | 日本一区二区在线播放 | 激情一区二区三区 | 天天鲁一鲁 | 国产精品欧美视频另类专区 | 91精品成人免费国产片 | 亚洲另类图片小说 | 91精品福利观看 | 亚洲精品综合 | 欧洲成人在线视频 | 性配久久久 | 国产成人精品亚洲一区 | 亚洲高清网站 | 欧美人一级淫片a免费播放 欧美人与z0z0xxxx | 成人欧美精品久久久久影院 | 美女牲交毛片一级视频 | 精品亚洲成a人在线观看 | 欧美另类精品一区二区三区 | 午夜免费福利网站 | 亚洲欧美日韩国产 | 国产产一区二区三区久久毛片国语 | 久久www成人看片 | 日本一区二区在线不卡 | 亚洲福利片 | 欧美爱爱网址 | 亚洲高清在线观看播放 | 亚洲色图 校园春色 |