模組crypto
crypto
模組是fibjs
內建的加密演算法模組。它提供了對稱加密、非對稱加密、摘要演算法、密碼學隨機數產生器等功能。在使用之前,需要透過require('crypto')
載入該模組。
在crypto
模組中,有許多物件可以使用,例如:
PKey
:不對稱加密演算法對象X509Cert
:用於操作X.509 證書的對象Cipher
:用於實現對稱加密的對象Digest
:用於實作摘要演算法的對象
在使用加密演算法之前,需要先建立一個金鑰對象,例如以下建立一個AES
金鑰對象的範例:
1
2const crypto = require('crypto');
const key = crypto.randomBytes(16); // generate a 16-byte random key
接下來,使用Cipher
物件來對明文進行加密:
1
2
3
4const c = new crypto.Cipher(crypto.AES, crypto.ECB, key);
const data = 'hello, world';
const encrypted = c.encrypt(data).hex();
console.log(encrypted); // output encrypted data
以上範例中,建立了一個AES
加密的Cipher
對象,使用encrypt
方法對明文進行加密,並傳回加密結果。
除了對稱加密演算法,crypto
模組還可以支援非對稱加密演算法和摘要演算法。例如以下範例是使用PKey
和Digest
物件實作SHA256 加密的程式碼:
1
2
3
4
5
6const privateKey = crypto.loadPKey('private.pem'); // read private key from file
const data = 'hello, world';
const digest = new crypto.Digest(hash.SHA256);
digest.update(data);
const signature = privateKey.sign(digest.digest());
console.log(signature); // output signature
在上述範例中,首先讀取了一個私鑰文件,並準備了輸入資料。然後,創建了一個SHA256 的Digest
對象,使用update
方法把資料加入Hash 計算中。在計算完成後,使用privateKey.sign
方法進行簽名,並輸出簽名結果。
綜上所述,crypto
模組提供了多種加密演算法、摘要演算法以及相關對象,這些功能可以幫助我們實現多方面的安全需求,例如對稱和非對稱加密、數位簽章和加密驗證等。
物件
Cipher
1Cipher crypto.Cipher;
PKey
1PKey crypto.PKey;
ECKey
1ECKey crypto.ECKey;
BlsKey
1BlsKey crypto.BlsKey;
X509Cert
1X509Cert crypto.X509Cert;
X509Crl
1X509Crl crypto.X509Crl;
X509Req
1X509Req crypto.X509Req;
靜態函數
createHash
根據給定的演算法名稱建立一個資訊摘要對象
1static Digest crypto.createHash(String algo);
呼叫參數:
- algo: String, 指定資訊摘要物件的演算法
回傳結果:
- Digest, 傳回資訊摘要對象
createHmac
根據給定的演算法名稱建立hmac 資訊摘要對象
1
2static Digest crypto.createHmac(String algo,
Buffer key);
呼叫參數:
- algo: String, 指定資訊摘要物件的演算法
- key:Buffer, 二進位簽章金鑰
回傳結果:
- Digest, 傳回資訊摘要對象
loadCert
載入一個CRT/PEM/DER 格式的證書,可多次調用
1static X509Cert crypto.loadCert(String filename);
呼叫參數:
- filename: String, 憑證檔名
回傳結果:
- X509Cert, 傳回包含憑證的對象
loadCrl
載入一個PEM/DER 格式的撤銷證書,可多次調用
1static X509Crl crypto.loadCrl(String filename);
呼叫參數:
- filename: String, 撤銷憑證檔名
回傳結果:
- X509Crl, 傳回包含撤銷憑證的對象
loadReq
載入一個PEM/DER 格式的憑證請求,可多次調用
1static X509Req crypto.loadReq(String filename);
呼叫參數:
- filename: String, 憑證請求檔名
回傳結果:
- X509Req, 傳回包含請求憑證的對象
loadPKey
載入一個CRT/PEM/DER 格式的非對稱公鑰或私鑰
1static PKey crypto.loadPKey(String filename);
呼叫參數:
- filename: String, 公鑰或私鑰檔名
回傳結果:
randomBytes
產生指定尺寸的隨機數,使用havege 產生器
1static Buffer crypto.randomBytes(Integer size = 16) async;
呼叫參數:
- size: Integer, 指定產生的隨機數尺寸
回傳結果:
- Buffer, 傳回產生的隨機數
simpleRandomBytes
產生指定尺寸的低強度隨機數,使用快速的演算法
1static Buffer crypto.simpleRandomBytes(Integer size = 16) async;
呼叫參數:
- size: Integer, 指定產生的隨機數尺寸
回傳結果:
- Buffer, 傳回產生的隨機數
pseudoRandomBytes
產生指定尺寸的偽隨機數,使用entropy 產生器
1static Buffer crypto.pseudoRandomBytes(Integer size = 16) async;
呼叫參數:
- size: Integer, 指定產生的隨機數尺寸
回傳結果:
- Buffer, 傳回產生的隨機數
randomFill
使用隨機數填充指定的Buffer,使用havege 產生器
1
2
3static Buffer crypto.randomFill(Buffer buffer,
Integer offset = 0,
Integer size = -1) async;
呼叫參數:
- buffer:Buffer, 指定生成的Buffer
- offset: Integer, 指定起始偏移,預設為 0
- size: Integer, 指定產生的隨機數尺寸,預設為buffer.length - offset
回傳結果:
- Buffer, 傳回產生的隨機數
randomArt
產生給定資料的可視化字元影像
1
2
3static String crypto.randomArt(Buffer data,
String title,
Integer size = 8);
呼叫參數:
- data:Buffer, 指定要展示的數據
- title: String, 指定字元圖像的標題,多位元組字元會導致寬度錯誤
- size: Integer, 字元圖像尺寸
回傳結果:
- String, 傳回生成的可視化字串影像
generateKey
產生一個RSA 私鑰
1static PKey crypto.generateKey(Integer size) async;
呼叫參數:
- size: Integer, 指定RSA 金鑰長度,bit 為單位
回傳結果:
- PKey, 傳回包含生成私鑰的對象
產生一個橢圓曲線私鑰
1static PKey crypto.generateKey(String curve = "secp521r1") async;
呼叫參數:
- curve: String, 指定預置橢圓曲線,預設為'secp256r1'
回傳結果:
- PKey, 傳回包含生成私鑰的對象
curve 可選的曲線包含NIST 曲線和別名如下:
曲線 | 別名 |
---|---|
NIST P-192 | 'NIST P-192', 'p192', 'P-192', 'prime192v1', 'secp192r1' |
NIST P-224 | 'NIST P-224', 'p224', 'P-224', 'prime224v1', 'secp224r1' |
NIST P-256 | 'NIST P-256', 'p256', 'P-256', 'prime256v1', 'secp256r1' |
NIST P-384 | 'NIST P-384', 'p384', 'P-384', 'prime384v1', 'secp384r1' |
NIST P-521 | 'NIST P-521', 'p521', 'P-521', 'prime521v1', 'secp521r1' |
其它所支援的曲線包括: "brainpoolP512r1", "brainpoolP384r1", "secp256k1", "P-256K", "brainpoolP256r1", "sm2p256r1", "SM2", "Ed25519", "sm2p256r1", "SM2", "Ed25519", "sm2p256r1", "SM2", "Ed25519", "Bsm2p2812G112"
pbkdf1
依據pbkdf1 根據明文password 產生要求的二進位鑰匙
1
2
3
4
5static Buffer crypto.pbkdf1(Buffer password,
Buffer salt,
Integer iterations,
Integer size,
Integer algo) async;
呼叫參數:
- password:Buffer, 指定使用的密碼
- salt:Buffer, 指定hmac 使用的salt
- iterations: Integer, 指定迭代次數
- size: Integer, 指定鑰匙尺寸
- algo: Integer, 指定要使用的hash演算法,詳見hash模組
回傳結果:
- Buffer, 傳回產生的二進位鑰匙
依據pbkdf1 根據明文password 產生要求的二進位鑰匙
1
2
3
4
5static Buffer crypto.pbkdf1(Buffer password,
Buffer salt,
Integer iterations,
Integer size,
String algoName) async;
呼叫參數:
- password:Buffer, 指定使用的密碼
- salt:Buffer, 指定hmac 使用的salt
- iterations: Integer, 指定迭代次數
- size: Integer, 指定鑰匙尺寸
- algoName: String, 指定要使用的hash演算法,詳見hash模組
回傳結果:
- Buffer, 傳回產生的二進位鑰匙
pbkdf2
依據rfc2898 根據明文password 產生要求的二進位鑰匙
1
2
3
4
5static Buffer crypto.pbkdf2(Buffer password,
Buffer salt,
Integer iterations,
Integer size,
Integer algo) async;
呼叫參數:
- password:Buffer, 指定使用的密碼
- salt:Buffer, 指定hmac 使用的salt
- iterations: Integer, 指定迭代次數
- size: Integer, 指定鑰匙尺寸
- algo: Integer, 指定要使用的hash演算法,詳見hash模組
回傳結果:
- Buffer, 傳回產生的二進位鑰匙
依據rfc2898 根據明文password 產生要求的二進位鑰匙
1
2
3
4
5static Buffer crypto.pbkdf2(Buffer password,
Buffer salt,
Integer iterations,
Integer size,
String algoName) async;
呼叫參數:
- password:Buffer, 指定使用的密碼
- salt:Buffer, 指定hmac 使用的salt
- iterations: Integer, 指定迭代次數
- size: Integer, 指定鑰匙尺寸
- algoName: String, 指定要使用的hash演算法,詳見hash模組
回傳結果:
- Buffer, 傳回產生的二進位鑰匙
getHashes
取得crypto 模組支援的的hash(摘要) 演算法, 如'md5', 'sha224'
1static Array crypto.getHashes();
回傳結果:
- Array, 返回fibjs 支援的hash演算法數組
常量
AES
指定對稱加密演算法AES,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM,XTS
1const crypto.AES = 1;
DES
指定對稱加密演算法DES,支援64 位元key,分組密碼工作模式支援ECB, CBC
1const crypto.DES = 2;
DES_EDE3
指定對稱加密演算法DES-EDE3,支援192 位元key,分組密碼工作模式支援ECB, CBC
1const crypto.DES_EDE3 = 3;
CAMELLIA
指定對稱加密演算法CAMELLIA,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM
1const crypto.CAMELLIA = 4;
ARIA
指定對稱加密演算法ARIA,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM
1const crypto.ARIA = 5;
CHACHA20
指定對稱加密演算法CHACHA20,支援256 位元key,分組密碼工作模式支援POLY1305
1const crypto.CHACHA20 = 6;
SM4
指定對稱加密演算法SM4, 分組密碼工作模式支援ECB, CBC
1const crypto.SM4 = 7;
ECB
指定分組密碼工作模式支援ECB
1const crypto.ECB = 1;
CBC
指定分組密碼工作模式支援CBC
1const crypto.CBC = 2;
CFB64
指定分組密碼工作模式支援CFB64
1const crypto.CFB64 = 3;
CFB128
指定分組密碼工作模式支援CFB128
1const crypto.CFB128 = 4;
OFB
指定分組密碼工作模式支援OFB
1const crypto.OFB = 5;
CTR
指定分組密碼工作模式支援CTR
1const crypto.CTR = 6;
GCM
指定分組密碼工作模式支援GCM
1const crypto.GCM = 7;
STREAM
指定流密碼模式
1const crypto.STREAM = 8;
CCM
指定分組密碼工作模式支援CCM
1const crypto.CCM = 9;
XTS
指定分組密碼工作模式支援XTS
1const crypto.XTS = 10;
POLY1305
指定分組密碼工作模式支援POLY1305
1const crypto.POLY1305 = 11;
PKCS7
指定填充模式為PKCS7
1const crypto.PKCS7 = 0;
ONE_AND_ZEROS
指定填滿模式為ONE_AND_ZEROS
1const crypto.ONE_AND_ZEROS = 1;
ZEROS_AND_LEN
指定填滿模式為ZEROS_AND_LEN
1const crypto.ZEROS_AND_LEN = 2;
ZEROS
指定填充模式為ZEROS
1const crypto.ZEROS = 3;
NOPADDING
指定填滿模式為NOPADDING
1const crypto.NOPADDING = 4;