新聞中心
穩(wěn)定性: 2 - 不穩(wěn)定; 正在討論未來(lái)版本的 API 改進(jìn),會(huì)盡量減少重大變化。詳見(jiàn)后文。顧名思義,node.js加密模塊允許你使用加密的功能,Node.js加密模塊通過(guò)使用require('crypto')來(lái)訪(fǎng)問(wèn)。

貴港網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
Node.js加密模塊提供了HTTP或HTTPS連接過(guò)程中封裝安全憑證的方法。
Node.js加密模塊還提供了OpenSSL的哈希,hmac、加密(cipher)、解密(decipher)、簽名(sign)和驗(yàn)證(verify)方法的封裝。
crypto.setEngine(engine[, flags])
為某些/所有OpenSSL函數(shù)加載并設(shè)置引擎(根據(jù)參數(shù)flags來(lái)設(shè)置)。
engine可能是id,或者是指向引擎共享庫(kù)的路徑。
flags是可選參數(shù),默認(rèn)值是ENGINE_METHOD_ALL,它可以是以下一個(gè)或多個(gè)參數(shù)的組合(在constants里定義):
ENGINE_METHOD_RSAENGINE_METHOD_DSAENGINE_METHOD_DHENGINE_METHOD_RANDENGINE_METHOD_ECDHENGINE_METHOD_ECDSAENGINE_METHOD_CIPHERSENGINE_METHOD_DIGESTSENGINE_METHOD_STOREENGINE_METHOD_PKEY_METHENGINE_METHOD_PKEY_ASN1_METHENGINE_METHOD_ALLENGINE_METHOD_NONE
crypto.getCiphers()
返回支持的加密算法名數(shù)組。
例如:
var ciphers = crypto.getCiphers();
console.log(ciphers); // ['AES-128-CBC', 'AES-128-CBC-HMAC-SHA1', ...]crypto.getHashes()
返回支持的哈希算法名數(shù)組。
例如:
var hashes = crypto.getHashes();
console.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...]crypto.createCredentials(details)
穩(wěn)定性: 0 - 拋棄。用 [tls.createSecureContext][] 替換根據(jù)參數(shù)details,創(chuàng)建一個(gè)加密憑證對(duì)象。參數(shù)為字典,key包括:
pfx: 字符串或者buffer對(duì)象,表示經(jīng)PFX或PKCS12編碼產(chǎn)生的私鑰、證書(shū)以及CA證書(shū)key: 進(jìn)過(guò) PEM 編碼的私鑰passphrase: 私鑰或pfx的密碼cert: PEM編碼的證書(shū)ca: 字符串或字符串?dāng)?shù)組,PEM編碼的可信任的CA證書(shū)。crl: 字符串或字符串?dāng)?shù)組,PEM編碼的CRLs(證書(shū)吊銷(xiāo)列表Certificate Revocation List)。ciphers: 字符串,使用或者排除的加密算法。參見(jiàn)http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT。
如果沒(méi)有指定'ca',Node.js將會(huì)使用下面列表中的CAhttp://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt。
crypto.createHash(algorithm)
創(chuàng)建并返回一個(gè)哈希對(duì)象,使用指定的算法來(lái)生成哈希摘要。
參數(shù)algorithm取決于平臺(tái)的OpenSSL版本所支持的算法。例如,'sha1'、'md5'、'sha256'、'sha512'等等。在最近的版本中,openssllist-message-digest-algorithms會(huì)顯示所有算法。
例如: 這個(gè)程序會(huì)計(jì)算文件的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);
});類(lèi):Hash
Hase用來(lái)生成數(shù)據(jù)的哈希值。
它是可讀寫(xiě)的流stream。寫(xiě)入的數(shù)據(jù)來(lái)用計(jì)算哈希值。當(dāng)寫(xiě)入流結(jié)束后,使用read()方法來(lái)獲取計(jì)算后的哈希值。也支持舊的update和digest方法。
通過(guò)crypto.createHash返回。
hash.update(data[, input_encoding])
根據(jù)data來(lái)更新哈希內(nèi)容,編碼方式根據(jù)input_encoding來(lái)定,有'utf8'、'ascii'或'binary'。如果沒(méi)有傳入值,默認(rèn)編碼方式是'binary'。如果 data是Buffer,則input_encoding將會(huì)被忽略。
因?yàn)樗橇魇綌?shù)據(jù),所以可以使用不同的數(shù)據(jù)調(diào)用很多次。
hash.digest([encoding])
計(jì)算傳入的數(shù)據(jù)的哈希摘要。
encoding可以是'hex'、'binary'或'base64',如果沒(méi)有指定encoding,將返回buffer。
注意:調(diào)用digest()后不能再用hash對(duì)象。
crypto.createHmac(algorithm, key)
創(chuàng)建并返回一個(gè)hmac對(duì)象,用指定的算法和秘鑰生成hmac圖譜。
它是可讀寫(xiě)的流stream。寫(xiě)入的數(shù)據(jù)來(lái)用計(jì)算hmac。當(dāng)寫(xiě)入流結(jié)束后,使用read()方法來(lái)獲取計(jì)算后的值。也支持舊的update和digest方法。
參數(shù)algorithm取決于平臺(tái)上OpenSSL版本所支持的算法,參見(jiàn)前面的createHash。key是hmac算法中用的key。
類(lèi):Hmac
用來(lái)創(chuàng)建hmac加密圖譜。
通過(guò)crypto.createHmac返回。
hmac.update(data)
根據(jù)data更新hmac對(duì)象。因?yàn)樗橇魇綌?shù)據(jù),所以可以使用新數(shù)據(jù)調(diào)用多次。
hmac.digest([encoding])
計(jì)算傳入數(shù)據(jù)的hmac值。encoding可以是'hex'、'binary'或'base64',如果沒(méi)有指定encoding,將返回buffer。
注意:調(diào)用digest()后不能再用hmac對(duì)象。
crypto.createCipher(algorithm, password)
使用傳入的算法和秘鑰來(lái)生成并返回加密對(duì)象。
algorithm取決于OpenSSL,例如'aes192'等。最近發(fā)布的版本中,openssl list-cipher-algorithms將會(huì)展示可用的加密算法。password用來(lái)派生key 和IV,它必須是一個(gè)'binary'編碼的字符串或者一個(gè)buffer。
它是可讀寫(xiě)的stream流。寫(xiě)入的數(shù)據(jù)來(lái)用計(jì)算hmac。當(dāng)寫(xiě)入流結(jié)束后,使用read()方法來(lái)獲取計(jì)算后的值。也支持老的update和digest方法。
注意,OpenSSL函數(shù)EVP_BytesToKey摘要算法如果是一次迭代(one iteration),無(wú)需鹽值(no salt)的MD5時(shí),createCipher為它派生秘鑰。缺少鹽值使得字典攻擊,相同的密碼總是生成相同的key,低迭代次數(shù)和非加密的哈希算法,使得密碼測(cè)試非常迅速。
OpenSSL推薦使用pbkdf2來(lái)替換EVP_BytesToKey,推薦使用crypto.pbkdf2來(lái)派生key和iv ,推薦使用createCipheriv()來(lái)創(chuàng)建加密流。
crypto.createCipheriv(algorithm, key, iv)
創(chuàng)建并返回一個(gè)加密對(duì)象,用指定的算法,key和iv。
algorithm參數(shù)和createCipher()一致。key在算法中用到。iv是一個(gè)initialization vector.
key和iv必須是'binary'的編碼字符串或buffers.
類(lèi): Cipher
加密數(shù)據(jù)的類(lèi)。.
通過(guò)crypto.createCipher和crypto.createCipheriv返回。
它是可讀寫(xiě)的stream流。寫(xiě)入的數(shù)據(jù)來(lái)用計(jì)算hmac。當(dāng)寫(xiě)入流結(jié)束后,使用read()方法來(lái)獲取計(jì)算后的值。也支持舊的update和digest方法。
cipher.update(data[, input_encoding][, output_encoding])
根據(jù)data來(lái)更新哈希內(nèi)容,編碼方式根據(jù)input_encoding來(lái)定,有'utf8'、'ascii'或者'binary'。如果沒(méi)有傳入值,默認(rèn)編碼方式是'binary'。如果data是Buffer,input_encoding將會(huì)被忽略。
output_encoding指定了輸出的加密數(shù)據(jù)的編碼格式,它可用是'binary'、'base64'或'hex'。如果沒(méi)有提供編碼,將返回buffer。
返回加密后的內(nèi)容,因?yàn)樗橇魇綌?shù)據(jù),所以可以使用不同的數(shù)據(jù)調(diào)用很多次。
cipher.final([output_encoding])
返回加密后的內(nèi)容,編碼方式是由output_encoding指定,可以是'binary'、'base64'或'hex'。如果沒(méi)有傳入值,將返回buffer。
注意:cipher對(duì)象不能在final()方法之后調(diào)用。
cipher.setAutoPadding(auto_padding=true)
你可以禁用輸入數(shù)據(jù)自動(dòng)填充到塊大小的功能。如果auto_padding是false, 那么輸入數(shù)據(jù)的長(zhǎng)度必須是加密器塊大小的整倍數(shù),否則final會(huì)失敗。這對(duì)非標(biāo)準(zhǔn)的填充很有用,例如使用0x0而不是PKCS的填充。這個(gè)函數(shù)必須在cipher.final之前調(diào)用。
cipher.getAuthTag()
加密認(rèn)證模式(目前支持:GCM),這個(gè)方法返回經(jīng)過(guò)計(jì)算的認(rèn)證標(biāo)志Buffer。必須使用final方法完全加密后調(diào)用。
cipher.setAAD(buffer)
加密認(rèn)證模式(目前支持:GCM),這個(gè)方法設(shè)置附加認(rèn)證數(shù)據(jù)( AAD )。
crypto.createDecipher(algorithm, password)
根據(jù)傳入的算法和密鑰,創(chuàng)建并返回一個(gè)解密對(duì)象。這是createCipher()的鏡像。
crypto.createDecipheriv(algorithm, key, iv)
根據(jù)傳入的算法,密鑰和iv,創(chuàng)建并返回一個(gè)解密對(duì)象。這是createCipheriv()的鏡像。
類(lèi):Decipher
解密數(shù)據(jù)類(lèi)。
通過(guò)crypto.createDecipher和crypto.createDecipheriv返回。
解密對(duì)象是可讀寫(xiě)的streams流。用寫(xiě)入的加密數(shù)據(jù)生成可讀的純文本數(shù)據(jù)。也支持老的update和digest方法。
decipher.update(data[, input_encoding][, output_encoding])
使用參數(shù)data更新需要解密的內(nèi)容,其編碼方式是'binary'、'base64'或'hex'。如果沒(méi)有指定編碼方式,則把data當(dāng)成buffer對(duì)象。
如果data是Buffer,則忽略input_encoding參數(shù)。
參數(shù)output_decoding指定返回文本的格式,是'binary'、'ascii'或'utf8'之一。如果沒(méi)有提供編碼格式,則返回buffer。
decipher.final([output_encoding])
返回剩余的解密過(guò)的內(nèi)容,參數(shù)output_encoding是'binary'、'ascii'或'utf8',如果沒(méi)有指定編碼方式,返回buffer。
注意:decipher對(duì)象不能在final()方法之后使用。
decipher.setAutoPadding(auto_padding=true)
如果加密的數(shù)據(jù)是非標(biāo)準(zhǔn)塊,可以禁止其自動(dòng)填充,防止decipher.final檢查并移除。僅在輸入數(shù)據(jù)長(zhǎng)度是加密塊長(zhǎng)度的整數(shù)倍的時(shí)才有效。你必須在 decipher.update前調(diào)用。
decipher.setAuthTag(buffer)
對(duì)于加密認(rèn)證模式(目前支持:GCM),必須用這個(gè)方法來(lái)傳遞接收到的認(rèn)證標(biāo)志。如果沒(méi)有提供標(biāo)志,或者密文被篡改,將會(huì)拋出final標(biāo)志,認(rèn)證失敗,密文會(huì)被拋棄。
decipher.setAAD(buffer)
對(duì)于加密認(rèn)證模式(目前支持:GCM),用這個(gè)方法設(shè)置附加認(rèn)證數(shù)據(jù)( AAD )。
crypto.createSign(algorithm)
根據(jù)傳入的算法創(chuàng)建并返回一個(gè)簽名數(shù)據(jù)。 OpenSSL的最近版本里,openssl list-public-key-algorithms會(huì)列出所有算法,比如'RSA-SHA256'。
類(lèi):Sign
生成數(shù)字簽名的類(lèi)。
通過(guò)crypto.createSign返回。
簽名對(duì)象是可讀寫(xiě)的streams流。可寫(xiě)數(shù)據(jù)用來(lái)生成簽名。當(dāng)所有的數(shù)據(jù)寫(xiě)完,sign簽名方法會(huì)返回簽名。也支持老的update和digest方法。
sign.update(data)
用參數(shù)data來(lái)更新簽名對(duì)象。因?yàn)槭橇魇綌?shù)據(jù),它可以被多次調(diào)用。
sign.sign(private_key[, output_format])
根據(jù)傳送給sign的數(shù)據(jù)來(lái)計(jì)算電子簽名。
private_key可以是一個(gè)對(duì)象或者字符串。如果是字符串,將會(huì)被當(dāng)做沒(méi)有密碼的key。
private_key:
key: 包含 PEM 編碼的私鑰passphrase: 私鑰的密碼
返回值output_format包含數(shù)字簽名, 格式是'binary'、'hex'或'base64'之一。如果沒(méi)有指定encoding,將返回buffer。
注意:sign對(duì)象不能在sign()方法之后調(diào)用。
crypto.createVerify(algorithm)
根據(jù)傳入的算法,創(chuàng)建并返回驗(yàn)證對(duì)象。是簽名對(duì)象(signing object)的鏡像。
類(lèi): Verify
用來(lái)驗(yàn)證簽名的類(lèi)。
通過(guò)crypto.createVerify返回。
是可寫(xiě)streams流??蓪?xiě)數(shù)據(jù)用來(lái)驗(yàn)證簽名。一旦所有數(shù)據(jù)寫(xiě)完后,如簽名正確verify方法會(huì)返回true。
也支持老的update方法。
verifier.update(data)
用參數(shù)data來(lái)更新驗(yàn)證對(duì)象。因?yàn)槭橇魇綌?shù)據(jù),它可以被多次調(diào)用。
verifier.verify(object, signature[, signature_format])
使用object和signature驗(yàn)證簽名數(shù)據(jù)。參數(shù)object是包含了PEM編碼對(duì)象的字符串,它可以是RSA公鑰,DSA公鑰,或X.509證書(shū)。signature是之前計(jì)算出來(lái)的數(shù)字簽名。signature_format可以是'binary'、'hex'或'base64'之一,如果沒(méi)有指定編碼方式 ,則默認(rèn)是buffer對(duì)象。
根據(jù)數(shù)據(jù)和公鑰驗(yàn)證簽名有效性,來(lái)返回true或false。
注意:verifier對(duì)象不能在verify()方法之后調(diào)用。
crypto.createDiffieHellman(prime_length[, generator])
創(chuàng)建一個(gè)Diffie-Hellman密鑰交換(Diffie-Hellman key exchange)對(duì)象,并根據(jù)給定的位長(zhǎng)度生成一個(gè)質(zhì)數(shù)。如果沒(méi)有指定參數(shù)generator,默認(rèn)為2。
crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])
使用傳入的prime和generator創(chuàng)建Diffie-Hellman秘鑰交互對(duì)象。
generator可以是數(shù)字,字符串或Buffer。
如果沒(méi)有指定generator,使用2.
prime_encoding和generator_encoding可以是'binary'、'hex'或'base64'。
如果沒(méi)有指定prime_encoding, 則Buffer為prime。
如果沒(méi)有指定generator_encoding ,則Buffer為generator。
類(lèi):DiffieHellman
創(chuàng)建Diffie-Hellman秘鑰交換的類(lèi)。
通過(guò)crypto.createDiffieHellman返回。
diffieHellman.verifyError
在初始化的時(shí)候,如果有警告或錯(cuò)誤,將會(huì)反應(yīng)到這。它是以下值(定義在constants模塊):
DH_CHECK_P_NOT_SAFE_PRIMEDH_CHECK_P_NOT_PRIMEDH_UNABLE_TO_CHECK_GENERATORDH_NOT_SUITABLE_GENERATOR
diffieHellman.generateKeys([encoding])
生成秘鑰和公鑰,并返回指定格式的公鑰。這個(gè)值必須傳給其他部分。編碼方式:'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式,將返回buffer。
diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])
使用other_public_key作為第三方公鑰來(lái)計(jì)算并返回共享秘密(shared secret)。秘鑰用input_encoding編碼。編碼方式為:'binary'、'hex'或 'base64'。如果沒(méi)有指定編碼方式 ,默認(rèn)為buffer。
如果沒(méi)有指定返回編碼方式,將返回buffer。
diffieHellman.getPrime([encoding])
用參數(shù)encoding指明的編碼方式返回Diffie-Hellman質(zhì)數(shù),編碼方式為: 'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式,將返回buffer。
diffieHellman.getGenerator([encoding])
用參數(shù)encoding指明的編碼方式返回Diffie-Hellman生成器,編碼方式為: 'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式 ,將返回buffer。
diffieHellman.getPublicKey([encoding])
用參數(shù)encoding指明的編碼方式返回Diffie-Hellman公鑰,編碼方式為: 'binary'、'hex', 或'base64'。如果沒(méi)有指定編碼方式 ,將返回buffer。
diffieHellman.getPrivateKey([encoding])
用參數(shù)encoding指明的編碼方式返回Diffie-Hellman私鑰,編碼方式為: 'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式 ,將返回buffer。
diffieHellman.setPublicKey(public_key[, encoding])
設(shè)置Diffie-Hellman的公鑰,編碼方式為: 'binary'、'hex'或'base64',如果沒(méi)有指定編碼方式 ,默認(rèn)為buffer。
diffieHellman.setPrivateKey(private_key[, encoding])
設(shè)置Diffie-Hellman的私鑰,編碼方式為: 'binary'、'hex'或'base64',如果沒(méi)有指定編碼方式 ,默認(rèn)為buffer。
crypto.getDiffieHellman(group_name)
創(chuàng)建一個(gè)預(yù)定義的Diffie-Hellman秘鑰交換對(duì)象。支持的組: 'modp1'、'modp2'、'modp5'(定義于RFC 2412),并且'modp14'、'modp15'、'modp16'、'modp17'、'modp18'(定義于RFC 3526)。返回對(duì)象模仿了上述創(chuàng)建的crypto.createDiffieHellman()對(duì)象,但是不允許修改秘鑰交換(例如,diffieHellman.setPublicKey())。使用這套流程的好處是,雙方不需要生成或交換組組余數(shù),節(jié)省了計(jì)算和通訊時(shí)間。
例如 (獲取一個(gè)共享秘密):
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)
使用傳入的參數(shù)curve_name,創(chuàng)建一個(gè)Elliptic Curve (EC) Diffie-Hellman秘鑰交換對(duì)象。
類(lèi):ECDH
這個(gè)類(lèi)用來(lái)創(chuàng)建EC Diffie-Hellman秘鑰交換。
通過(guò)crypto.createECDH返回。
ECDH.generateKeys([encoding[, format]])
生成EC Diffie-Hellman的秘鑰和公鑰,并返回指定格式和編碼的公鑰,它會(huì)傳遞給第三方。
參數(shù)format是'compressed'、 'uncompressed'或 'hybrid'。如果沒(méi)有指定,將返回'uncompressed'格式.
參數(shù)encoding是'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式,將返回buffer。
ECDH.computeSecret(other_public_key[, input_encoding][, output_encoding])
以other_public_key作為第三方公鑰計(jì)算共享秘密,并返回。秘鑰會(huì)以input_encoding來(lái)解讀。編碼是:'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式,默認(rèn)為buffer。
如果沒(méi)有指定編碼方式,將返回buffer。
ECDH.getPublicKey([encoding[, format]])
用參數(shù)encoding指明的編碼方式返回EC Diffie-Hellman公鑰,編碼方式為: 'compressed'、'uncompressed'或'hybrid'。如果沒(méi)有指定編碼方式 ,將返回'uncompressed'。
編碼是:'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式 ,默認(rèn)為buffer。
ECDH.getPrivateKey([encoding])
用參數(shù)encoding指明的編碼方式返回EC Diffie-Hellman私鑰,編碼是:'binary'、'hex'或'base64'。如果沒(méi)有指定編碼方式 ,默認(rèn)為buffer。
ECDH.setPublicKey(public_key[, encoding])
設(shè)置EC Diffie-Hellman的公鑰,編碼方式為: 'binary'、'hex'或'base64',如果沒(méi)有指定編碼方式,默認(rèn)為buffer。
ECDH.setPrivateKey(private_key[, encoding])
設(shè)置EC Diffie-Hellman的私鑰,編碼方式為: 'binary'、'hex'或'base64',如果沒(méi)有指定編碼方式,默認(rèn)為buffer。
例如 (包含一個(gè)共享秘密):
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提供了一個(gè)偽隨機(jī)函數(shù)HMAC-SHA1,根據(jù)給定密碼的長(zhǎng)度,salt和iterations來(lái)得出一個(gè)密鑰。回調(diào)函數(shù)得到兩個(gè)參數(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或拋出錯(cuò)誤。
crypto.randomBytes(size[, callback])
生成一個(gè)密碼強(qiáng)度隨機(jī)的數(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
}注意:如果沒(méi)有足夠積累的熵來(lái)生成隨機(jī)強(qiáng)度的密碼,將會(huì)拋出錯(cuò)誤,或調(diào)用回調(diào)函數(shù)返回錯(cuò)誤。換句話(huà)說(shuō),沒(méi)有回調(diào)函數(shù)的crypto.randomBytes不會(huì)阻塞,即使耗盡所有的熵。
crypto.pseudoRandomBytes(size[, callback])
生成非密碼學(xué)強(qiáng)度的偽隨機(jī)數(shù)據(jù)。如果數(shù)據(jù)足夠長(zhǎng)會(huì)返回一個(gè)唯一數(shù)據(jù),但是這個(gè)數(shù)可能是可以預(yù)期的。因此,當(dāng)不可預(yù)期很重要的時(shí)候,不要用這個(gè)函數(shù)。例如,在生成加密的秘鑰時(shí)。
用法和crypto.randomBytes相同。
類(lèi): Certificate
這個(gè)類(lèi)和簽過(guò)名的公鑰打交道。最重要的場(chǎng)景是處理元素,http://www.openssl.org/docs/apps/spkac.html。
通過(guò)crypto.Certificate返回.
Certificate.verifySpkac(spkac)
根據(jù)SPKAC返回true或false。
Certificate.exportChallenge(spkac)
根據(jù)提供的SPKAC,返回加密的公鑰。
Certificate.exportPublicKey(spkac)
輸出和SPKAC關(guān)聯(lián)的編碼challenge。
crypto.publicEncrypt(public_key, buffer)
使用public_key加密buffer。目前僅支持RSA。
public_key可以是對(duì)象或字符串。如果public_key是一個(gè)字符串,將會(huì)當(dāng)做沒(méi)有密碼的key,并會(huì)用RSA_PKCS1_OAEP_PADDING。
public_key:
key: 包含有PEM編碼的私鑰。padding: 填充值,如下constants.RSA_NO_PADDINGconstants.RSA_PKCS1_PADDINGconstants.RSA_PKCS1_OAEP_PADDING
注意:所有的填充值定義在constants模塊.
crypto.privateDecrypt(private_key, buffer)
使用private_key來(lái)解密buffer.
private_key:
key: 包含有 PEM 編碼的私鑰passphrase: 私鑰的密碼padding: 填充值,如下:constants.RSA_NO_PADDINGconstants.RSA_PKCS1_PADDINGconstants.RSA_PKCS1_OAEP_PADDING
注意:所有的填充值定義于constants模塊.
crypto.DEFAULT_ENCODING
函數(shù)所用的編碼方式可以是字符串或buffer ,默認(rèn)值是'buffer'。這是為了加密模塊兼容默認(rèn)'binary'為編碼方式的遺留程序。
注意:新程序希望用buffer對(duì)象,所以這是暫時(shí)手段。
Recent API Changes
在統(tǒng)一的流API概念出現(xiàn)前,在引入Buffer對(duì)象來(lái)處理二進(jìn)制數(shù)據(jù)之前,Crypto模塊就已經(jīng)添加到Node。
因此,流相關(guān)的類(lèi)里沒(méi)有其他的Node類(lèi)里的典型方法,并且很多方法接收并返回二級(jí)制編碼的字符串,而不是Buffers。在最近的版本中,這些函數(shù)改成默認(rèn)使用 Buffers。
對(duì)于一些場(chǎng)景來(lái)說(shuō)這是重大變化。
例如,如果你使用默認(rèn)參數(shù)給簽名類(lèi),將結(jié)果返回給認(rèn)證類(lèi),中間沒(méi)有驗(yàn)證數(shù)據(jù),程序會(huì)正常工作。之前你會(huì)得到二進(jìn)制編碼的字符串,并傳遞給驗(yàn)證類(lèi),現(xiàn)在則是 Buffer。
如果你之前使用的字符串?dāng)?shù)據(jù)在Buffers對(duì)象不能正常工作(比如,連接數(shù)據(jù),并存儲(chǔ)在數(shù)據(jù)庫(kù)里 )?;蛘吣銈鬟f了二進(jìn)制字符串給加密函數(shù),但是沒(méi)有指定編碼方式,現(xiàn)在就需要提供編碼參數(shù)。如果想切換回原來(lái)的風(fēng)格,將crypto.DEFAULT_ENCODING設(shè)置為'binary'。注意,新的程序希望是buffers,所以之前的方法只能作為臨時(shí)的辦法。
網(wǎng)站欄目:創(chuàng)新互聯(lián)Node.js教程:Node.js 加密
瀏覽路徑:http://www.5511xx.com/article/coisoci.html


咨詢(xún)
建站咨詢(xún)
