IO.js Crypto

2018-11-28 22:33 更新

穩(wěn)定度: 2 - 穩(wěn)定

使用require('crypto')來獲取這個模塊。

crypto模塊提供了一種封裝安全證書的方法,用來作為安全HTTPS網(wǎng)絡(luò)和HTTP鏈接的一部分。

它也提供了一個OpenSSL hash,hamc,cipherdecipher,signvierify方法的包裝集合。

crypto.setEngine(engine[, flags])

加載和設(shè)置 一些/所有 OpenSSL功能引擎(由標(biāo)記選擇)。

引擎可以通過id或 引擎共享庫的路徑 來選擇。

flags是可選的,并且有一個ENGINE_METHOD_ALL默認(rèn)值。可以選一個或多個以下的標(biāo)記(在常量模塊中定義)。

  • 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()

返回一個支持的加密算法的名字?jǐn)?shù)組。

例子:

var ciphers = crypto.getCiphers();
console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...]

crypto.getHashes()

返回一個支持的哈希算法的名字?jǐn)?shù)組。

例子:

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

crypto.getCurves()

返回一個支持的橢圓加密算法的名字?jǐn)?shù)組。

例子:

var curves = crypto.getCurves();
console.log(curves); // ['secp256k1', 'secp384r1', ...]

crypto.createCredentials(details)

穩(wěn)定度: 0 - 棄用。使用tls.createSecureContext代替。

創(chuàng)建一個加密憑證對象,接受一個可選的帶鍵字典details

  • pfx : 一個帶著PFXPKCS12加密的私鑰,加密憑證和CA證書的字符串或buffer。
  • key : 一個帶著PEM加密私鑰的字符串。
  • passphrase : 一個私鑰或pfx密碼字符串。
  • cert : 一個帶著PEM加密憑證的字符串。
  • ca : 一個用來信任的PEM加密CA證書的字符串或字符串列表。
  • crl : 一個PEM加密CRL的字符串或字符串列表。
  • ciphers: 一個描述需要使用或排除的加密算法的字符串。更多加密算法的格式細(xì)節(jié)參閱http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT

如果沒有指定ca,那么io.js將會使用http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt.提供的默認(rèn)公共可信任CA列表。

crypto.createHash(algorithm)

創(chuàng)建并返回一個哈希對象,一個指定算法的加密哈希用來生成哈希摘要。

algorithm依賴于平臺上的OpenSSL版本所支持的算法。例如'sha1''md5','sha256','sha512'等等。openssl list-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);
});

Class: Hash

這個類用來創(chuàng)建數(shù)據(jù)哈希摘要。

這是一個同時可讀與可寫的流。寫入的數(shù)據(jù)用來計算哈希。一旦當(dāng)流的可寫端終止,使用read()來獲取計算所得哈希摘要。遺留的updatedigest方法同樣被支持。

通過crypto.createHash返回。

hash.update(data[, input_encoding])

使用給定的data更新哈希內(nèi)容,通過input_encoding指定的編碼可以是'utf8','ascii''binary'。如果沒有提供編碼,并且輸入是一個字符串,那么將會指定編碼為'binary'。如果data是一個Buffer那么input_encoding會被忽略。

它是流式數(shù)據(jù),所以這個方法可以被調(diào)用多次。

hash.digest([encoding])

計算所有的被傳遞的數(shù)據(jù)的摘要。encoding可以是'binary''hex''base64'。如果沒有指定編碼,那么一個buffer被返回。

注意:當(dāng)調(diào)用了digest()方法之后,哈希對象不能再被使用了。

crypto.createHmac(algorithm, key)

創(chuàng)建并返回一個hmac對象,即通過給定的算法和密鑰生成的加密圖譜(cryptographic)。

這是一個既可讀又可寫的流。寫入的數(shù)據(jù)被用來計算hamc。一旦當(dāng)流的可寫端終止,使用read()方法來獲取計算所得摘要值。遺留的updatedigest方法同樣被支持。

algorithm依賴于平臺上的OpenSSL版本所支持的算法。參閱上文createHash。key是要使用的hmac密鑰。

Class: Hmac

用于創(chuàng)建hmac加密圖譜(cryptographic)的類。

通過crypto.createHmac返回。

hmac.update(data)

只用指定的data更新hmac內(nèi)容。因為它是流式數(shù)據(jù),所以這個方法可以被調(diào)用多次。

hmac.digest([encoding])

計算所有的被傳遞的數(shù)據(jù)的hmac摘要。encoding可以是'binary''hex''base64'。如果沒有指定編碼,那么一個buffer被返回。

注意:當(dāng)調(diào)用了digest()方法之后,hmac對象不能再被使用了。

crypto.createCipher(algorithm, password)

創(chuàng)建和返回一個cipher對象,指定指定的算法和密碼。

算法依賴于OpenSSL,如果'aes192',等等。在最近的發(fā)行版中,openssl list-cipher-algorithms命令會展示可用的cipher算法。密碼被用來獲取密鑰和IV,必須是一個'binary'編碼的字符串或buffer。

這是一個既可讀又可寫的流。寫入的數(shù)據(jù)被用來計算哈希。一旦當(dāng)流的可寫端終止,使用read()方法來獲取通過cipher計算所得的內(nèi)容。遺留的updatedigest方法同樣被支持。

注意:createCipher通過 無鹽MD5一次迭代所得的摘要 來調(diào)用 OpenSSL函數(shù)EVP_BytesToKey` 來派生密鑰。無鹽意味允許字典攻擊,即同樣的密碼經(jīng)??梢杂脕韯?chuàng)建同樣的密鑰。一次迭代并且無加密圖譜安全(non-cryptographically secure)以為著允許密碼被快速測試。

OpenSSL建議使用pbkdf2替代EVP_BytesToKey,推薦你通過crypto.pbkdf2然后調(diào)用createCipheriv()創(chuàng)建一個cipher流來派生一個密鑰和iv。

crypto.createCipheriv(algorithm, key, iv)

創(chuàng)建和返回一個cipher對象,指定指定的算法,密鑰和iv。

algorithm參數(shù)與createCipher()相同。key是被算法使用的源密鑰(raw key)。iv是初始化矢量(initialization vector)。

keyiv必須是'binary'編碼的字符串或buffer。

Class: Cipher

創(chuàng)建一個加密數(shù)據(jù)。

crypto.createCiphercrypto.createCipheriv返回。

這是一個既可讀又可寫的流。寫入的文本數(shù)據(jù)被用來在可讀端生產(chǎn)被加密的數(shù)據(jù)。遺留的updatefinal方法同樣被支持。

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

通過data更新cipher,input_encoding中指定的編碼可以是'utf8','ascii''binary'。如果沒有提供編碼,那么希望接受到一個buffer。如果數(shù)據(jù)是一個Buffer,那么input_encoding將被忽略。

output_encoding指定了加密數(shù)據(jù)的輸出格式,可以是'binary''base64''hex'。如果沒有指定編碼,那么一個buffer會被返回。

返回一個加密內(nèi)容,并且因為它是流式數(shù)據(jù),所以可以被調(diào)用多次。

cipher.final([output_encoding])

返回所有的剩余的加密內(nèi)容,output_encoding可以是'binary','base64''hex'。如果沒有指定編碼,那么一個buffer會被返回。

注意:當(dāng)調(diào)用了final()方法之后,cipher對象不能再被使用了。

cipher.setAutoPadding(auto_padding=true)

你可以禁用自動填充輸入數(shù)據(jù)至塊大小。如果auto_paddingfalse,那么整個輸入數(shù)據(jù)的長度必須cipher的塊大小的整數(shù)倍,否則會失敗。這對非標(biāo)準(zhǔn)填充非常有用,如使用0x0替代PKCS填充。你必須在cipher.final之前調(diào)用它。

cipher.getAuthTag()

對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法返回一個從給定數(shù)據(jù)計算所得的代表了認(rèn)證標(biāo)簽的Buffer。必須在final方法被調(diào)用后調(diào)用。

cipher.setAAD(buffer)

對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法設(shè)置被用于額外已認(rèn)證數(shù)據(jù)(AAD)輸入?yún)?shù)的值。

crypto.createDecipher(algorithm, password)

使用給定算法和密鑰,創(chuàng)建并返回一個解密器對象。這是上文createCipher()的一個鏡像。

crypto.createDecipheriv(algorithm, key, iv)

使用給定算法,密鑰和iv,創(chuàng)建并返回一個解密器對象。這是上文createCipheriv()的一個鏡像。

Class: Decipher

解密數(shù)據(jù)類。

通過crypto.createDeciphercrypto.createDecipheriv返回。

這是一個既可讀又可寫的流。寫入的被加密的數(shù)據(jù)被用來在可讀端生產(chǎn)文本數(shù)據(jù)。遺留的updatefinal方法同樣被支持。

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

通過data更新decipher,編碼可以是'binary','base64''hex'。如果沒有提供編碼,那么希望接受到一個buffer。如果數(shù)據(jù)是一個Buffer,那么input_encoding將被忽略。

output_encoding指定了解密數(shù)據(jù)的輸出格式,可以是'binary','ascii''utf8'。如果沒有指定編碼,那么一個buffer會被返回。

decipher.final([output_encoding])

返回所有的剩余的文本數(shù)據(jù),output_encoding可以是'binary','ascii''utf8'。如果沒有指定編碼,那么一個buffer會被返回。

注意:當(dāng)調(diào)用了final()方法之后,decipher對象不能再被使用了。

decipher.setAutoPadding(auto_padding=true)

如數(shù)據(jù)沒有使用標(biāo)準(zhǔn)塊填充阻止decipher.final檢查和刪除它來加密,你可以禁用自動填充。那么整個輸入數(shù)據(jù)的長度必須cipher的塊大小的整數(shù)倍,否則會失敗。你必須在將數(shù)據(jù)導(dǎo)流至decipher.update前調(diào)用它。

decipher.setAuthTag(buffer)

對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法必須被傳遞,用來接受認(rèn)證標(biāo)簽。如果沒有提供標(biāo)簽或密文被干擾,最終會拋出一個錯誤。

decipher.setAAD(buffer)

對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法設(shè)置被用于額外已認(rèn)證數(shù)據(jù)(AAD)輸入?yún)?shù)的值。

crypto.createSign(algorithm)

使用指定的算法,創(chuàng)建并返回一個數(shù)字簽名類。在最近的OpenSSL發(fā)行版中,openssl list-public-key-algorithms會列出所有支持的數(shù)字簽名算法。例如'RSA-SHA256'。

Class: Sign

用于生成數(shù)字簽名的類。

通過crypto.createSign返回。

Sign對象是一個可寫流。寫入的數(shù)據(jù)用來生成數(shù)字簽名。一旦所有的數(shù)據(jù)被寫入,sign方法會返回一個數(shù)字簽名。遺留的update方法也支持。

sign.update(data)

使用data更新sign對象。因為它是流式的所以這個方法可以被調(diào)用多次。

sign.sign(private_key[, output_format])

根據(jù)所有通過update方法傳入的數(shù)據(jù)計算數(shù)字簽名。

private_key可以是一個對象或一個字符串,如果private_key是一個字符串,那么它被當(dāng)做沒有密碼的密鑰。

private_key:

  • key : 包含PEM編碼私鑰的字符串。
  • passphrase : 一個私鑰密碼的字符串。

返回的數(shù)字簽名編碼由output_format決定,可以是'binary''hex''base64'。如果沒有指定編碼,會返回一個buffer。

注意,在調(diào)用了sign()后,sign對象不能再使用了。

crypto.createVerify(algorithm)

使用給定的算法,創(chuàng)建并返回一個驗證器對象。這個對象是sign對象的鏡像。

Class: Verify

用來驗證數(shù)字簽名的類。

crypto.createVerify返回。

Verify對象是一個可寫流。寫入的數(shù)據(jù)用來驗證提供的數(shù)字簽名。一旦所有的數(shù)據(jù)被寫入,verify方法會返回true如果提供的數(shù)字簽名有效。遺留的update方法也支持。

verifier.update(data)

使用data更新verifier對象。因為它是流式的所以這個方法可以被調(diào)用多次。

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

通過使用objectsignature驗證被簽名的數(shù)據(jù)。object是一個包含了PEM編碼對象的字符串,這個對象可以是RSA公鑰,DSA公鑰或X.509證書。signature是先前計算出來的數(shù)字簽名,signature_format可以是'binary','hex''base64'。如果沒有指定編碼,那么希望收到一個buffer。

返回值是truefalse根據(jù)數(shù)字簽名對于數(shù)據(jù)和公鑰的有效性。

注意,在調(diào)用了verify()后,verifier對象不能再使用了。

crypto.createDiffieHellman(prime_length[, generator])

創(chuàng)建一個迪菲-赫爾曼密鑰交換對象(Diffie-Hellman key exchange object),并且根據(jù)prime_length生成一個質(zhì)數(shù),可以指定一個可選的數(shù)字生成器。如果沒有指定生成器,將使用2。

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

通過給定的質(zhì)數(shù),和可選的生成器,創(chuàng)建一個迪菲-赫爾曼密鑰交換對象(Diffie-Hellman key exchange object)。generator可以是一個數(shù)字,字符串或Buffer。如果沒有指定生成器,將使用2。prime_encodinggenerator_encoding可以是'binary','hex''base64'。如果沒有指定prime_encoding,那么希望prime是一個Buffer。如果沒有指定generator_encoding,那么希望generator是一個Buffer。

Class: DiffieHellman

叫來創(chuàng)建迪菲-赫爾曼密鑰交換的類。

通過crypto.createDiffieHellman返回。

diffieHellman.verifyError

一個包含了所有警告和/或錯誤的位域,作為檢查初始化時的執(zhí)行結(jié)果。以下是這個屬性的合法屬性(被常量模塊定義):

  • DH_CHECK_P_NOT_SAFE_PRIME
  • DH_CHECK_P_NOT_PRIME
  • DH_UNABLE_TO_CHECK_GENERATOR
  • DH_NOT_SUITABLE_GENERATOR

diffieHellman.generateKeys([encoding])

生成一個 私和公 迪菲-赫爾曼 密鑰值,并且返回一個指定編碼的公鑰。這個密鑰可以被轉(zhuǎn)移給第三方。編碼可以是'binary''hex''base64'。如果沒有提供編碼,那么會返回一個buffer

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

使用other_public_key作為第三方密鑰來計算共享秘密(shared secret),并且返回計算結(jié)果。提供的密鑰會以input_encoding來解讀,并且秘密以output_encoding來編碼。編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

如果沒有指定output_encoding,那么會返回一個buffer

diffieHellman.getPrime([encoding])

根據(jù)指定編碼返回一個迪菲-赫爾曼質(zhì)數(shù),編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

diffieHellman.getGenerator([encoding])

根據(jù)指定編碼返回一個迪菲-赫爾曼生成器,編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer

diffieHellman.getPublicKey([encoding])

根據(jù)指定編碼返回一個迪菲-赫爾曼公鑰,編碼可以是'binary''hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

diffieHellman.getPrivateKey([encoding])

根據(jù)指定編碼返回一個迪菲-赫爾曼私鑰,編碼可以是'binary''hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

diffieHellman.setPublicKey(public_key[, encoding])

設(shè)置迪菲-赫爾曼公鑰,密鑰編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么期望接收一個buffer。

diffieHellman.setPrivateKey(private_key[, encoding])

設(shè)置迪菲-赫爾曼私鑰,密鑰編碼可以是'binary''hex''base64'。如果沒有提供編碼,那么期望接收一個buffer。

crypto.getDiffieHellman(group_name)

創(chuàng)建一個預(yù)定義的迪菲-赫爾曼密鑰交換對象。支持的群組有:'modp1', 'modp2', 'modp5' (由RFC 2412定義) 和 'modp14', 'modp15', 'modp16', 'modp17', 'modp18' (由RFC 3526定義)。返回的對象模仿crypto.createDiffieHellman()創(chuàng)建的對象的借口,但是不允許交換密鑰(如通過diffieHellman.setPublicKey())。執(zhí)行這套流程的好處是雙方不需要事先生成或交換組余數(shù),節(jié)省了處理和通信時間。

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

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指定的預(yù)定義橢圓,創(chuàng)建一個橢圓曲線(EC)迪菲-赫爾曼密鑰交換對象。使用getCurves()來獲取可用的橢圓名列表。在最近的發(fā)行版中,openssl ecparam -list_curves命令也會展示可用的橢圓曲線的名字和簡述。

Class: ECDH

用于EC迪菲-赫爾曼密鑰交換的類。

crypto.createECDH返回。

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

生成一個 私/公 EC迪菲-赫爾曼密鑰值,并且返回指定格式和編碼的公鑰。這個密鑰可以被轉(zhuǎn)移給第三方。

format指定點的編碼,可以是'compressed','uncompressed''hybrid'。如果沒有指定,那么點將是'uncompressed'格式。

編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

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

使用other_public_key作為第三方密鑰來計算共享秘密(shared secret),并且返回計算結(jié)果。提供的密鑰會以input_encoding來解讀,并且秘密以output_encoding來編碼。編碼可以是'binary''hex''base64'。如果沒有提供編碼,那么會返回一個buffer

如果沒有指定output_encoding,那么會返回一個buffer。

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

返回指定編碼和格式的EC迪菲-赫爾曼公鑰。

format指定點的編碼,可以是'compressed''uncompressed''hybrid'。如果沒有指定,那么點將是'uncompressed'格式。

編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer。

ECDH.getPrivateKey([encoding])

返回指定編碼的EC迪菲-赫爾曼私鑰,編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么會返回一個buffer

ECDH.setPublicKey(public_key[, encoding])

設(shè)置EC迪菲-赫爾曼公鑰。密鑰編碼可以是'binary','hex''base64'。如果沒有提供編碼,那么期望接收一個buffer。

ECDH.setPrivateKey(private_key[, encoding])

設(shè)置EC迪菲-赫爾曼私鑰。密鑰編碼可以是'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函數(shù)。提供被選擇的HAMC摘要函數(shù)(默認(rèn)為SHA1)來獲取一個請求長度的密碼密鑰,鹽和迭代數(shù)。回調(diào)函數(shù)有兩個參數(shù):(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()獲取支持的摘要函數(shù)列表。

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

同步PBKDF2函數(shù)。返回derivedKey或拋出錯誤。

crypto.randomBytes(size[, callback])

生成有密碼圖譜一般健壯的偽隨機數(shù)據(jù),用處:

// 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
}

注意:如果熵不足,那么它會阻塞。盡管它從不話費超過幾毫秒。唯一可以想到的阻塞是情況是,當(dāng)整個系統(tǒng)的熵還是很低時,在其之后啟動。

Class: Certificate

這個類用來處理已簽名公鑰 & 挑戰(zhàn)(challenges)。最常用的是它的一系列處理<keygen>元素的函數(shù)。http://www.openssl.org/docs/apps/spkac.html。

通過crypto.Certificate返回。

Certificate.verifySpkac(spkac)

返回turefalse,依賴于SPKAC的有效性。

Certificate.exportChallenge(spkac)

導(dǎo)出編碼好的公鑰從指定的SPKAC。

Certificate.exportPublicKey(spkac)

導(dǎo)出編碼好的挑戰(zhàn)(challenge)從指定的SPKAC。

crypto.publicEncrypt(public_key, buffer)

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

public_key可是是一個對象或一個字符串。如果public_key是一個字符串,它會被視作沒有密碼的密鑰并且將使用RSA_PKCS1_OAEP_PADDING。因為RSA公鑰可以用來從你傳遞給這個方法的密鑰來獲取。

public_key:

  • key : 一個包含PEM加密的私鑰字符串
  • passphrase : 一個可選的私鑰密碼字符串
  • padding : 一個可選的填充值,以下值之一:

  • constants.RSA_NO_PADDING
  • constants.RSA_PKCS1_PADDING
  • constants.RSA_PKCS1_OAEP_PADDING

注意:所有的填充值都被常量模塊所定義。

crypto.publicDecrypt(public_key, buffer)

詳情參閱上文。與crypto.publicEncrypt有相同API。默認(rèn)填充值是RSA_PKCS1_PADDING。

crypto.privateDecrypt(private_key, buffer)

使用private_key解密buffer。

private_key可以是一個對象或一個字符串。如果private_key是一個字符串,它會當(dāng)做沒有密碼的密鑰,并且使用RSA_PKCS1_OAEP_PADDING

public_key:

  • key : 一個包含PEM加密的私鑰字符串
  • passphrase : 一個可選的私鑰密碼字符串
  • padding : 一個可選的填充值,以下值之一:

  • constants.RSA_NO_PADDING
  • constants.RSA_PKCS1_PADDING
  • constants.RSA_PKCS1_OAEP_PADDING

注意:所有的填充值都被常量模塊所定義。

crypto.privateEncrypt(private_key, buffer)

詳情參閱上文。與crypto.privateDecrypt有相同API。默認(rèn)填充值是RSA_PKCS1_PADDING

crypto.DEFAULT_ENCODING

默認(rèn)編碼是用于接受字符串或buffer的函數(shù)。默認(rèn)值是'buffer',所以默認(rèn)是使用Buffer對象的。這被用來與舊的以'binary'為默認(rèn)編碼的程序更好地兼容。

注意新的程序仍可能期望使用buffer,所以只將它作為一個臨時措施。

近期的API改變

Crypto模塊在還沒有統(tǒng)一的流API概念,以及沒有Buffer對象來處理二進制數(shù)據(jù)前就加入了Node.js。

因為這樣,它的流類沒有其他io.js類的典型類,而且很多方法默認(rèn)接受和返回二進制字符串而不是Buffer。這些函數(shù)將被改成默認(rèn)接受和返回Buffer

這對于一些但不是所有的使用場景來說是巨大的改變。

例如,如果你現(xiàn)在對Sign類使用默認(rèn)參數(shù),并且傳遞Verify類的結(jié)果,不檢查數(shù)據(jù),那么在以前它將會繼續(xù)工作。在你曾經(jīng)得到二進制字符串的地方,你將會得到一個Buffer。

但是,如果你正在使用那些使用字符串可以,但使用Buffer不能工作的數(shù)據(jù)(如連接它們,存儲進數(shù)據(jù)庫等)?;蛘邔?code>crypto函數(shù)不傳遞編碼參數(shù)來傳遞二進制字符串。那么以后,你需要提供你想要指定的編碼。如果要將默認(rèn)的使用風(fēng)格,轉(zhuǎn)換為舊風(fēng)格的話,將crypto.DEFAULT_ENCODING域設(shè)置為'binary'。注意新的程序仍可能期望接受buffer,所以這僅作為一個臨時措施。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號