使用require('crypto')
來獲取這個模塊。
crypto
模塊提供了一種封裝安全證書的方法,用來作為安全HTTPS網(wǎng)絡(luò)和HTTP鏈接的一部分。
它也提供了一個OpenSSL hash
,hamc
,cipher
,decipher
,sign
和vierify
方法的包裝集合。
加載和設(shè)置 一些/所有 OpenSSL功能引擎(由標(biāo)記選擇)。
引擎可以通過id或 引擎共享庫的路徑 來選擇。
flags
是可選的,并且有一個ENGINE_METHOD_ALL
默認(rèn)值。可以選一個或多個以下的標(biāo)記(在常量模塊中定義)。
返回一個支持的加密算法的名字?jǐn)?shù)組。
例子:
var ciphers = crypto.getCiphers();
console.log(ciphers); // ['aes-128-cbc', 'aes-128-ccm', ...]
返回一個支持的哈希算法的名字?jǐn)?shù)組。
例子:
var hashes = crypto.getHashes();
console.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...]
返回一個支持的橢圓加密算法的名字?jǐn)?shù)組。
例子:
var curves = crypto.getCurves();
console.log(curves); // ['secp256k1', 'secp384r1', ...]
穩(wěn)定度: 0 - 棄用。使用
tls.createSecureContext
代替。
創(chuàng)建一個加密憑證對象,接受一個可選的帶鍵字典details
:
PFX
或PKCS12
加密的私鑰,加密憑證和CA證書的字符串或buffer
。PEM
加密私鑰的字符串。pfx
密碼字符串。PEM
加密憑證的字符串。PEM
加密CA證書的字符串或字符串列表。PEM
加密CRL
的字符串或字符串列表。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
列表。
創(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);
});
這個類用來創(chuàng)建數(shù)據(jù)哈希摘要。
這是一個同時可讀與可寫的流。寫入的數(shù)據(jù)用來計算哈希。一旦當(dāng)流的可寫端終止,使用read()
來獲取計算所得哈希摘要。遺留的update
和digest
方法同樣被支持。
通過crypto.createHash
返回。
使用給定的data
更新哈希內(nèi)容,通過input_encoding
指定的編碼可以是'utf8'
,'ascii'
或'binary'
。如果沒有提供編碼,并且輸入是一個字符串,那么將會指定編碼為'binary'
。如果data
是一個Buffer
那么input_encoding
會被忽略。
它是流式數(shù)據(jù),所以這個方法可以被調(diào)用多次。
計算所有的被傳遞的數(shù)據(jù)的摘要。encoding
可以是'binary'
,'hex'
或'base64'
。如果沒有指定編碼,那么一個buffer
被返回。
注意:當(dāng)調(diào)用了digest()
方法之后,哈希對象不能再被使用了。
創(chuàng)建并返回一個hmac對象,即通過給定的算法和密鑰生成的加密圖譜(cryptographic)。
這是一個既可讀又可寫的流。寫入的數(shù)據(jù)被用來計算hamc。一旦當(dāng)流的可寫端終止,使用read()
方法來獲取計算所得摘要值。遺留的update
和digest
方法同樣被支持。
algorithm
依賴于平臺上的OpenSSL版本所支持的算法。參閱上文createHash
。key
是要使用的hmac密鑰。
用于創(chuàng)建hmac加密圖譜(cryptographic)的類。
通過crypto.createHmac
返回。
只用指定的data
更新hmac內(nèi)容。因為它是流式數(shù)據(jù),所以這個方法可以被調(diào)用多次。
計算所有的被傳遞的數(shù)據(jù)的hmac摘要。encoding
可以是'binary'
,'hex'
或'base64'
。如果沒有指定編碼,那么一個buffer
被返回。
注意:當(dāng)調(diào)用了digest()
方法之后,hmac對象不能再被使用了。
創(chuàng)建和返回一個cipher
對象,指定指定的算法和密碼。
算法依賴于OpenSSL,如果'aes192'
,等等。在最近的發(fā)行版中,openssl list-cipher-algorithms
命令會展示可用的cipher
算法。密碼被用來獲取密鑰和IV,必須是一個'binary'
編碼的字符串或buffer
。
這是一個既可讀又可寫的流。寫入的數(shù)據(jù)被用來計算哈希。一旦當(dāng)流的可寫端終止,使用read()
方法來獲取通過cipher
計算所得的內(nèi)容。遺留的update
和digest
方法同樣被支持。
注意: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。
創(chuàng)建和返回一個cipher
對象,指定指定的算法,密鑰和iv。
algorithm
參數(shù)與createCipher()
相同。key
是被算法使用的源密鑰(raw key)。iv是初始化矢量(initialization vector)。
key
和iv
必須是'binary'
編碼的字符串或buffer
。
創(chuàng)建一個加密數(shù)據(jù)。
由crypto.createCipher
和crypto.createCipheriv
返回。
這是一個既可讀又可寫的流。寫入的文本數(shù)據(jù)被用來在可讀端生產(chǎn)被加密的數(shù)據(jù)。遺留的update
和final
方法同樣被支持。
通過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)用多次。
返回所有的剩余的加密內(nèi)容,output_encoding
可以是'binary'
,'base64'
或'hex'
。如果沒有指定編碼,那么一個buffer
會被返回。
注意:當(dāng)調(diào)用了final()
方法之后,cipher對象不能再被使用了。
你可以禁用自動填充輸入數(shù)據(jù)至塊大小。如果auto_padding
為false
,那么整個輸入數(shù)據(jù)的長度必須cipher
的塊大小的整數(shù)倍,否則會失敗。這對非標(biāo)準(zhǔn)填充非常有用,如使用0x0替代PKCS填充。你必須在cipher.final
之前調(diào)用它。
對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法返回一個從給定數(shù)據(jù)計算所得的代表了認(rèn)證標(biāo)簽的Buffer
。必須在final
方法被調(diào)用后調(diào)用。
對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法設(shè)置被用于額外已認(rèn)證數(shù)據(jù)(AAD)輸入?yún)?shù)的值。
使用給定算法和密鑰,創(chuàng)建并返回一個解密器對象。這是上文createCipher()
的一個鏡像。
使用給定算法,密鑰和iv,創(chuàng)建并返回一個解密器對象。這是上文createCipheriv()
的一個鏡像。
解密數(shù)據(jù)類。
通過crypto.createDecipher
和crypto.createDecipheriv
返回。
這是一個既可讀又可寫的流。寫入的被加密的數(shù)據(jù)被用來在可讀端生產(chǎn)文本數(shù)據(jù)。遺留的update
和final
方法同樣被支持。
通過data
更新decipher
,編碼可以是'binary'
,'base64'
或'hex'
。如果沒有提供編碼,那么希望接受到一個buffer
。如果數(shù)據(jù)是一個Buffer
,那么input_encoding
將被忽略。
output_encoding
指定了解密數(shù)據(jù)的輸出格式,可以是'binary'
,'ascii'
或'utf8'
。如果沒有指定編碼,那么一個buffer
會被返回。
返回所有的剩余的文本數(shù)據(jù),output_encoding
可以是'binary'
,'ascii'
或'utf8'
。如果沒有指定編碼,那么一個buffer
會被返回。
注意:當(dāng)調(diào)用了final()
方法之后,decipher對象不能再被使用了。
如數(shù)據(jù)沒有使用標(biāo)準(zhǔn)塊填充阻止decipher.final
檢查和刪除它來加密,你可以禁用自動填充。那么整個輸入數(shù)據(jù)的長度必須cipher
的塊大小的整數(shù)倍,否則會失敗。你必須在將數(shù)據(jù)導(dǎo)流至decipher.update
前調(diào)用它。
對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法必須被傳遞,用來接受認(rèn)證標(biāo)簽。如果沒有提供標(biāo)簽或密文被干擾,最終會拋出一個錯誤。
對于已認(rèn)證加密模式(當(dāng)前支持:GCM),這個方法設(shè)置被用于額外已認(rèn)證數(shù)據(jù)(AAD)輸入?yún)?shù)的值。
使用指定的算法,創(chuàng)建并返回一個數(shù)字簽名類。在最近的OpenSSL發(fā)行版中,openssl list-public-key-algorithms
會列出所有支持的數(shù)字簽名算法。例如'RSA-SHA256'
。
用于生成數(shù)字簽名的類。
通過crypto.createSign
返回。
Sign
對象是一個可寫流。寫入的數(shù)據(jù)用來生成數(shù)字簽名。一旦所有的數(shù)據(jù)被寫入,sign
方法會返回一個數(shù)字簽名。遺留的update
方法也支持。
使用data
更新sign
對象。因為它是流式的所以這個方法可以被調(diào)用多次。
根據(jù)所有通過update
方法傳入的數(shù)據(jù)計算數(shù)字簽名。
private_key
可以是一個對象或一個字符串,如果private_key
是一個字符串,那么它被當(dāng)做沒有密碼的密鑰。
private_key:
PEM
編碼私鑰的字符串。返回的數(shù)字簽名編碼由output_format
決定,可以是'binary'
,'hex'
或'base64'
。如果沒有指定編碼,會返回一個buffer
。
注意,在調(diào)用了sign()
后,sign
對象不能再使用了。
使用給定的算法,創(chuàng)建并返回一個驗證器對象。這個對象是sign
對象的鏡像。
用來驗證數(shù)字簽名的類。
由crypto.createVerify
返回。
Verify
對象是一個可寫流。寫入的數(shù)據(jù)用來驗證提供的數(shù)字簽名。一旦所有的數(shù)據(jù)被寫入,verify
方法會返回true
如果提供的數(shù)字簽名有效。遺留的update
方法也支持。
使用data
更新verifier
對象。因為它是流式的所以這個方法可以被調(diào)用多次。
通過使用object
和signature
驗證被簽名的數(shù)據(jù)。object
是一個包含了PEM編碼對象的字符串,這個對象可以是RSA公鑰,DSA公鑰或X.509證書。signature
是先前計算出來的數(shù)字簽名,signature_format
可以是'binary'
,'hex'
或'base64'
。如果沒有指定編碼,那么希望收到一個buffer
。
返回值是true
或false
根據(jù)數(shù)字簽名對于數(shù)據(jù)和公鑰的有效性。
注意,在調(diào)用了verify()
后,verifier
對象不能再使用了。
創(chuàng)建一個迪菲-赫爾曼密鑰交換對象(Diffie-Hellman key exchange object),并且根據(jù)prime_length
生成一個質(zhì)數(shù),可以指定一個可選的數(shù)字生成器。如果沒有指定生成器,將使用2
。
通過給定的質(zhì)數(shù),和可選的生成器,創(chuàng)建一個迪菲-赫爾曼密鑰交換對象(Diffie-Hellman key exchange object)。generator
可以是一個數(shù)字,字符串或Buffer
。如果沒有指定生成器,將使用2
。prime_encoding
和generator_encoding
可以是'binary'
,'hex'
或'base64'
。如果沒有指定prime_encoding
,那么希望prime
是一個Buffer
。如果沒有指定generator_encoding
,那么希望generator
是一個Buffer
。
叫來創(chuàng)建迪菲-赫爾曼密鑰交換的類。
通過crypto.createDiffieHellman
返回。
一個包含了所有警告和/或錯誤的位域,作為檢查初始化時的執(zhí)行結(jié)果。以下是這個屬性的合法屬性(被常量模塊定義):
生成一個 私和公 迪菲-赫爾曼 密鑰值,并且返回一個指定編碼的公鑰。這個密鑰可以被轉(zhuǎn)移給第三方。編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
使用other_public_key
作為第三方密鑰來計算共享秘密(shared secret),并且返回計算結(jié)果。提供的密鑰會以input_encoding
來解讀,并且秘密以output_encoding
來編碼。編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
如果沒有指定output_encoding
,那么會返回一個buffer
。
根據(jù)指定編碼返回一個迪菲-赫爾曼質(zhì)數(shù),編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
根據(jù)指定編碼返回一個迪菲-赫爾曼生成器,編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
根據(jù)指定編碼返回一個迪菲-赫爾曼公鑰,編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
根據(jù)指定編碼返回一個迪菲-赫爾曼私鑰,編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
設(shè)置迪菲-赫爾曼公鑰,密鑰編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么期望接收一個buffer
。
設(shè)置迪菲-赫爾曼私鑰,密鑰編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么期望接收一個buffer
。
創(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);
使用由curve_name
指定的預(yù)定義橢圓,創(chuàng)建一個橢圓曲線(EC)迪菲-赫爾曼密鑰交換對象。使用getCurves()
來獲取可用的橢圓名列表。在最近的發(fā)行版中,openssl ecparam -list_curves
命令也會展示可用的橢圓曲線的名字和簡述。
用于EC迪菲-赫爾曼密鑰交換的類。
由crypto.createECDH
返回。
生成一個 私/公 EC迪菲-赫爾曼密鑰值,并且返回指定格式和編碼的公鑰。這個密鑰可以被轉(zhuǎn)移給第三方。
format
指定點的編碼,可以是'compressed'
,'uncompressed'
或'hybrid'
。如果沒有指定,那么點將是'uncompressed'
格式。
編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
使用other_public_key
作為第三方密鑰來計算共享秘密(shared secret),并且返回計算結(jié)果。提供的密鑰會以input_encoding
來解讀,并且秘密以output_encoding
來編碼。編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
如果沒有指定output_encoding
,那么會返回一個buffer
。
返回指定編碼和格式的EC迪菲-赫爾曼公鑰。
format
指定點的編碼,可以是'compressed'
,'uncompressed'
或'hybrid'
。如果沒有指定,那么點將是'uncompressed'
格式。
編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
返回指定編碼的EC迪菲-赫爾曼私鑰,編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么會返回一個buffer
。
設(shè)置EC迪菲-赫爾曼公鑰。密鑰編碼可以是'binary'
,'hex'
或'base64'
。如果沒有提供編碼,那么期望接收一個buffer
。
設(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);
異步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ù)列表。
同步PBKDF2函數(shù)。返回derivedKey
或拋出錯誤。
生成有密碼圖譜一般健壯的偽隨機數(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)的熵還是很低時,在其之后啟動。
這個類用來處理已簽名公鑰 & 挑戰(zhàn)(challenges)。最常用的是它的一系列處理<keygen>
元素的函數(shù)。http://www.openssl.org/docs/apps/spkac.html
。
通過crypto.Certificate
返回。
返回ture
或false
,依賴于SPKAC的有效性。
導(dǎo)出編碼好的公鑰從指定的SPKAC。
導(dǎo)出編碼好的挑戰(zhàn)(challenge)從指定的SPKAC。
使用public_key
加密buffer
。目前只支持RSA。
public_key
可是是一個對象或一個字符串。如果public_key
是一個字符串,它會被視作沒有密碼的密鑰并且將使用RSA_PKCS1_OAEP_PADDING
。因為RSA
公鑰可以用來從你傳遞給這個方法的密鑰來獲取。
public_key:
padding : 一個可選的填充值,以下值之一:
注意:所有的填充值都被常量模塊所定義。
詳情參閱上文。與crypto.publicEncrypt
有相同API。默認(rèn)填充值是RSA_PKCS1_PADDING
。
使用private_key
解密buffer
。
private_key
可以是一個對象或一個字符串。如果private_key
是一個字符串,它會當(dāng)做沒有密碼的密鑰,并且使用RSA_PKCS1_OAEP_PADDING
。
public_key:
padding : 一個可選的填充值,以下值之一:
注意:所有的填充值都被常量模塊所定義。
詳情參閱上文。與crypto.privateDecrypt
有相同API。默認(rèn)填充值是RSA_PKCS1_PADDING
。
默認(rèn)編碼是用于接受字符串或buffer
的函數(shù)。默認(rèn)值是'buffer'
,所以默認(rèn)是使用Buffer
對象的。這被用來與舊的以'binary'
為默認(rèn)編碼的程序更好地兼容。
注意新的程序仍可能期望使用buffer
,所以只將它作為一個臨時措施。
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
,所以這僅作為一個臨時措施。
更多建議: