Module 基礎模組

模組crypto

crypto模組是fibjs內建的加密演算法模組。它提供了對稱加密、非對稱加密、摘要演算法、密碼學隨機數產生器等功能。在使用之前,需要透過require('crypto')載入該模組。

crypto模組中,有許多物件可以使用,例如:

  • PKey:不對稱加密演算法對象
  • X509Cert:用於操作X.509 證書的對象
  • Cipher:用於實現對稱加密的對象
  • Digest:用於實作摘要演算法的對象

在使用加密演算法之前,需要先建立一個金鑰對象,例如以下建立一個AES金鑰對象的範例:

1 2
const crypto = require('crypto'); const key = crypto.randomBytes(16); // generate a 16-byte random key

接下來,使用Cipher物件來對明文進行加密:

1 2 3 4
const 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模組還可以支援非對稱加密演算法和摘要演算法。例如以下範例是使用PKeyDigest物件實作SHA256 加密的程式碼:

1 2 3 4 5 6
const 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

Cipher構造函數,參見Cipher

1
Cipher crypto.Cipher;

PKey

PKey構造函數,參見PKey

1
PKey crypto.PKey;

ECKey

ECKey構造函數,參見ECKey

1
ECKey crypto.ECKey;

BlsKey

BlsKey構造函數,參見BlsKey

1
BlsKey crypto.BlsKey;

X509Cert

X509Cert構造函數,參見X509Cert

1
X509Cert crypto.X509Cert;

X509Crl

X509Crl構造函數,參見X509Crl

1
X509Crl crypto.X509Crl;

X509Req

X509Req構造函數,參見X509Req

1
X509Req crypto.X509Req;

靜態函數

createHash

根據給定的演算法名稱建立一個資訊摘要對象

1
static Digest crypto.createHash(String algo);

呼叫參數:

  • algo: String, 指定資訊摘要物件的演算法

回傳結果:

  • Digest, 傳回資訊摘要對象

createHmac

根據給定的演算法名稱建立hmac 資訊摘要對象

1 2
static Digest crypto.createHmac(String algo, Buffer key);

呼叫參數:

  • algo: String, 指定資訊摘要物件的演算法
  • key:Buffer, 二進位簽章金鑰

回傳結果:

  • Digest, 傳回資訊摘要對象

loadCert

載入一個CRT/PEM/DER 格式的證書,可多次調用

1
static X509Cert crypto.loadCert(String filename);

呼叫參數:

  • filename: String, 憑證檔名

回傳結果:


loadCrl

載入一個PEM/DER 格式的撤銷證書,可多次調用

1
static X509Crl crypto.loadCrl(String filename);

呼叫參數:

  • filename: String, 撤銷憑證檔名

回傳結果:

  • X509Crl, 傳回包含撤銷憑證的對象

loadReq

載入一個PEM/DER 格式的憑證請求,可多次調用

1
static X509Req crypto.loadReq(String filename);

呼叫參數:

  • filename: String, 憑證請求檔名

回傳結果:

  • X509Req, 傳回包含請求憑證的對象

loadPKey

載入一個CRT/PEM/DER 格式的非對稱公鑰或私鑰

1
static PKey crypto.loadPKey(String filename);

呼叫參數:

  • filename: String, 公鑰或私鑰檔名

回傳結果:


randomBytes

產生指定尺寸的隨機數,使用havege 產生器

1
static Buffer crypto.randomBytes(Integer size = 16) async;

呼叫參數:

  • size: Integer, 指定產生的隨機數尺寸

回傳結果:

  • Buffer, 傳回產生的隨機數

simpleRandomBytes

產生指定尺寸的低強度隨機數,使用快速的演算法

1
static Buffer crypto.simpleRandomBytes(Integer size = 16) async;

呼叫參數:

  • size: Integer, 指定產生的隨機數尺寸

回傳結果:

  • Buffer, 傳回產生的隨機數

pseudoRandomBytes

產生指定尺寸的偽隨機數,使用entropy 產生器

1
static Buffer crypto.pseudoRandomBytes(Integer size = 16) async;

呼叫參數:

  • size: Integer, 指定產生的隨機數尺寸

回傳結果:

  • Buffer, 傳回產生的隨機數

randomFill

使用隨機數填充指定的Buffer,使用havege 產生器

1 2 3
static 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 3
static String crypto.randomArt(Buffer data, String title, Integer size = 8);

呼叫參數:

  • data:Buffer, 指定要展示的數據
  • title: String, 指定字元圖像的標題,多位元組字元會導致寬度錯誤
  • size: Integer, 字元圖像尺寸

回傳結果:

  • String, 傳回生成的可視化字串影像

generateKey

產生一個RSA 私鑰

1
static PKey crypto.generateKey(Integer size) async;

呼叫參數:

  • size: Integer, 指定RSA 金鑰長度,bit 為單位

回傳結果:

  • PKey, 傳回包含生成私鑰的對象

產生一個橢圓曲線私鑰

1
static 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 5
static 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 5
static 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 5
static 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 5
static 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'

1
static Array crypto.getHashes();

回傳結果:

  • Array, 返回fibjs 支援的hash演算法數組

常量

AES

指定對稱加密演算法AES,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM,XTS

1
const crypto.AES = 1;

DES

指定對稱加密演算法DES,支援64 位元key,分組密碼工作模式支援ECB, CBC

1
const crypto.DES = 2;

DES_EDE3

指定對稱加密演算法DES-EDE3,支援192 位元key,分組密碼工作模式支援ECB, CBC

1
const crypto.DES_EDE3 = 3;

CAMELLIA

指定對稱加密演算法CAMELLIA,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM

1
const crypto.CAMELLIA = 4;

ARIA

指定對稱加密演算法ARIA,支援128, 192, 256 位元key,分組密碼工作模式支援ECB, CBC, CFB128, CTR, GCM,CCM

1
const crypto.ARIA = 5;

CHACHA20

指定對稱加密演算法CHACHA20,支援256 位元key,分組密碼工作模式支援POLY1305

1
const crypto.CHACHA20 = 6;

SM4

指定對稱加密演算法SM4, 分組密碼工作模式支援ECB, CBC

1
const crypto.SM4 = 7;

ECB

指定分組密碼工作模式支援ECB

1
const crypto.ECB = 1;

CBC

指定分組密碼工作模式支援CBC

1
const crypto.CBC = 2;

CFB64

指定分組密碼工作模式支援CFB64

1
const crypto.CFB64 = 3;

CFB128

指定分組密碼工作模式支援CFB128

1
const crypto.CFB128 = 4;

OFB

指定分組密碼工作模式支援OFB

1
const crypto.OFB = 5;

CTR

指定分組密碼工作模式支援CTR

1
const crypto.CTR = 6;

GCM

指定分組密碼工作模式支援GCM

1
const crypto.GCM = 7;

STREAM

指定流密碼模式

1
const crypto.STREAM = 8;

CCM

指定分組密碼工作模式支援CCM

1
const crypto.CCM = 9;

XTS

指定分組密碼工作模式支援XTS

1
const crypto.XTS = 10;

POLY1305

指定分組密碼工作模式支援POLY1305

1
const crypto.POLY1305 = 11;

PKCS7

指定填充模式為PKCS7

1
const crypto.PKCS7 = 0;

ONE_AND_ZEROS

指定填滿模式為ONE_AND_ZEROS

1
const crypto.ONE_AND_ZEROS = 1;

ZEROS_AND_LEN

指定填滿模式為ZEROS_AND_LEN

1
const crypto.ZEROS_AND_LEN = 2;

ZEROS

指定填充模式為ZEROS

1
const crypto.ZEROS = 3;

NOPADDING

指定填滿模式為NOPADDING

1
const crypto.NOPADDING = 4;