Crypto#

安定性: 2 - Stable

ソースコード: lib/crypto.js

node:crypto モジュールは、OpenSSL のハッシュ、HMAC、暗号、復号、署名、および検証関数の一連のラッパーを含む暗号化機能を提供します。

const { createHmac } = await import('node:crypto');

const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
               .update('I love cupcakes')
               .digest('hex');
console.log(hash);
// Prints:
//   c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658econst { createHmac } = require('node:crypto');

const secret = 'abcdefg';
const hash = createHmac('sha256', secret)
               .update('I love cupcakes')
               .digest('hex');
console.log(hash);
// Prints:
//   c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e

暗号サポートが利用できないかどうかの判断#

node:crypto モジュールのサポートを含めずに Node.js をビルドすることが可能です。そのような場合、crypto から import しようとするか、require('node:crypto') を呼び出すと、エラーがスローされます。

CommonJSを使用している場合、スローされたエラーはtry/catchを使ってキャッチできます。

let crypto;
try {
  crypto = require('node:crypto');
} catch (err) {
  console.error('crypto support is disabled!');
} 

レキシカルなESMのimportキーワードを使用する場合、モジュールをロードしようとするに(例えば、プリロードモジュールを使用して)process.on('uncaughtException')のハンドラーが登録されている場合にのみエラーをキャッチできます。

ESMを使用している場合、暗号化サポートが有効になっていないNode.jsのビルドでコードが実行される可能性があるなら、レキシカルなimportキーワードの代わりにimport()関数の使用を検討してください。

let crypto;
try {
  crypto = await import('node:crypto');
} catch (err) {
  console.error('crypto support is disabled!');
} 

非対称鍵の種類#

KeyObject API で認識される非対称鍵の種類を次の表に示します。

鍵の種類説明OID
'dh'Diffie-Hellman1.2.840.113549.1.3.1
'dsa'DSA1.2.840.10040.4.1
'ec'楕円曲線1.2.840.10045.2.1
'ed25519'Ed255191.3.101.112
'ed448'Ed4481.3.101.113
'ml-dsa-44'1ML-DSA-442.16.840.1.101.3.4.3.17
'ml-dsa-65'1ML-DSA-652.16.840.1.101.3.4.3.18
'ml-dsa-87'1ML-DSA-872.16.840.1.101.3.4.3.19
'ml-kem-512'1ML-KEM-5122.16.840.1.101.3.4.4.1
'ml-kem-768'1ML-KEM-7682.16.840.1.101.3.4.4.2
'ml-kem-1024'1ML-KEM-10242.16.840.1.101.3.4.4.3
'rsa-pss'RSA PSS1.2.840.113549.1.1.10
'rsa'RSA1.2.840.113549.1.1.1
'slh-dsa-sha2-128f'1SLH-DSA-SHA2-128f2.16.840.1.101.3.4.3.21
'slh-dsa-sha2-128s'1SLH-DSA-SHA2-128s2.16.840.1.101.3.4.3.22
'slh-dsa-sha2-192f'1SLH-DSA-SHA2-192f2.16.840.1.101.3.4.3.23
'slh-dsa-sha2-192s'1SLH-DSA-SHA2-192s2.16.840.1.101.3.4.3.24
'slh-dsa-sha2-256f'1SLH-DSA-SHA2-256f2.16.840.1.101.3.4.3.25
'slh-dsa-sha2-256s'1SLH-DSA-SHA2-256s2.16.840.1.101.3.4.3.26
'slh-dsa-shake-128f'1SLH-DSA-SHAKE-128f2.16.840.1.101.3.4.3.27
'slh-dsa-shake-128s'1SLH-DSA-SHAKE-128s2.16.840.1.101.3.4.3.28
'slh-dsa-shake-192f'1SLH-DSA-SHAKE-192f2.16.840.1.101.3.4.3.29
'slh-dsa-shake-192s'1SLH-DSA-SHAKE-192s2.16.840.1.101.3.4.3.30
'slh-dsa-shake-256f'1SLH-DSA-SHAKE-256f2.16.840.1.101.3.4.3.31
'slh-dsa-shake-256s'1SLH-DSA-SHAKE-256s2.16.840.1.101.3.4.3.32
'x25519'X255191.3.101.110
'x448'X4481.3.101.111

クラス: Certificate#

SPKAC は、もともと Netscape によって実装された証明書署名要求メカニズムであり、HTML5 の keygen 要素の一部として正式に指定されました。

<keygen>HTML 5.2 以降非推奨であり、新しいプロジェクトではこの要素をもう使用すべきではありません。

node:crypto モジュールは、SPKAC データを扱うための Certificate クラスを提供します。最も一般的な使用法は、HTML5 の <keygen> 要素によって生成された出力を処理することです。Node.js は内部で OpenSSL の SPKAC 実装 を使用しています。

静的メソッド: Certificate.exportChallenge(spkac[, encoding])#

const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 stringconst { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const challenge = Certificate.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 string

静的メソッド: Certificate.exportPublicKey(spkac[, encoding])#

const { Certificate } = await import('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>const { Certificate } = require('node:crypto');
const spkac = getSpkacSomehow();
const publicKey = Certificate.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>

静的メソッド: Certificate.verifySpkac(spkac[, encoding])#

import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');

const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Prints: true or falseconst { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');

const spkac = getSpkacSomehow();
console.log(Certificate.verifySpkac(Buffer.from(spkac)));
// Prints: true or false

レガシー API#

安定性: 0 - 非推奨

レガシーインターフェースとして、以下の例のように crypto.Certificate クラスの新しいインスタンスを作成することが可能です。

new crypto.Certificate()#

Certificate クラスのインスタンスは、new キーワードを使用するか、crypto.Certificate() を関数として呼び出すことで作成できます。

const { Certificate } = await import('node:crypto');

const cert1 = new Certificate();
const cert2 = Certificate();const { Certificate } = require('node:crypto');

const cert1 = new Certificate();
const cert2 = Certificate();
certificate.exportChallenge(spkac[, encoding])#
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 stringconst { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
// Prints: the challenge as a UTF8 string
certificate.exportPublicKey(spkac[, encoding])#
const { Certificate } = await import('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>const { Certificate } = require('node:crypto');
const cert = Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
certificate.verifySpkac(spkac[, encoding])#
import { Buffer } from 'node:buffer';
const { Certificate } = await import('node:crypto');

const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or falseconst { Buffer } = require('node:buffer');
const { Certificate } = require('node:crypto');

const cert = Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or false

クラス: Cipheriv#

Cipheriv クラスのインスタンスは、データを暗号化するために使用されます。このクラスは、次の2つの方法のいずれかで使用できます。

  • 読み込み可能かつ書き込み可能な ストリーム として。平文の暗号化されていないデータが書き込まれ、読み込み側で暗号化されたデータが生成されます。または、
  • cipher.update()cipher.final() メソッドを使用して暗号化データを生成します。

crypto.createCipheriv() メソッドは、Cipheriv インスタンスを作成するために使用されます。Cipheriv オブジェクトは、new キーワードで直接作成するべきではありません。

例: ストリームとして Cipheriv オブジェクトを使用する

const {
  scrypt,
  randomFill,
  createCipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    // Once we have the key and iv, we can create and use the cipher...
    const cipher = createCipheriv(algorithm, key, iv);

    let encrypted = '';
    cipher.setEncoding('hex');

    cipher.on('data', (chunk) => encrypted += chunk);
    cipher.on('end', () => console.log(encrypted));

    cipher.write('some clear text data');
    cipher.end();
  });
});const {
  scrypt,
  randomFill,
  createCipheriv,
} = require('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    // Once we have the key and iv, we can create and use the cipher...
    const cipher = createCipheriv(algorithm, key, iv);

    let encrypted = '';
    cipher.setEncoding('hex');

    cipher.on('data', (chunk) => encrypted += chunk);
    cipher.on('end', () => console.log(encrypted));

    cipher.write('some clear text data');
    cipher.end();
  });
});

例: Cipheriv とパイプされたストリームを使用する

import {
  createReadStream,
  createWriteStream,
} from 'node:fs';

import {
  pipeline,
} from 'node:stream';

const {
  scrypt,
  randomFill,
  createCipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    const cipher = createCipheriv(algorithm, key, iv);

    const input = createReadStream('test.js');
    const output = createWriteStream('test.enc');

    pipeline(input, cipher, output, (err) => {
      if (err) throw err;
    });
  });
});const {
  createReadStream,
  createWriteStream,
} = require('node:fs');

const {
  pipeline,
} = require('node:stream');

const {
  scrypt,
  randomFill,
  createCipheriv,
} = require('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    const cipher = createCipheriv(algorithm, key, iv);

    const input = createReadStream('test.js');
    const output = createWriteStream('test.enc');

    pipeline(input, cipher, output, (err) => {
      if (err) throw err;
    });
  });
});

例: cipher.update()cipher.final() メソッドを使用する

const {
  scrypt,
  randomFill,
  createCipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    const cipher = createCipheriv(algorithm, key, iv);

    let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
    encrypted += cipher.final('hex');
    console.log(encrypted);
  });
});const {
  scrypt,
  randomFill,
  createCipheriv,
} = require('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';

// First, we'll generate the key. The key length is dependent on the algorithm.
// In this case for aes192, it is 24 bytes (192 bits).
scrypt(password, 'salt', 24, (err, key) => {
  if (err) throw err;
  // Then, we'll generate a random initialization vector
  randomFill(new Uint8Array(16), (err, iv) => {
    if (err) throw err;

    const cipher = createCipheriv(algorithm, key, iv);

    let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
    encrypted += cipher.final('hex');
    console.log(encrypted);
  });
});

cipher.final([outputEncoding])#

  • outputEncoding <string> 戻り値のエンコーディング
  • 戻り値: <Buffer> | <string> 残りの暗号化されたコンテンツ。outputEncoding が指定されている場合、文字列が返されます。outputEncoding が指定されていない場合、Buffer が返されます。

cipher.final() メソッドが一度呼び出されると、Cipheriv オブジェクトはデータを暗号化するために使用できなくなります。cipher.final() を複数回呼び出そうとすると、エラーがスローされます。

cipher.getAuthTag()#

  • 戻り値: <Buffer> 認証付き暗号化モード (現在サポートされているのは GCMCCMOCB、および chacha20-poly1305) を使用する場合、cipher.getAuthTag() メソッドは、与えられたデータから計算された認証タグを含む Buffer を返します。

cipher.getAuthTag() メソッドは、cipher.final() メソッドを使用して暗号化が完了した後にのみ呼び出すべきです。

cipher インスタンス作成時に authTagLength オプションが設定されていた場合、この関数は正確に authTagLength バイトを返します。

cipher.setAAD(buffer[, options])#

認証付き暗号化モード (現在サポートされているのは GCMCCMOCB、および chacha20-poly1305) を使用する場合、cipher.setAAD() メソッドは、追加認証データ (AAD) 入力パラメータに使用される値を設定します。

plaintextLength オプションは GCMOCB ではオプションです。CCM を使用する場合、plaintextLength オプションを指定する必要があり、その値は平文の長さ(バイト単位)と一致する必要があります。CCM モードを参照してください。

cipher.setAAD() メソッドは cipher.update() の前に呼び出す必要があります。

cipher.setAutoPadding([autoPadding])#

  • autoPadding <boolean> デフォルト: true
  • 戻り値: <Cipheriv> メソッドチェーンのために同じ Cipheriv インスタンス。

ブロック暗号アルゴリズムを使用する場合、Cipheriv クラスは自動的に入力データに適切なブロックサイズまでのパディングを追加します。デフォルトのパディングを無効にするには、cipher.setAutoPadding(false) を呼び出します。

autoPaddingfalse の場合、入力データ全体の長さは暗号のブロックサイズの倍数でなければならず、そうでなければ cipher.final() はエラーをスローします。自動パディングの無効化は、例えば PKCS パディングの代わりに 0x0 を使用するなど、非標準のパディングに役立ちます。

cipher.setAutoPadding() メソッドは cipher.final() の前に呼び出す必要があります。

cipher.update(data[, inputEncoding][, outputEncoding])#

data で暗号を更新します。inputEncoding 引数が指定されている場合、data 引数は指定されたエンコーディングを使用した文字列です。inputEncoding 引数が指定されていない場合、dataBufferTypedArray、または DataView である必要があります。dataBufferTypedArray、または DataView の場合、inputEncoding は無視されます。

outputEncoding は、暗号化されたデータの出力形式を指定します。outputEncoding が指定されている場合、指定されたエンコーディングを使用した文字列が返されます。outputEncoding が指定されていない場合、Buffer が返されます。

cipher.update() メソッドは、cipher.final() が呼び出されるまで、新しいデータで複数回呼び出すことができます。cipher.final() の後に cipher.update() を呼び出すと、エラーがスローされます。

クラス: Decipheriv#

Decipheriv クラスのインスタンスは、データを復号するために使用されます。このクラスは、次の2つの方法のいずれかで使用できます。

  • 読み込み可能かつ書き込み可能な ストリーム として。平文の暗号化されたデータが書き込まれ、読み込み側で暗号化されていないデータが生成されます。または、
  • decipher.update()decipher.final() メソッドを使用して、暗号化されていないデータを生成します。

crypto.createDecipheriv() メソッドは、Decipheriv インスタンスを作成するために使用されます。Decipheriv オブジェクトは、new キーワードで直接作成するべきではありません。

例: ストリームとして Decipheriv オブジェクトを使用する

import { Buffer } from 'node:buffer';
const {
  scryptSync,
  createDecipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

let decrypted = '';
decipher.on('readable', () => {
  let chunk;
  while (null !== (chunk = decipher.read())) {
    decrypted += chunk.toString('utf8');
  }
});
decipher.on('end', () => {
  console.log(decrypted);
  // Prints: some clear text data
});

// Encrypted with same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();const {
  scryptSync,
  createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Key length is dependent on the algorithm. In this case for aes192, it is
// 24 bytes (192 bits).
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

let decrypted = '';
decipher.on('readable', () => {
  let chunk;
  while (null !== (chunk = decipher.read())) {
    decrypted += chunk.toString('utf8');
  }
});
decipher.on('end', () => {
  console.log(decrypted);
  // Prints: some clear text data
});

// Encrypted with same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decipher.write(encrypted, 'hex');
decipher.end();

例: Decipheriv とパイプされたストリームを使用する

import {
  createReadStream,
  createWriteStream,
} from 'node:fs';
import { Buffer } from 'node:buffer';
const {
  scryptSync,
  createDecipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

const input = createReadStream('test.enc');
const output = createWriteStream('test.js');

input.pipe(decipher).pipe(output);const {
  createReadStream,
  createWriteStream,
} = require('node:fs');
const {
  scryptSync,
  createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

const input = createReadStream('test.enc');
const output = createWriteStream('test.js');

input.pipe(decipher).pipe(output);

例: decipher.update()decipher.final() メソッドを使用する

import { Buffer } from 'node:buffer';
const {
  scryptSync,
  createDecipheriv,
} = await import('node:crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

// Encrypted using same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text dataconst {
  scryptSync,
  createDecipheriv,
} = require('node:crypto');
const { Buffer } = require('node:buffer');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = createDecipheriv(algorithm, key, iv);

// Encrypted using same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data

decipher.final([outputEncoding])#

  • outputEncoding <string> 戻り値のエンコーディング
  • 戻り値: <Buffer> | <string> 残りの復号されたコンテンツ。outputEncoding が指定されている場合、文字列が返されます。outputEncoding が指定されていない場合、Buffer が返されます。

decipher.final() メソッドが一度呼び出されると、Decipheriv オブジェクトはデータを復号するために使用できなくなります。decipher.final() を複数回呼び出そうとすると、エラーがスローされます。

decipher.setAAD(buffer[, options])#

認証付き暗号化モード (現在サポートされているのは GCMCCMOCB、および chacha20-poly1305) を使用する場合、decipher.setAAD() メソッドは、追加認証データ (AAD) 入力パラメータに使用される値を設定します。

options 引数は GCM ではオプションです。CCM を使用する場合、plaintextLength オプションを指定する必要があり、その値は暗号文の長さ(バイト単位)と一致する必要があります。CCM モードを参照してください。

decipher.setAAD() メソッドは decipher.update() の前に呼び出す必要があります。

buffer として文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点を考慮してください。

decipher.setAuthTag(buffer[, encoding])#

認証付き暗号化モード (現在サポートされているのは GCMCCMOCB、および chacha20-poly1305) を使用する場合、decipher.setAuthTag() メソッドは、受信した認証タグを渡すために使用されます。タグが提供されない場合、または暗号文が改ざんされている場合、decipher.final() は、認証の失敗により暗号文を破棄すべきであることを示してスローします。NIST SP 800-38D に従ってタグ長が無効であるか、authTagLength オプションの値と一致しない場合、decipher.setAuthTag() はエラーをスローします。

decipher.setAuthTag() メソッドは、CCM モードの場合は decipher.update() の前、GCMOCB モードおよび chacha20-poly1305 の場合は decipher.final() の前に呼び出す必要があります。decipher.setAuthTag() は一度しか呼び出せません。

認証タグとして文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点を考慮してください。

decipher.setAutoPadding([autoPadding])#

  • autoPadding <boolean> デフォルト: true
  • 戻り値: <Decipheriv> メソッドチェーンのために同じ Decipher。

データが標準的なブロックパディングなしで暗号化されている場合、decipher.setAutoPadding(false) を呼び出すと、decipher.final() がパディングのチェックと削除を行わないように自動パディングを無効にします。

自動パディングをオフにすることは、入力データの長さが暗号のブロックサイズの倍数である場合にのみ機能します。

decipher.setAutoPadding() メソッドは decipher.final() の前に呼び出す必要があります。

decipher.update(data[, inputEncoding][, outputEncoding])#

data で復号器を更新します。inputEncoding 引数が指定されている場合、data 引数は指定されたエンコーディングを使用した文字列です。inputEncoding 引数が指定されていない場合、dataBuffer である必要があります。dataBuffer の場合、inputEncoding は無視されます。

outputEncoding は、暗号化されたデータの出力形式を指定します。outputEncoding が指定されている場合、指定されたエンコーディングを使用した文字列が返されます。outputEncoding が指定されていない場合、Buffer が返されます。

decipher.update() メソッドは、decipher.final() が呼び出されるまで、新しいデータで複数回呼び出すことができます。decipher.final() の後に decipher.update() を呼び出すと、エラーがスローされます。

基になる暗号が認証を実装している場合でも、この関数から返される平文の真正性と完全性は、現時点では不確実である可能性があります。認証付き暗号化アルゴリズムの場合、真正性は通常、アプリケーションが decipher.final() を呼び出したときにのみ確立されます。

クラス: DiffieHellman#

DiffieHellman クラスは、Diffie-Hellman 鍵交換を作成するためのユーティリティです。

DiffieHellman クラスのインスタンスは、crypto.createDiffieHellman() 関数を使用して作成できます。

import assert from 'node:assert';

const {
  createDiffieHellman,
} = await import('node:crypto');

// Generate Alice's keys...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();

// Generate Bob's keys...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));const assert = require('node:assert');

const {
  createDiffieHellman,
} = require('node:crypto');

// Generate Alice's keys...
const alice = createDiffieHellman(2048);
const aliceKey = alice.generateKeys();

// Generate Bob's keys...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));

diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])#

otherPublicKey を相手方の公開鍵として使用して共有秘密を計算し、計算された共有秘密を返します。指定された鍵は指定された inputEncoding を使用して解釈され、秘密は指定された outputEncoding を使用してエンコードされます。inputEncoding が指定されていない場合、otherPublicKeyBufferTypedArray、または DataView であると期待されます。

outputEncoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

diffieHellman.generateKeys([encoding])#

まだ生成または計算されていない場合、秘密鍵と公開鍵の Diffie-Hellman 鍵値を生成し、公開鍵を指定された encoding で返します。この鍵は相手方に転送されるべきです。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

この関数は DH_generate_key() の薄いラッパーです。特に、秘密鍵が一度生成または設定されると、この関数を呼び出しても公開鍵は更新されますが、新しい秘密鍵は生成されません。

diffieHellman.getGenerator([encoding])#

Diffie-Hellman 生成元を指定された encoding で返します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

diffieHellman.getPrime([encoding])#

Diffie-Hellman 素数を指定された encoding で返します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

diffieHellman.getPrivateKey([encoding])#

Diffie-Hellman 秘密鍵を指定された encoding で返します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

diffieHellman.getPublicKey([encoding])#

Diffie-Hellman 公開鍵を指定された encoding で返します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

diffieHellman.setPrivateKey(privateKey[, encoding])#

Diffie-Hellman 秘密鍵を設定します。encoding 引数が指定されている場合、privateKey は文字列であると期待されます。encoding が指定されていない場合、privateKeyBufferTypedArray、または DataView であると期待されます。

この関数は、関連する公開鍵を自動的に計算しません。diffieHellman.setPublicKey() または diffieHellman.generateKeys() を使用して、手動で公開鍵を提供するか、自動的に導出することができます。

diffieHellman.setPublicKey(publicKey[, encoding])#

Diffie-Hellman 公開鍵を設定します。encoding 引数が指定されている場合、publicKey は文字列であると期待されます。encoding が指定されていない場合、publicKeyBufferTypedArray、または DataView であると期待されます。

diffieHellman.verifyError#

DiffieHellman オブジェクトの初期化中に行われたチェックから生じる警告および/またはエラーを含むビットフィールド。

このプロパティには、次の値が有効です (node:constants モジュールで定義されています)。

  • DH_CHECK_P_NOT_SAFE_PRIME
  • DH_CHECK_P_NOT_PRIME
  • DH_UNABLE_TO_CHECK_GENERATOR
  • DH_NOT_SUITABLE_GENERATOR

クラス: DiffieHellmanGroup#

DiffieHellmanGroup クラスは、よく知られた modp グループを引数として取ります。DiffieHellman と同じように機能しますが、作成後にキーを変更することはできません。つまり、setPublicKey()setPrivateKey() メソッドは実装されていません。

const { createDiffieHellmanGroup } = await import('node:crypto');
const dh = createDiffieHellmanGroup('modp16');const { createDiffieHellmanGroup } = require('node:crypto');
const dh = createDiffieHellmanGroup('modp16');

以下のグループがサポートされています。

  • 'modp14' (2048 ビット, RFC 3526 Section 3)
  • 'modp15' (3072 ビット, RFC 3526 Section 4)
  • 'modp16' (4096 ビット, RFC 3526 Section 5)
  • 'modp17' (6144 ビット, RFC 3526 Section 6)
  • 'modp18' (8192 ビット, RFC 3526 Section 7)

以下のグループはまだサポートされていますが、非推奨です(注意点を参照)。

  • 'modp1' (768 ビット, RFC 2409 Section 6.1)
  • 'modp2' (1024 ビット, RFC 2409 Section 6.2)
  • 'modp5' (1536 ビット, RFC 3526 Section 2)

これらの非推奨グループは、Node.js の将来のバージョンで削除される可能性があります。

クラス: ECDH#

ECDH クラスは、楕円曲線 Diffie-Hellman (ECDH) 鍵交換を作成するためのユーティリティです。

ECDH クラスのインスタンスは、crypto.createECDH() 関数を使用して作成できます。

import assert from 'node:assert';

const {
  createECDH,
} = await import('node:crypto');

// Generate Alice's keys...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();

// Generate Bob's keys...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// OKconst assert = require('node:assert');

const {
  createECDH,
} = require('node:crypto');

// Generate Alice's keys...
const alice = createECDH('secp521r1');
const aliceKey = alice.generateKeys();

// Generate Bob's keys...
const bob = createECDH('secp521r1');
const bobKey = bob.generateKeys();

// Exchange and generate the secret...
const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey);

assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'));
// OK

静的メソッド: ECDH.convertKey(key, curve[, inputEncoding[, outputEncoding[, format]]])#

keycurve で指定された EC Diffie-Hellman 公開鍵を、format で指定された形式に変換します。format 引数は点のエンコーディングを指定し、'compressed''uncompressed'、または 'hybrid' にすることができます。指定された鍵は指定された inputEncoding を使用して解釈され、返される鍵は指定された outputEncoding を使用してエンコードされます。

crypto.getCurves() を使用して、利用可能な曲線名のリストを取得します。最近の OpenSSL リリースでは、openssl ecparam -list_curves も、利用可能な各楕円曲線の名前と説明を表示します。

format が指定されていない場合、点は 'uncompressed' 形式で返されます。

inputEncoding が指定されていない場合、keyBufferTypedArray、または DataView であると期待されます。

例 (鍵の非圧縮)

const {
  createECDH,
  ECDH,
} = await import('node:crypto');

const ecdh = createECDH('secp256k1');
ecdh.generateKeys();

const compressedKey = ecdh.getPublicKey('hex', 'compressed');

const uncompressedKey = ECDH.convertKey(compressedKey,
                                        'secp256k1',
                                        'hex',
                                        'hex',
                                        'uncompressed');

// The converted key and the uncompressed public key should be the same
console.log(uncompressedKey === ecdh.getPublicKey('hex'));const {
  createECDH,
  ECDH,
} = require('node:crypto');

const ecdh = createECDH('secp256k1');
ecdh.generateKeys();

const compressedKey = ecdh.getPublicKey('hex', 'compressed');

const uncompressedKey = ECDH.convertKey(compressedKey,
                                        'secp256k1',
                                        'hex',
                                        'hex',
                                        'uncompressed');

// The converted key and the uncompressed public key should be the same
console.log(uncompressedKey === ecdh.getPublicKey('hex'));

ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])#

otherPublicKey を相手方の公開鍵として使用して共有秘密を計算し、計算された共有秘密を返します。指定された鍵は指定された inputEncoding を使用して解釈され、返される秘密は指定された outputEncoding を使用してエンコードされます。inputEncoding が指定されていない場合、otherPublicKeyBufferTypedArray、または DataView であると期待されます。

outputEncoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

ecdh.computeSecret は、otherPublicKey が楕円曲線の外にある場合に ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY エラーをスローします。otherPublicKey は通常、安全でないネットワークを介してリモートユーザーから提供されるため、この例外を適切に処理してください。

ecdh.generateKeys([encoding[, format]])#

秘密鍵と公開鍵の EC Diffie-Hellman 鍵値を生成し、公開鍵を指定された formatencoding で返します。この鍵は相手方に転送されるべきです。

format 引数は点のエンコーディングを指定し、'compressed' または 'uncompressed' にすることができます。format が指定されていない場合、点は 'uncompressed' 形式で返されます。

encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

ecdh.getPrivateKey([encoding])#

encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

ecdh.getPublicKey([encoding][, format])#

format 引数は点のエンコーディングを指定し、'compressed' または 'uncompressed' にすることができます。format が指定されていない場合、点は 'uncompressed' 形式で返されます。

encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

ecdh.setPrivateKey(privateKey[, encoding])#

EC Diffie-Hellman 秘密鍵を設定します。encoding が指定されている場合、privateKey は文字列であると期待されます。それ以外の場合、privateKeyBufferTypedArray、または DataView であると期待されます。

ECDH オブジェクト作成時に指定された曲線に対して privateKey が無効な場合、エラーがスローされます。秘密鍵を設定すると、関連する公開点 (鍵) も生成され、ECDH オブジェクトに設定されます。

ecdh.setPublicKey(publicKey[, encoding])#

安定性: 0 - 非推奨

EC Diffie-Hellman 公開鍵を設定します。encoding が指定されている場合、publicKey は文字列であると期待されます。それ以外の場合は BufferTypedArray、または DataView が期待されます。

通常、このメソッドを呼び出す理由はありません。なぜなら、ECDH は共有秘密を計算するために秘密鍵と相手方の公開鍵のみを必要とするからです。通常、ecdh.generateKeys() または ecdh.setPrivateKey() のいずれかが呼び出されます。ecdh.setPrivateKey() メソッドは、設定される秘密鍵に関連付けられた公開点/鍵を生成しようとします。

例 (共有秘密の取得)

const {
  createECDH,
  createHash,
} = await import('node:crypto');

const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');

// This is a shortcut way of specifying one of Alice's previous private
// keys. It would be unwise to use such a predictable private key in a real
// application.
alice.setPrivateKey(
  createHash('sha256').update('alice', 'utf8').digest(),
);

// Bob uses a newly generated cryptographically strong
// pseudorandom key pair
bob.generateKeys();

const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

// aliceSecret and bobSecret should be the same shared secret value
console.log(aliceSecret === bobSecret);const {
  createECDH,
  createHash,
} = require('node:crypto');

const alice = createECDH('secp256k1');
const bob = createECDH('secp256k1');

// This is a shortcut way of specifying one of Alice's previous private
// keys. It would be unwise to use such a predictable private key in a real
// application.
alice.setPrivateKey(
  createHash('sha256').update('alice', 'utf8').digest(),
);

// Bob uses a newly generated cryptographically strong
// pseudorandom key pair
bob.generateKeys();

const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

// aliceSecret and bobSecret should be the same shared secret value
console.log(aliceSecret === bobSecret);

クラス: Hash#

Hash クラスは、データのハッシュダイジェストを作成するためのユーティリティです。次の2つの方法のいずれかで使用できます。

  • 読み込み可能かつ書き込み可能な ストリーム として。データが書き込まれ、読み込み側で計算されたハッシュダイジェストが生成されます。または、
  • hash.update()hash.digest() メソッドを使用して、計算されたハッシュを生成します。

crypto.createHash() メソッドは、Hash インスタンスを作成するために使用されます。Hash オブジェクトは、new キーワードで直接作成するべきではありません。

例: ストリームとして Hash オブジェクトを使用する

const {
  createHash,
} = await import('node:crypto');

const hash = createHash('sha256');

hash.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = hash.read();
  if (data) {
    console.log(data.toString('hex'));
    // Prints:
    //   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
  }
});

hash.write('some data to hash');
hash.end();const {
  createHash,
} = require('node:crypto');

const hash = createHash('sha256');

hash.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = hash.read();
  if (data) {
    console.log(data.toString('hex'));
    // Prints:
    //   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
  }
});

hash.write('some data to hash');
hash.end();

例: Hash とパイプされたストリームを使用する

import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const { createHash } = await import('node:crypto');

const hash = createHash('sha256');

const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);const { createReadStream } = require('node:fs');
const { createHash } = require('node:crypto');
const { stdout } = require('node:process');

const hash = createHash('sha256');

const input = createReadStream('test.js');
input.pipe(hash).setEncoding('hex').pipe(stdout);

例: hash.update()hash.digest() メソッドを使用する

const {
  createHash,
} = await import('node:crypto');

const hash = createHash('sha256');

hash.update('some data to hash');
console.log(hash.digest('hex'));
// Prints:
//   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50const {
  createHash,
} = require('node:crypto');

const hash = createHash('sha256');

hash.update('some data to hash');
console.log(hash.digest('hex'));
// Prints:
//   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

hash.copy([options])#

現在の Hash オブジェクトの内部状態のディープコピーを含む新しい Hash オブジェクトを作成します。

オプションの options 引数はストリームの動作を制御します。'shake256' などの XOF ハッシュ関数では、outputLength オプションを使用して、目的の出力長をバイト単位で指定できます。

hash.digest() メソッドが呼び出された後に Hash オブジェクトをコピーしようとすると、エラーがスローされます。

// Calculate a rolling hash.
const {
  createHash,
} = await import('node:crypto');

const hash = createHash('sha256');

hash.update('one');
console.log(hash.copy().digest('hex'));

hash.update('two');
console.log(hash.copy().digest('hex'));

hash.update('three');
console.log(hash.copy().digest('hex'));

// Etc.// Calculate a rolling hash.
const {
  createHash,
} = require('node:crypto');

const hash = createHash('sha256');

hash.update('one');
console.log(hash.copy().digest('hex'));

hash.update('two');
console.log(hash.copy().digest('hex'));

hash.update('three');
console.log(hash.copy().digest('hex'));

// Etc.

hash.digest([encoding])#

ハッシュするために渡されたすべてのデータ(hash.update() メソッドを使用)のダイジェストを計算します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

hash.digest() メソッドが呼び出された後、Hash オブジェクトは再び使用できません。複数回呼び出すとエラーがスローされます。

hash.update(data[, inputEncoding])#

ハッシュの内容を、与えられた data で更新します。そのエンコーディングは inputEncoding で指定されます。encoding が指定されておらず、data が文字列の場合、'utf8' のエンコーディングが強制されます。dataBufferTypedArray、または DataView の場合、inputEncoding は無視されます。

これは、データがストリーミングされるにつれて、新しいデータで何度も呼び出すことができます。

クラス: Hmac#

Hmac クラスは、暗号化 HMAC ダイジェストを作成するためのユーティリティです。次の2つの方法のいずれかで使用できます。

  • 読み込み可能かつ書き込み可能な ストリーム として。データが書き込まれ、読み込み側で計算された HMAC ダイジェストが生成されます。または、
  • hmac.update()hmac.digest() メソッドを使用して、計算された HMAC ダイジェストを生成します。

crypto.createHmac() メソッドは、Hmac インスタンスを作成するために使用されます。Hmac オブジェクトは、new キーワードで直接作成するべきではありません。

例: ストリームとして Hmac オブジェクトを使用する

const {
  createHmac,
} = await import('node:crypto');

const hmac = createHmac('sha256', 'a secret');

hmac.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = hmac.read();
  if (data) {
    console.log(data.toString('hex'));
    // Prints:
    //   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
  }
});

hmac.write('some data to hash');
hmac.end();const {
  createHmac,
} = require('node:crypto');

const hmac = createHmac('sha256', 'a secret');

hmac.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = hmac.read();
  if (data) {
    console.log(data.toString('hex'));
    // Prints:
    //   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
  }
});

hmac.write('some data to hash');
hmac.end();

例: Hmac とパイプされたストリームを使用する

import { createReadStream } from 'node:fs';
import { stdout } from 'node:process';
const {
  createHmac,
} = await import('node:crypto');

const hmac = createHmac('sha256', 'a secret');

const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);const {
  createReadStream,
} = require('node:fs');
const {
  createHmac,
} = require('node:crypto');
const { stdout } = require('node:process');

const hmac = createHmac('sha256', 'a secret');

const input = createReadStream('test.js');
input.pipe(hmac).pipe(stdout);

例: hmac.update()hmac.digest() メソッドを使用する

const {
  createHmac,
} = await import('node:crypto');

const hmac = createHmac('sha256', 'a secret');

hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
//   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77econst {
  createHmac,
} = require('node:crypto');

const hmac = createHmac('sha256', 'a secret');

hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
//   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

hmac.digest([encoding])#

hmac.update() を使用して渡されたすべてのデータの HMAC ダイジェストを計算します。encoding が指定されている場合は文字列が返されます。それ以外の場合は Buffer が返されます。

hmac.digest() が呼び出された後、Hmac オブジェクトは再び使用できません。hmac.digest() を複数回呼び出すと、エラーがスローされます。

hmac.update(data[, inputEncoding])#

Hmac の内容を与えられた data で更新します。そのエンコーディングは inputEncoding で指定されます。encoding が指定されておらず、data が文字列の場合、'utf8' のエンコーディングが強制されます。dataBufferTypedArray、または DataView の場合、inputEncoding は無視されます。

これは、データがストリーミングされるにつれて、新しいデータで何度も呼び出すことができます。

クラス: KeyObject#

Node.js は、対称鍵または非対称鍵を表すために KeyObject クラスを使用し、それぞれの種類の鍵は異なる関数を公開します。crypto.createSecretKey()crypto.createPublicKey()、および crypto.createPrivateKey() メソッドは、KeyObject インスタンスを作成するために使用されます。KeyObject オブジェクトは、new キーワードで直接作成するべきではありません。

ほとんどのアプリケーションでは、セキュリティ機能が向上しているため、鍵を文字列や Buffer として渡す代わりに、新しい KeyObject API を使用することを検討すべきです。

KeyObject インスタンスは、postMessage() を介して他のスレッドに渡すことができます。受信側はクローンされた KeyObject を取得し、KeyObjecttransferList 引数にリストする必要はありません。

静的メソッド: KeyObject.from(key)#

例: CryptoKey インスタンスを KeyObject に変換する

const { KeyObject } = await import('node:crypto');
const { subtle } = globalThis.crypto;

const key = await subtle.generateKey({
  name: 'HMAC',
  hash: 'SHA-256',
  length: 256,
}, true, ['sign', 'verify']);

const keyObject = KeyObject.from(key);
console.log(keyObject.symmetricKeySize);
// Prints: 32 (symmetric key size in bytes)const { KeyObject } = require('node:crypto');
const { subtle } = globalThis.crypto;

(async function() {
  const key = await subtle.generateKey({
    name: 'HMAC',
    hash: 'SHA-256',
    length: 256,
  }, true, ['sign', 'verify']);

  const keyObject = KeyObject.from(key);
  console.log(keyObject.symmetricKeySize);
  // Prints: 32 (symmetric key size in bytes)
})();

keyObject.asymmetricKeyDetails#

  • 型: <Object>
    • modulusLength <number> 鍵サイズ(ビット単位)(RSA, DSA)。
    • publicExponent <bigint> 公開指数(RSA)。
    • hashAlgorithm <string> メッセージダイジェストの名前(RSA-PSS)。
    • mgf1HashAlgorithm <string> MGF1 で使用されるメッセージダイジェストの名前(RSA-PSS)。
    • saltLength <number> 最小ソルト長(バイト単位)(RSA-PSS)。
    • divisorLength <number> q のサイズ(ビット単位)(DSA)。
    • namedCurve <string> 曲線の名前(EC)。

このプロパティは非対称鍵にのみ存在します。鍵の種類に応じて、このオブジェクトには鍵に関する情報が含まれます。このプロパティを通じて取得された情報はいずれも、鍵を一意に識別したり、鍵のセキュリティを侵害したりするために使用することはできません。

RSA-PSS 鍵の場合、鍵マテリアルに RSASSA-PSS-params シーケンスが含まれている場合、hashAlgorithmmgf1HashAlgorithm、および saltLength プロパティが設定されます。

他の鍵の詳細は、追加の属性を使用してこの API を介して公開される可能性があります。

keyObject.asymmetricKeyType#

非対称鍵の場合、このプロパティは鍵の種類を表します。サポートされている非対称鍵の種類を参照してください。

このプロパティは、認識されない KeyObject の種類および対称鍵に対しては undefined です。

keyObject.equals(otherKeyObject)#

鍵が完全に同じ型、値、およびパラメータを持つかどうかに応じて true または false を返します。このメソッドはコンスタントタイムではありません。

keyObject.export([options])#

対称鍵の場合、以下のエンコーディングオプションを使用できます。

  • format <string> 'buffer' (デフォルト) または 'jwk' である必要があります。

公開鍵の場合、以下のエンコーディングオプションを使用できます。

  • type <string> 'pkcs1' (RSA のみ) または 'spki' のいずれかである必要があります。
  • format <string> 'pem''der'、または 'jwk' である必要があります。

秘密鍵の場合、以下のエンコーディングオプションを使用できます。

  • type <string> 'pkcs1' (RSA のみ)、'pkcs8'、または 'sec1' (EC のみ) のいずれかである必要があります。
  • format <string> 'pem''der'、または 'jwk' である必要があります。
  • cipher <string> 指定された場合、秘密鍵は PKCS#5 v2.0 パスワードベースの暗号化を使用して、与えられた cipherpassphrase で暗号化されます。
  • passphrase <string> | <Buffer> 暗号化に使用するパスフレーズ。cipher を参照してください。

結果の型は、選択されたエンコーディング形式によって異なります。PEM の場合は文字列、DER の場合は DER としてエンコードされたデータを含むバッファ、JWK の場合はオブジェクトになります。

JWK エンコーディング形式が選択された場合、他のすべてのエンコーディングオプションは無視されます。

PKCS#1、SEC1、および PKCS#8 タイプの鍵は、cipherformat オプションの組み合わせを使用して暗号化できます。PKCS#8 type は、cipher を指定することで、任意の鍵アルゴリズム (RSA、EC、または DH) を暗号化するために任意の format と一緒に使用できます。PKCS#1 と SEC1 は、PEM format が使用されている場合に cipher を指定することによってのみ暗号化できます。最大限の互換性を得るには、暗号化された秘密鍵に PKCS#8 を使用してください。PKCS#8 は独自の暗号化メカニズムを定義しているため、PKCS#8 鍵を暗号化する場合、PEM レベルの暗号化はサポートされていません。PKCS#8 暗号化については RFC 5208 を、PKCS#1 および SEC1 暗号化については RFC 1421 を参照してください。

keyObject.symmetricKeySize#

秘密鍵の場合、このプロパティは鍵のサイズをバイト単位で表します。このプロパティは非対称鍵に対しては undefined です。

keyObject.toCryptoKey(algorithm, extractable, keyUsages)#

KeyObject インスタンスを CryptoKey に変換します。

keyObject.type#

この KeyObject の種類に応じて、このプロパティは秘密 (対称) 鍵の場合は 'secret'、公開 (非対称) 鍵の場合は 'public'、または秘密 (非対称) 鍵の場合は 'private' のいずれかになります。

クラス: Sign#

Sign クラスは、署名を生成するためのユーティリティです。次の2つの方法のいずれかで使用できます。

  • 書き込み可能な ストリーム として。署名するデータが書き込まれ、sign.sign() メソッドが署名を生成して返します。または、
  • sign.update()sign.sign() メソッドを使用して署名を生成します。

crypto.createSign() メソッドは、Sign インスタンスを作成するために使用されます。引数は、使用するハッシュ関数の文字列名です。Sign オブジェクトは、new キーワードで直接作成するべきではありません。

例: ストリームとして SignVerify オブジェクトを使用する

const {
  generateKeyPairSync,
  createSign,
  createVerify,
} = await import('node:crypto');

const { privateKey, publicKey } = generateKeyPairSync('ec', {
  namedCurve: 'sect239k1',
});

const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');

const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: trueconst {
  generateKeyPairSync,
  createSign,
  createVerify,
} = require('node:crypto');

const { privateKey, publicKey } = generateKeyPairSync('ec', {
  namedCurve: 'sect239k1',
});

const sign = createSign('SHA256');
sign.write('some data to sign');
sign.end();
const signature = sign.sign(privateKey, 'hex');

const verify = createVerify('SHA256');
verify.write('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature, 'hex'));
// Prints: true

例: sign.update()verify.update() メソッドを使用する

const {
  generateKeyPairSync,
  createSign,
  createVerify,
} = await import('node:crypto');

const { privateKey, publicKey } = generateKeyPairSync('rsa', {
  modulusLength: 2048,
});

const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);

const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: trueconst {
  generateKeyPairSync,
  createSign,
  createVerify,
} = require('node:crypto');

const { privateKey, publicKey } = generateKeyPairSync('rsa', {
  modulusLength: 2048,
});

const sign = createSign('SHA256');
sign.update('some data to sign');
sign.end();
const signature = sign.sign(privateKey);

const verify = createVerify('SHA256');
verify.update('some data to sign');
verify.end();
console.log(verify.verify(publicKey, signature));
// Prints: true

sign.sign(privateKey[, outputEncoding])#

sign.update() または sign.write() のいずれかを使用して渡されたすべてのデータの署名を計算します。

privateKeyKeyObject でない場合、この関数は privateKeycrypto.createPrivateKey() に渡されたかのように動作します。オブジェクトの場合、以下の追加プロパティを渡すことができます。

  • dsaEncoding <string> DSA および ECDSA の場合、このオプションは生成される署名の形式を指定します。以下のいずれかになります。

    • 'der' (デフォルト): DER エンコードされた ASN.1 署名構造。(r, s) をエンコードします。
    • 'ieee-p1363': IEEE-P1363 で提案された署名形式 r || s
  • padding <integer> RSA のオプションのパディング値。以下のいずれかです。

    • crypto.constants.RSA_PKCS1_PADDING (デフォルト)
    • crypto.constants.RSA_PKCS1_PSS_PADDING

    RSA_PKCS1_PSS_PADDING は、RFC 4055 のセクション 3.3 に準拠してキーの一部として MGF1 ハッシュ関数が指定されていない限り、RFC 4055 のセクション 3.1 で指定されているメッセージの署名に使用されたのと同じハッシュ関数で MGF1 を使用します。

  • saltLength <integer> パディングが RSA_PKCS1_PSS_PADDING の場合のソルト長。特別な値 crypto.constants.RSA_PSS_SALTLEN_DIGEST はソルト長をダイジェストサイズに設定し、crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN (デフォルト) はそれを許容される最大値に設定します。

outputEncoding が指定された場合は文字列が返されます。それ以外の場合は Buffer が返されます。

sign.sign() メソッドが呼び出された後、Sign オブジェクトを再び使用することはできません。sign.sign() を複数回呼び出すと、エラーがスローされます。

sign.update(data[, inputEncoding])#

指定された dataSign の内容を更新します。そのエンコーディングは inputEncoding で指定されます。encoding が指定されず、data が文字列の場合、'utf8' のエンコーディングが強制されます。dataBufferTypedArray、または DataView の場合、inputEncoding は無視されます。

これは、データがストリーミングされるにつれて、新しいデータで何度も呼び出すことができます。

クラス: Verify#

Verify クラスは、署名を検証するためのユーティリティです。次の2つの方法のいずれかで使用できます。

  • 書き込み可能な stream として。書き込まれたデータは、提供された署名に対して検証するために使用されます。
  • verify.update() および verify.verify() メソッドを使用して署名を検証します。

crypto.createVerify() メソッドは Verify インスタンスを作成するために使用されます。Verify オブジェクトは new キーワードを使用して直接作成されるべきではありません。

例については Sign を参照してください。

verify.update(data[, inputEncoding])#

指定された dataVerify の内容を更新します。そのエンコーディングは inputEncoding で指定されます。inputEncoding が指定されず、data が文字列の場合、'utf8' のエンコーディングが強制されます。dataBufferTypedArray、または DataView の場合、inputEncoding は無視されます。

これは、データがストリーミングされるにつれて、新しいデータで何度も呼び出すことができます。

verify.verify(object, signature[, signatureEncoding])#

指定された objectsignature を使用して、提供されたデータを検証します。

objectKeyObject でない場合、この関数は objectcrypto.createPublicKey() に渡されたかのように動作します。オブジェクトの場合、以下の追加プロパティを渡すことができます。

  • dsaEncoding <string> DSA および ECDSA の場合、このオプションは署名のフォーマットを指定します。以下のいずれかです。

    • 'der' (デフォルト): DER エンコードされた ASN.1 署名構造。(r, s) をエンコードします。
    • 'ieee-p1363': IEEE-P1363 で提案された署名形式 r || s
  • padding <integer> RSA のオプションのパディング値。以下のいずれかです。

    • crypto.constants.RSA_PKCS1_PADDING (デフォルト)
    • crypto.constants.RSA_PKCS1_PSS_PADDING

    RSA_PKCS1_PSS_PADDING は、RFC 4055 のセクション 3.3 に準拠してキーの一部として MGF1 ハッシュ関数が指定されていない限り、RFC 4055 のセクション 3.1 で指定されているメッセージの検証に使用されたのと同じハッシュ関数で MGF1 を使用します。

  • saltLength <integer> パディングが RSA_PKCS1_PSS_PADDING の場合のソルト長。特別な値 crypto.constants.RSA_PSS_SALTLEN_DIGEST はソルト長をダイジェストサイズに設定し、crypto.constants.RSA_PSS_SALTLEN_AUTO (デフォルト) は自動的に決定されるようにします。

signature 引数は、以前に計算されたデータの署名で、signatureEncoding でエンコードされています。signatureEncoding が指定されている場合、signature は文字列であることが期待されます。それ以外の場合、signatureBufferTypedArray、または DataView であることが期待されます。

verify.verify() が呼び出された後、verify オブジェクトを再び使用することはできません。verify.verify() を複数回呼び出すと、エラーがスローされます。

公開鍵は秘密鍵から派生させることができるため、公開鍵の代わりに秘密鍵を渡すこともできます。

クラス: X509Certificate#

X509 証明書をカプセル化し、その情報への読み取り専用アクセスを提供します。

const { X509Certificate } = await import('node:crypto');

const x509 = new X509Certificate('{... pem encoded cert ...}');

console.log(x509.subject);const { X509Certificate } = require('node:crypto');

const x509 = new X509Certificate('{... pem encoded cert ...}');

console.log(x509.subject);

new X509Certificate(buffer)#

x509.ca#

  • 型: <boolean> これが認証局 (CA) 証明書である場合は true になります。

x509.checkEmail(email[, options])#

  • email <string>
  • options <Object>
    • subject <string> 'default''always'、または 'never'デフォルト: 'default'
  • 戻り値: <string> | <undefined> 証明書が一致する場合は email を返し、一致しない場合は undefined を返します。

証明書が指定されたメールアドレスと一致するかどうかを確認します。

'subject' オプションが未定義または 'default' に設定されている場合、証明書のサブジェクトは、サブジェクト代替名拡張が存在しないか、メールアドレスを含まない場合にのみ考慮されます。

'subject' オプションが 'always' に設定されていて、サブジェクト代替名拡張が存在しないか、一致するメールアドレスを含まない場合、証明書のサブジェクトが考慮されます。

'subject' オプションが 'never' に設定されている場合、証明書にサブジェクト代替名が含まれていなくても、証明書のサブジェクトは考慮されません。

x509.checkHost(name[, options])#

  • name <string>
  • options <Object>
    • subject <string> 'default''always'、または 'never'デフォルト: 'default'
    • wildcards <boolean> デフォルト: true
    • partialWildcards <boolean> デフォルト: true
    • multiLabelWildcards <boolean> デフォルト: false
    • singleLabelSubdomains <boolean> デフォルト: false
  • 戻り値: <string> | <undefined> name に一致するサブジェクト名を返します。一致するサブジェクト名がない場合は undefined を返します。

証明書が指定されたホスト名と一致するかどうかを確認します。

証明書が指定されたホスト名と一致する場合、一致するサブジェクト名が返されます。返される名前は完全一致 (例: foo.example.com) かもしれませんし、ワイルドカードを含む (例: *.example.com) かもしれません。ホスト名の比較は大文字と小文字を区別しないため、返されるサブジェクト名は大文字小文字の点で指定された name と異なる場合があります。

'subject' オプションが未定義または 'default' に設定されている場合、証明書のサブジェクトは、サブジェクト代替名拡張が存在しないか、DNS 名を含まない場合にのみ考慮されます。この動作は RFC 2818 (「HTTP Over TLS」) と一致しています。

'subject' オプションが 'always' に設定されていて、サブジェクト代替名拡張が存在しないか、一致する DNS 名を含まない場合、証明書のサブジェクトが考慮されます。

'subject' オプションが 'never' に設定されている場合、証明書にサブジェクト代替名が含まれていなくても、証明書のサブジェクトは考慮されません。

x509.checkIP(ip)#

  • ip <string>
  • 戻り値: <string> | <undefined> 証明書が一致する場合は ip を返し、一致しない場合は undefined を返します。

証明書が指定された IP アドレス (IPv4 または IPv6) と一致するかどうかを確認します。

RFC 5280iPAddress サブジェクト代替名のみが考慮され、指定された ip アドレスと完全に一致する必要があります。他のサブジェクト代替名および証明書のサブジェクトフィールドは無視されます。

x509.checkIssued(otherCert)#

証明書のメタデータを比較することにより、この証明書が指定された otherCert によって発行された可能性があるかどうかを確認します。

これは、より基本的なフィルタリングルーチン (つまり、サブジェクト名と発行者名のみに基づく) を使用して選択された、考えられる発行者証明書のリストを絞り込むのに役立ちます。

最後に、この証明書の署名が otherCert の公開鍵に対応する秘密鍵によって生成されたことを確認するには、otherCert の公開鍵を KeyObject として表現し、x509.verify(publicKey) を次のように使用します。

if (!x509.verify(otherCert.publicKey)) {
  throw new Error('otherCert did not issue x509');
} 

x509.checkPrivateKey(privateKey)#

この証明書の公開鍵が指定された秘密鍵と一致するかどうかを確認します。

x509.fingerprint#

この証明書の SHA-1 フィンガープリント。

SHA-1 は暗号学的に破られており、SHA-1 のセキュリティは証明書の署名に一般的に使用されるアルゴリズムよりも著しく劣るため、代わりに x509.fingerprint256 の使用を検討してください。

x509.fingerprint256#

この証明書の SHA-256 フィンガープリント。

x509.fingerprint512#

この証明書の SHA-512 フィンガープリント。

通常、SHA-256 フィンガープリントの計算はより速く、SHA-512 フィンガープリントの半分のサイズであるため、x509.fingerprint256 の方が良い選択かもしれません。SHA-512 は一般により高いレベルのセキュリティを提供すると考えられていますが、SHA-256 のセキュリティは証明書の署名に一般的に使用されるほとんどのアルゴリズムに匹敵します。

x509.infoAccess#

証明書の Authority Information Access 拡張のテキスト表現。

これは、改行で区切られたアクセス記述のリストです。各行は、アクセスメソッドとアクセスロケーションの種類で始まり、コロンとアクセスロケーションに関連付けられた値が続きます。

アクセスメソッドとアクセスロケーションの種類を示す接頭辞の後、各行の残りの部分は、値が JSON 文字列リテラルであることを示すために引用符で囲まれる場合があります。後方互換性のために、Node.js は曖昧さを避けるために必要な場合にのみこのプロパティ内で JSON 文字列リテラルを使用します。サードパーティのコードは、両方の可能なエントリ形式を処理できるように準備する必要があります。

x509.issuer#

この証明書に含まれる発行者識別情報。

x509.issuerCertificate#

発行者証明書、または発行者証明書が利用できない場合は undefined

x509.keyUsage#

この証明書のキーの拡張用途を詳述する配列。

x509.publicKey#

この証明書の公開鍵 <KeyObject>

x509.raw#

この証明書の DER エンコーディングを含む Buffer

x509.serialNumber#

この証明書のシリアル番号。

シリアル番号は認証局によって割り当てられ、証明書を一意に識別するものではありません。代わりに一意の識別子として x509.fingerprint256 の使用を検討してください。

x509.subject#

この証明書の完全なサブジェクト。

x509.subjectAltName#

この証明書に指定されたサブジェクト代替名。

これは、コンマで区切られたサブジェクト代替名のリストです。各エントリは、サブジェクト代替名の種類を識別する文字列で始まり、コロンとエントリに関連付けられた値が続きます。

以前のバージョンの Node.js は、このプロパティを2文字のシーケンス ', ' で分割するのが安全であると誤って仮定していました (CVE-2021-44532 を参照)。しかし、悪意のある証明書と正当な証明書の両方が、文字列として表現された場合にこのシーケンスを含むサブジェクト代替名を含む可能性があります。

エントリのタイプを示す接頭辞の後、各エントリの残りの部分は、値が JSON 文字列リテラルであることを示すために引用符で囲まれる場合があります。後方互換性のために、Node.js は曖昧さを避けるために必要な場合にのみこのプロパティ内で JSON 文字列リテラルを使用します。サードパーティのコードは、両方の可能なエントリ形式を処理できるように準備する必要があります。

x509.toJSON()#

X509 証明書には標準的な JSON エンコーディングはありません。toJSON() メソッドは、PEM エンコードされた証明書を含む文字列を返します。

x509.toLegacyObject()#

従来の 証明書オブジェクト エンコーディングを使用して、この証明書に関する情報を返します。

x509.toString()#

PEM エンコードされた証明書を返します。

x509.validFrom#

この証明書が有効である開始日時。

x509.validFromDate#

この証明書が有効である開始日時。Date オブジェクトにカプセル化されています。

x509.validTo#

この証明書が有効である終了日時。

x509.validToDate#

この証明書が有効である終了日時。Date オブジェクトにカプセル化されています。

x509.signatureAlgorithm#

証明書の署名に使用されたアルゴリズム、または署名アルゴリズムが OpenSSL によって不明な場合は undefined

x509.signatureAlgorithmOid#

証明書の署名に使用されたアルゴリズムの OID。

x509.verify(publicKey)#

この証明書が指定された公開鍵によって署名されたことを検証します。証明書に対する他の検証チェックは行いません。

node:crypto モジュールのメソッドとプロパティ#

crypto.argon2(algorithm, parameters, callback)#

安定性: 1.2 - Release candidate

  • algorithm <string> Argon2 のバリアント。"argon2d""argon2i"、または "argon2id" のいずれか。
  • parameters <Object>
    • message <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須。これは Argon2 のパスワードハッシュアプリケーションのパスワードです。
    • nonce <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須。少なくとも8バイトの長さでなければなりません。これは Argon2 のパスワードハッシュアプリケーションのソルトです。
    • parallelism <number> 必須。並列度は、実行できる計算チェーン (レーン) の数を決定します。1 より大きく、2**24-1 未満でなければなりません。
    • tagLength <number> 必須。生成するキーの長さ。4 より大きく、2**32-1 未満でなければなりません。
    • memory <number> 必須。1KiB ブロック単位のメモリコスト。8 * parallelism より大きく、2**32-1 未満でなければなりません。実際のブロック数は、4 * parallelism の最も近い倍数に切り捨てられます。
    • passes <number> 必須。パス (反復) の回数。1 より大きく、2**32-1 未満でなければなりません。
    • secret <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <undefined> オプション。ソルトに似た、派生キーと一緒に保存されるべきではないランダムな追加入力。これはパスワードハッシュアプリケーションではペッパーとして知られています。使用する場合、長さは 2**32-1 バイトを超えてはなりません。
    • associatedData <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <undefined> オプション。ハッシュに追加される追加データ。機能的にはソルトやシークレットと同等ですが、ランダムでないデータ向けです。使用する場合、長さは 2**32-1 バイトを超えてはなりません。
  • callback <Function>

非同期の Argon2 実装を提供します。Argon2 は、ブルートフォース攻撃を価値のないものにするために、計算上およびメモリ上で高コストになるように設計された、パスワードベースの鍵導出関数です。

nonce は可能な限り一意であるべきです。nonce はランダムで、少なくとも16バイトの長さであることが推奨されます。詳細については NIST SP 800-132 を参照してください。

messagenoncesecret、または associatedData に文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点 を考慮してください。

callback 関数は2つの引数、errderivedKey で呼び出されます。err は鍵導出が失敗した場合の例外オブジェクトで、それ以外の場合は null です。derivedKeyBuffer としてコールバックに渡されます。

いずれかの入力引数が無効な値または型を指定した場合、例外がスローされます。

const { argon2, randomBytes } = await import('node:crypto');

const parameters = {
  message: 'password',
  nonce: randomBytes(16),
  parallelism: 4,
  tagLength: 64,
  memory: 65536,
  passes: 3,
};

argon2('argon2id', parameters, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // 'af91dad...9520f15'
});const { argon2, randomBytes } = require('node:crypto');

const parameters = {
  message: 'password',
  nonce: randomBytes(16),
  parallelism: 4,
  tagLength: 64,
  memory: 65536,
  passes: 3,
};

argon2('argon2id', parameters, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // 'af91dad...9520f15'
});

crypto.argon2Sync(algorithm, parameters)#

安定性: 1.2 - Release candidate

  • algorithm <string> Argon2 のバリアント。"argon2d""argon2i"、または "argon2id" のいずれか。
  • parameters <Object>
    • message <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須。これは Argon2 のパスワードハッシュアプリケーションのパスワードです。
    • nonce <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須。少なくとも8バイトの長さでなければなりません。これは Argon2 のパスワードハッシュアプリケーションのソルトです。
    • parallelism <number> 必須。並列度は、実行できる計算チェーン (レーン) の数を決定します。1 より大きく、2**24-1 未満でなければなりません。
    • tagLength <number> 必須。生成するキーの長さ。4 より大きく、2**32-1 未満でなければなりません。
    • memory <number> 必須。1KiB ブロック単位のメモリコスト。8 * parallelism より大きく、2**32-1 未満でなければなりません。実際のブロック数は、4 * parallelism の最も近い倍数に切り捨てられます。
    • passes <number> 必須。パス (反復) の回数。1 より大きく、2**32-1 未満でなければなりません。
    • secret <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <undefined> オプション。ソルトに似た、派生キーと一緒に保存されるべきではないランダムな追加入力。これはパスワードハッシュアプリケーションではペッパーとして知られています。使用する場合、長さは 2**32-1 バイトを超えてはなりません。
    • associatedData <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <undefined> オプション。ハッシュに追加される追加データ。機能的にはソルトやシークレットと同等ですが、ランダムでないデータ向けです。使用する場合、長さは 2**32-1 バイトを超えてはなりません。
  • 戻り値: <Buffer>

同期の Argon2 実装を提供します。Argon2 は、ブルートフォース攻撃を価値のないものにするために、計算上およびメモリ上で高コストになるように設計された、パスワードベースの鍵導出関数です。

nonce は可能な限り一意であるべきです。nonce はランダムで、少なくとも16バイトの長さであることが推奨されます。詳細については NIST SP 800-132 を参照してください。

messagenoncesecret、または associatedData に文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点 を考慮してください。

鍵導出が失敗した場合、例外がスローされます。それ以外の場合、派生キーは Buffer として返されます。

いずれかの入力引数が無効な値または型を指定した場合、例外がスローされます。

const { argon2Sync, randomBytes } = await import('node:crypto');

const parameters = {
  message: 'password',
  nonce: randomBytes(16),
  parallelism: 4,
  tagLength: 64,
  memory: 65536,
  passes: 3,
};

const derivedKey = argon2Sync('argon2id', parameters);
console.log(derivedKey.toString('hex'));  // 'af91dad...9520f15'const { argon2Sync, randomBytes } = require('node:crypto');

const parameters = {
  message: 'password',
  nonce: randomBytes(16),
  parallelism: 4,
  tagLength: 64,
  memory: 65536,
  passes: 3,
};

const derivedKey = argon2Sync('argon2id', parameters);
console.log(derivedKey.toString('hex'));  // 'af91dad...9520f15'

crypto.checkPrime(candidate[, options], callback)#

  • candidate <ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> 任意の長さのビッグエンディアンのオクテットシーケンスとしてエンコードされた素数の候補。
  • options <Object>
    • checks <number> 実行するミラー-ラビン確率的素数性テストの反復回数。値が 0 (ゼロ) の場合、ランダムな入力に対して最大で 2-64 の偽陽性率を生じるチェック回数が使用されます。チェック回数を選択する際には注意が必要です。詳細については、OpenSSL ドキュメントの BN_is_prime_ex 関数の nchecks オプションを参照してください。デフォルト: 0
  • callback <Function>
    • err <Error> チェック中にエラーが発生した場合、<Error> オブジェクトに設定されます。
    • result <boolean> 候補が 0.25 ** options.checks 未満のエラー確率で素数である場合は true

candidate の素数性をチェックします。

crypto.checkPrimeSync(candidate[, options])#

  • candidate <ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> 任意の長さのビッグエンディアンのオクテットシーケンスとしてエンコードされた素数の候補。
  • options <Object>
    • checks <number> 実行するミラー-ラビン確率的素数性テストの反復回数。値が 0 (ゼロ) の場合、ランダムな入力に対して最大で 2-64 の偽陽性率を生じるチェック回数が使用されます。チェック回数を選択する際には注意が必要です。詳細については、OpenSSL ドキュメントの BN_is_prime_ex 関数の nchecks オプションを参照してください。デフォルト: 0
  • 戻り値: <boolean> 候補が 0.25 ** options.checks 未満のエラー確率で素数である場合は true

candidate の素数性をチェックします。

crypto.constants#

暗号およびセキュリティ関連の操作で一般的に使用される定数を含むオブジェクト。現在定義されている特定の定数は、暗号定数で説明されています。

crypto.createCipheriv(algorithm, key, iv[, options])#

指定された algorithmkey、および初期化ベクトル (iv) で Cipheriv オブジェクトを作成して返します。

options 引数はストリームの動作を制御し、CCM または OCB モードの暗号 (例: 'aes-128-ccm') が使用される場合を除き、オプションです。その場合、authTagLength オプションは必須であり、認証タグの長さをバイト単位で指定します。CCM モードを参照してください。GCM モードでは、authTagLength オプションは必須ではありませんが、getAuthTag() によって返される認証タグの長さを設定するために使用でき、デフォルトは 16 バイトです。chacha20-poly1305 の場合、authTagLength オプションはデフォルトで 16 バイトです。

algorithm は OpenSSL に依存します。例としては 'aes192' などがあります。最近の OpenSSL リリースでは、openssl list -cipher-algorithms で利用可能な暗号アルゴリズムが表示されます。

keyalgorithm で使用される生のキーで、iv初期化ベクトルです。両方の引数は 'utf8' エンコードされた文字列、BufferTypedArray、または DataView でなければなりません。key はオプションで型が secretKeyObject にすることもできます。暗号が初期化ベクトルを必要としない場合、ivnull にすることができます。

key または iv に文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点 を考慮してください。

初期化ベクトルは予測不可能で一意であるべきです。理想的には、暗号学的にランダムであるべきです。秘密にする必要はありません。IV は通常、暗号化されていない暗号文メッセージに追加されるだけです。何かが予測不可能で一意である必要があるが、秘密である必要はないというのは矛盾しているように聞こえるかもしれません。攻撃者が特定の IV が何であるかを事前に予測できてはならないことを覚えておいてください。

crypto.createDecipheriv(algorithm, key, iv[, options])#

指定された algorithmkey、および初期化ベクトル (iv) を使用する Decipheriv オブジェクトを作成して返します。

options 引数はストリームの動作を制御し、CCM または OCB モードの暗号 (例: 'aes-128-ccm') が使用される場合を除き、オプションです。その場合、authTagLength オプションは必須であり、認証タグの長さをバイト単位で指定します。CCM モードを参照してください。AES-GCM および chacha20-poly1305 の場合、authTagLength オプションはデフォルトで 16 バイトであり、異なる長さが使用される場合は別の値に設定する必要があります。

algorithm は OpenSSL に依存します。例としては 'aes192' などがあります。最近の OpenSSL リリースでは、openssl list -cipher-algorithms で利用可能な暗号アルゴリズムが表示されます。

keyalgorithm で使用される生のキーで、iv初期化ベクトルです。両方の引数は 'utf8' エンコードされた文字列、BufferTypedArray、または DataView でなければなりません。key はオプションで型が secretKeyObject にすることもできます。暗号が初期化ベクトルを必要としない場合、ivnull にすることができます。

key または iv に文字列を渡す場合は、暗号 API への入力として文字列を使用する際の注意点 を考慮してください。

初期化ベクトルは予測不可能で一意であるべきです。理想的には、暗号学的にランダムであるべきです。秘密にする必要はありません。IV は通常、暗号化されていない暗号文メッセージに追加されるだけです。何かが予測不可能で一意である必要があるが、秘密である必要はないというのは矛盾しているように聞こえるかもしれません。攻撃者が特定の IV が何であるかを事前に予測できてはならないことを覚えておいてください。

crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])#

指定された prime とオプションの特定の generator を使用して、DiffieHellman 鍵交換オブジェクトを作成します。

generator 引数は、数値、文字列、または Buffer にすることができます。generator が指定されていない場合、値 2 が使用されます。

primeEncoding が指定されている場合、prime は文字列であることが期待されます。それ以外の場合は、BufferTypedArray、または DataView が期待されます。

generatorEncoding が指定されている場合、generator は文字列であることが期待されます。それ以外の場合は、数値、BufferTypedArray、または DataView が期待されます。

crypto.createDiffieHellman(primeLength[, generator])#

DiffieHellman 鍵交換オブジェクトを作成し、オプションの特定の数値 generator を使用して primeLength ビットの素数を生成します。generator が指定されていない場合、値 2 が使用されます。

crypto.createDiffieHellmanGroup(name)#

crypto.getDiffieHellman() のエイリアス

crypto.createECDH(curveName)#

curveName 文字列で指定された定義済みの曲線を使用して、楕円曲線ディフィー・ヘルマン (ECDH) 鍵交換オブジェクトを作成します。利用可能な曲線名のリストを取得するには crypto.getCurves() を使用してください。最近の OpenSSL リリースでは、openssl ecparam -list_curves でも、利用可能な各楕円曲線の名前と説明が表示されます。

crypto.createHash(algorithm[, options])#

指定された algorithm を使用してハッシュダイジェストを生成するために使用できる Hash オブジェクトを作成して返します。オプションの options 引数はストリームの動作を制御します。'shake256' のような XOF ハッシュ関数の場合、outputLength オプションを使用して、希望する出力長をバイト単位で指定できます。

algorithm は、プラットフォーム上の OpenSSL のバージョンでサポートされている利用可能なアルゴリズムに依存します。例としては 'sha256''sha512' などがあります。最近の OpenSSL リリースでは、openssl list -digest-algorithms で利用可能なダイジェストアルゴリズムが表示されます。

例: ファイルの sha256 サムを生成する

import {
  createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
  createHash,
} = await import('node:crypto');

const filename = argv[2];

const hash = createHash('sha256');

const input = createReadStream(filename);
input.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = input.read();
  if (data)
    hash.update(data);
  else {
    console.log(`${hash.digest('hex')} ${filename}`);
  }
});const {
  createReadStream,
} = require('node:fs');
const {
  createHash,
} = require('node:crypto');
const { argv } = require('node:process');

const filename = argv[2];

const hash = createHash('sha256');

const input = createReadStream(filename);
input.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = input.read();
  if (data)
    hash.update(data);
  else {
    console.log(`${hash.digest('hex')} ${filename}`);
  }
});

crypto.createHmac(algorithm, key[, options])#

指定された algorithmkey を使用する Hmac オブジェクトを作成して返します。オプションの options 引数はストリームの動作を制御します。

algorithm は、プラットフォーム上の OpenSSL のバージョンでサポートされている利用可能なアルゴリズムに依存します。例としては 'sha256''sha512' などがあります。最近の OpenSSL リリースでは、openssl list -digest-algorithms で利用可能なダイジェストアルゴリズムが表示されます。

key は、暗号化 HMAC ハッシュを生成するために使用される HMAC キーです。KeyObject の場合、その型は secret でなければなりません。文字列の場合は、暗号 API への入力として文字列を使用する際の注意点 を考慮してください。crypto.randomBytes()crypto.generateKey() のような暗号学的に安全なエントロピー源から取得された場合、その長さは algorithm のブロックサイズ (例: SHA-256 の場合は 512 ビット) を超えるべきではありません。

例: ファイルの sha256 HMAC を生成する

import {
  createReadStream,
} from 'node:fs';
import { argv } from 'node:process';
const {
  createHmac,
} = await import('node:crypto');

const filename = argv[2];

const hmac = createHmac('sha256', 'a secret');

const input = createReadStream(filename);
input.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = input.read();
  if (data)
    hmac.update(data);
  else {
    console.log(`${hmac.digest('hex')} ${filename}`);
  }
});const {
  createReadStream,
} = require('node:fs');
const {
  createHmac,
} = require('node:crypto');
const { argv } = require('node:process');

const filename = argv[2];

const hmac = createHmac('sha256', 'a secret');

const input = createReadStream(filename);
input.on('readable', () => {
  // Only one element is going to be produced by the
  // hash stream.
  const data = input.read();
  if (data)
    hmac.update(data);
  else {
    console.log(`${hmac.digest('hex')} ${filename}`);
  }
});

crypto.createPrivateKey(key)#

秘密鍵を含む新しいキーオブジェクトを作成して返します。key が文字列または Buffer の場合、format'pem' と見なされます。それ以外の場合、key は上記のプロパティを持つオブジェクトでなければなりません。

秘密鍵が暗号化されている場合、passphrase を指定する必要があります。パスフレーズの長さは 1024 バイトに制限されています。

crypto.createPublicKey(key)#

公開鍵を含む新しいキーオブジェクトを作成して返します。key が文字列または Buffer の場合、format'pem' と見なされます。key が型 'private'KeyObject の場合、公開鍵は指定された秘密鍵から派生します。それ以外の場合、key は上記のプロパティを持つオブジェクトでなければなりません。

フォーマットが 'pem' の場合、'key' は X.509 証明書にすることもできます。

公開鍵は秘密鍵から派生させることができるため、公開鍵の代わりに秘密鍵を渡すこともできます。その場合、この関数は、返される KeyObject の型が 'public' であり、返された KeyObject から秘密鍵を抽出できないことを除いて、crypto.createPrivateKey() が呼び出されたかのように動作します。同様に、型 'private'KeyObject が指定された場合、型 'public' の新しい KeyObject が返され、返されたオブジェクトから秘密鍵を抽出することはできなくなります。

crypto.createSecretKey(key[, encoding])#

対称暗号化または Hmac 用の秘密鍵を含む新しいキーオブジェクトを作成して返します。

crypto.createSign(algorithm[, options])#

指定された algorithm を使用する Sign オブジェクトを作成して返します。利用可能なダイジェストアルゴリズムの名前を取得するには crypto.getHashes() を使用してください。オプションの options 引数は stream.Writable の動作を制御します。

場合によっては、ダイジェストアルゴリズムの代わりに 'RSA-SHA256' のような署名アルゴリズムの名前を使用して Sign インスタンスを作成できます。これにより、対応するダイジェストアルゴリズムが使用されます。これは 'ecdsa-with-SHA256' のようなすべての署名アルゴリズムで機能するわけではないため、常にダイジェストアルゴリズム名を使用するのが最善です。

crypto.createVerify(algorithm[, options])#

指定されたアルゴリズムを使用する Verify オブジェクトを作成して返します。利用可能な署名アルゴリズムの名前の配列を取得するには crypto.getHashes() を使用してください。オプションの options 引数は stream.Writable の動作を制御します。

場合によっては、ダイジェストアルゴリズムの代わりに 'RSA-SHA256' のような署名アルゴリズムの名前を使用して Verify インスタンスを作成できます。これにより、対応するダイジェストアルゴリズムが使用されます。これは 'ecdsa-with-SHA256' のようなすべての署名アルゴリズムで機能するわけではないため、常にダイジェストアルゴリズム名を使用するのが最善です。

crypto.decapsulate(key, ciphertext[, callback])#

安定性: 1.2 - Release candidate

秘密鍵を持つ KEM アルゴリズムを使用した鍵のカプセル化解除。

サポートされているキーの種類とその KEM アルゴリズムは次のとおりです。

  • 'rsa'2 RSA 秘密値カプセル化
  • 'ec'3 DHKEM(P-256, HKDF-SHA256), DHKEM(P-384, HKDF-SHA256), DHKEM(P-521, HKDF-SHA256)
  • 'x25519'3 DHKEM(X25519, HKDF-SHA256)
  • 'x448'3 DHKEM(X448, HKDF-SHA512)
  • 'ml-kem-512'1 ML-KEM
  • 'ml-kem-768'1 ML-KEM
  • 'ml-kem-1024'1 ML-KEM

keyKeyObject でない場合、この関数は keycrypto.createPrivateKey() に渡されたかのように動作します。

callback 関数が提供された場合、この関数は libuv のスレッドプールを使用します。

crypto.diffieHellman(options[, callback])#

privateKeypublicKey に基づいてディフィー・ヘルマン共有秘密鍵を計算します。両方の鍵は同じ asymmetricKeyType を持ち、DH または ECDH 操作のいずれかをサポートしている必要があります。

callback 関数が提供された場合、この関数は libuv のスレッドプールを使用します。

crypto.encapsulate(key[, callback])#

安定性: 1.2 - Release candidate

公開鍵を持つ KEM アルゴリズムを使用した鍵のカプセル化。

サポートされているキーの種類とその KEM アルゴリズムは次のとおりです。

  • 'rsa'2 RSA 秘密値カプセル化
  • 'ec'3 DHKEM(P-256, HKDF-SHA256), DHKEM(P-384, HKDF-SHA256), DHKEM(P-521, HKDF-SHA256)
  • 'x25519'3 DHKEM(X25519, HKDF-SHA256)
  • 'x448'3 DHKEM(X448, HKDF-SHA512)
  • 'ml-kem-512'1 ML-KEM
  • 'ml-kem-768'1 ML-KEM
  • 'ml-kem-1024'1 ML-KEM

keyKeyObject でない場合、この関数は keycrypto.createPublicKey() に渡されたかのように動作します。

callback 関数が提供された場合、この関数は libuv のスレッドプールを使用します。

crypto.fips#

安定性: 0 - 非推奨

FIPS 準拠の暗号プロバイダが現在使用されているかどうかを確認および制御するためのプロパティ。true に設定するには Node.js の FIPS ビルドが必要です。

このプロパティは非推奨です。代わりに crypto.setFips()crypto.getFips() を使用してください。

crypto.generateKey(type, options, callback)#

  • type <string> 生成された秘密鍵の意図された用途。現在受け入れられている値は 'hmac''aes' です。
  • options <Object>
    • length <number> 生成するキーのビット長。これは 0 より大きい値でなければなりません。
      • type'hmac' の場合、最小値は 8、最大長は 231-1 です。値が 8 の倍数でない場合、生成されたキーは Math.floor(length / 8) に切り捨てられます。
      • type'aes' の場合、長さは 128192、または 256 のいずれかでなければなりません。
  • callback <Function>

指定された length の新しいランダムな秘密鍵を非同期で生成します。type は、length に対して実行される検証を決定します。

const {
  generateKey,
} = await import('node:crypto');

generateKey('hmac', { length: 512 }, (err, key) => {
  if (err) throw err;
  console.log(key.export().toString('hex'));  // 46e..........620
});const {
  generateKey,
} = require('node:crypto');

generateKey('hmac', { length: 512 }, (err, key) => {
  if (err) throw err;
  console.log(key.export().toString('hex'));  // 46e..........620
});

生成された HMAC キーのサイズは、基礎となるハッシュ関数のブロックサイズを超えてはなりません。詳細については crypto.createHmac() を参照してください。

crypto.generateKeyPair(type, options, callback)#

指定された type の新しい非対称鍵ペアを生成します。現在、RSA、RSA-PSS、DSA、EC、Ed25519、Ed448、X25519、X448、および DH がサポートされています。

publicKeyEncoding または privateKeyEncoding が指定された場合、この関数は、その結果に対して keyObject.export() が呼び出されたかのように動作します。それ以外の場合、鍵のそれぞれの部分は KeyObject として返されます。

長期保存のためには、公開鍵は 'spki' として、秘密鍵は 'pkcs8' と暗号化を用いてエンコードすることが推奨されます。

const {
  generateKeyPair,
} = await import('node:crypto');

generateKeyPair('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem',
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret',
  },
}, (err, publicKey, privateKey) => {
  // Handle errors and use the generated key pair.
});const {
  generateKeyPair,
} = require('node:crypto');

generateKeyPair('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem',
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret',
  },
}, (err, publicKey, privateKey) => {
  // Handle errors and use the generated key pair.
});

完了すると、errundefined に設定され、生成された鍵ペアを表す publicKey / privateKey と共に callback が呼び出されます。

このメソッドが util.promisify() 化されたバージョンとして呼び出された場合、publicKeyprivateKey プロパティを持つ ObjectPromise を返します。

crypto.generateKeyPairSync(type, options)#

  • type <string> 生成する非対称鍵の種類。サポートされている非対称鍵の種類を参照してください。
  • options <Object>
    • modulusLength <number> 鍵サイズ(ビット単位)(RSA, DSA)。
    • publicExponent <number> 公開指数 (RSA)。デフォルト: 0x10001
    • hashAlgorithm <string> メッセージダイジェストの名前(RSA-PSS)。
    • mgf1HashAlgorithm <string> MGF1 で使用されるメッセージダイジェストの名前(RSA-PSS)。
    • saltLength <number> 最小ソルト長(バイト単位)(RSA-PSS)。
    • divisorLength <number> q のサイズ(ビット単位)(DSA)。
    • namedCurve <string> 使用する曲線の名前 (EC)。
    • prime <Buffer> 素数パラメータ (DH)。
    • primeLength <number> ビット単位の素数の長さ (DH)。
    • generator <number> カスタムジェネレータ (DH)。デフォルト: 2
    • groupName <string> Diffie-Hellman グループ名 (DH)。crypto.getDiffieHellman() を参照してください。
    • paramEncoding <string> 'named' または 'explicit' でなければなりません (EC)。デフォルト: 'named'
    • publicKeyEncoding <Object> keyObject.export() を参照してください。
    • privateKeyEncoding <Object> keyObject.export() を参照してください。
  • 戻り値: <Object>

指定された type の新しい非対称鍵ペアを生成します。現在、RSA、RSA-PSS、DSA、EC、Ed25519、Ed448、X25519、X448、DH、および ML-DSA1 がサポートされています。

publicKeyEncoding または privateKeyEncoding が指定された場合、この関数は、その結果に対して keyObject.export() が呼び出されたかのように動作します。それ以外の場合、鍵のそれぞれの部分は KeyObject として返されます。

公開鍵をエンコードする際には 'spki' を使用することが推奨されます。秘密鍵をエンコードする際には、強力なパスフレーズと共に 'pkcs8' を使用し、パスフレーズを秘密に保つことが推奨されます。

const {
  generateKeyPairSync,
} = await import('node:crypto');

const {
  publicKey,
  privateKey,
} = generateKeyPairSync('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem',
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret',
  },
});const {
  generateKeyPairSync,
} = require('node:crypto');

const {
  publicKey,
  privateKey,
} = generateKeyPairSync('rsa', {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'spki',
    format: 'pem',
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'pem',
    cipher: 'aes-256-cbc',
    passphrase: 'top secret',
  },
});

戻り値 { publicKey, privateKey } は生成された鍵ペアを表します。PEM エンコーディングが選択された場合、それぞれの鍵は文字列になります。それ以外の場合は、DER としてエンコードされたデータを含むバッファになります。

crypto.generateKeySync(type, options)#

  • type <string> 生成された秘密鍵の意図された用途。現在受け入れられている値は 'hmac''aes' です。
  • options <Object>
    • length <number> 生成する鍵のビット長。
      • type'hmac' の場合、最小値は 8、最大長は 231-1 です。値が 8 の倍数でない場合、生成されたキーは Math.floor(length / 8) に切り捨てられます。
      • type'aes' の場合、長さは 128192、または 256 のいずれかでなければなりません。
  • 戻り値: <KeyObject>

指定された length の新しいランダムな秘密鍵を同期的に生成します。type は、length に対してどの検証が実行されるかを決定します。

const {
  generateKeySync,
} = await import('node:crypto');

const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex'));  // e89..........41econst {
  generateKeySync,
} = require('node:crypto');

const key = generateKeySync('hmac', { length: 512 });
console.log(key.export().toString('hex'));  // e89..........41e

生成された HMAC キーのサイズは、基礎となるハッシュ関数のブロックサイズを超えてはなりません。詳細については crypto.createHmac() を参照してください。

crypto.generatePrime(size[, options], callback)#

size ビットの擬似ランダムな素数を生成します。

options.safetrue の場合、素数は安全素数になります。つまり、(prime - 1) / 2 も素数になります。

options.addoptions.rem パラメータは、例えば Diffie-Hellman のための追加要件を強制するために使用できます。

  • options.addoptions.rem の両方が設定されている場合、素数は prime % add = rem という条件を満たします。
  • options.add のみが設定され、options.safetrue でない場合、素数は prime % add = 1 という条件を満たします。
  • options.add のみが設定され、options.safetrue に設定されている場合、素数は代わりに prime % add = 3 という条件を満たします。これは、options.add > 2 の場合に prime % add = 1 となると、options.safe によって強制される条件と矛盾するため必要です。
  • options.add が与えられていない場合、options.rem は無視されます。

options.addoptions.rem の両方は、ArrayBufferSharedArrayBufferTypedArrayBuffer、または DataView として与えられた場合、ビッグエンディアンシーケンスとしてエンコードされなければなりません。

デフォルトでは、素数は <ArrayBuffer> 内のオクテットのビッグエンディアンシーケンスとしてエンコードされます。bigint オプションが true の場合、<bigint> が提供されます。

素数の size は、素数を生成するのにかかる時間に直接影響します。サイズが大きくなるほど、時間がかかります。私たちは OpenSSL の BN_generate_prime_ex 関数を使用しており、これは生成プロセスを中断する能力を最小限しか制御できないため、過度に大きな素数を生成することは推奨されません。そうするとプロセスが応答しなくなる可能性があります。

crypto.generatePrimeSync(size[, options])#

size ビットの擬似ランダムな素数を生成します。

options.safetrue の場合、素数は安全素数になります。つまり、(prime - 1) / 2 も素数になります。

options.addoptions.rem パラメータは、例えば Diffie-Hellman のための追加要件を強制するために使用できます。

  • options.addoptions.rem の両方が設定されている場合、素数は prime % add = rem という条件を満たします。
  • options.add のみが設定され、options.safetrue でない場合、素数は prime % add = 1 という条件を満たします。
  • options.add のみが設定され、options.safetrue に設定されている場合、素数は代わりに prime % add = 3 という条件を満たします。これは、options.add > 2 の場合に prime % add = 1 となると、options.safe によって強制される条件と矛盾するため必要です。
  • options.add が与えられていない場合、options.rem は無視されます。

options.addoptions.rem の両方は、ArrayBufferSharedArrayBufferTypedArrayBuffer、または DataView として与えられた場合、ビッグエンディアンシーケンスとしてエンコードされなければなりません。

デフォルトでは、素数は <ArrayBuffer> 内のオクテットのビッグエンディアンシーケンスとしてエンコードされます。bigint オプションが true の場合、<bigint> が提供されます。

素数の size は、素数を生成するのにかかる時間に直接影響します。サイズが大きくなるほど、時間がかかります。私たちは OpenSSL の BN_generate_prime_ex 関数を使用しており、これは生成プロセスを中断する能力を最小限しか制御できないため、過度に大きな素数を生成することは推奨されません。そうするとプロセスが応答しなくなる可能性があります。

crypto.getCipherInfo(nameOrNid[, options])#

  • nameOrNid <string> | <number> 問い合わせる暗号の名前または nid。
  • options <Object>
    • keyLength <number> テスト用の鍵長。
    • ivLength <number> テスト用の IV 長。
  • 戻り値: <Object>
    • name <string> 暗号の名前
    • nid <number> 暗号の nid
    • blockSize <number> 暗号のブロックサイズ (バイト単位)。このプロパティは mode'stream' の場合は省略されます。
    • ivLength <number> 期待される、またはデフォルトの初期化ベクトルの長さ (バイト単位)。このプロパティは、暗号が初期化ベクトルを使用しない場合は省略されます。
    • keyLength <number> 期待される、またはデフォルトの鍵長 (バイト単位)。
    • mode <string> 暗号モード。'cbc''ccm''cfb''ctr''ecb''gcm''ocb''ofb''stream''wrap''xts' のいずれか。

指定された暗号に関する情報を返します。

一部の暗号は可変長の鍵と初期化ベクトルを受け入れます。デフォルトでは、crypto.getCipherInfo() メソッドはこれらの暗号のデフォルト値を返します。特定の鍵長または IV 長が特定の暗号で許容されるかどうかをテストするには、keyLength および ivLength オプションを使用します。指定された値が許容されない場合、undefined が返されます。

crypto.getCiphers()#

  • 戻り値: <string[]> サポートされている暗号アルゴリズムの名前を持つ配列。
const {
  getCiphers,
} = await import('node:crypto');

console.log(getCiphers()); // ['aes-128-cbc', 'aes-128-ccm', ...]const {
  getCiphers,
} = require('node:crypto');

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

crypto.getCurves()#

  • 戻り値: <string[]> サポートされている楕円曲線の名前を持つ配列。
const {
  getCurves,
} = await import('node:crypto');

console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]const {
  getCurves,
} = require('node:crypto');

console.log(getCurves()); // ['Oakley-EC2N-3', 'Oakley-EC2N-4', ...]

crypto.getDiffieHellman(groupName)#

事前定義された DiffieHellmanGroup 鍵交換オブジェクトを作成します。サポートされているグループは、DiffieHellmanGroup のドキュメントにリストされています。

返されたオブジェクトは crypto.createDiffieHellman() によって作成されたオブジェクトのインターフェースを模倣しますが、(例えば diffieHellman.setPublicKey() を使って) 鍵を変更することはできません。このメソッドを使用する利点は、当事者が事前にグループモジュラスを生成したり交換したりする必要がなく、プロセッサと通信時間の両方を節約できることです。

例 (共有秘密の取得)

const {
  getDiffieHellman,
} = await import('node:crypto');
const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');

alice.generateKeys();
bob.generateKeys();

const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* aliceSecret and bobSecret should be the same */
console.log(aliceSecret === bobSecret);const {
  getDiffieHellman,
} = require('node:crypto');

const alice = getDiffieHellman('modp14');
const bob = getDiffieHellman('modp14');

alice.generateKeys();
bob.generateKeys();

const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

/* aliceSecret and bobSecret should be the same */
console.log(aliceSecret === bobSecret);

crypto.getFips()#

  • 戻り値: <number> FIPS 準拠の暗号プロバイダが現在使用されている場合に限り 1、それ以外の場合は 0。将来のセマンティックバージョニングのメジャーリリースで、この API の戻り値の型が <boolean> に変更される可能性があります。

crypto.getHashes()#

  • 戻り値: <string[]> 'RSA-SHA256' のような、サポートされているハッシュアルゴリズムの名前の配列。ハッシュアルゴリズムは「ダイジェスト」アルゴリズムとも呼ばれます。
const {
  getHashes,
} = await import('node:crypto');

console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]const {
  getHashes,
} = require('node:crypto');

console.log(getHashes()); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]

crypto.getRandomValues(typedArray)#

crypto.webcrypto.getRandomValues() の便利なエイリアスです。この実装は Web Crypto 仕様に準拠していません。Web 互換のコードを書くには、代わりに crypto.webcrypto.getRandomValues() を使用してください。

crypto.hash(algorithm, data[, options])#

安定性: 1.2 - Release candidate

  • algorithm <string> | <undefined>
  • data <string> | <Buffer> | <TypedArray> | <DataView> data が文字列の場合、ハッシュ化される前に UTF-8 としてエンコードされます。文字列の入力に対して異なる入力エンコーディングが必要な場合、ユーザーは TextEncoder または Buffer.from() を使用して文字列を TypedArray にエンコードし、エンコードされた TypedArray をこの API に渡すことができます。
  • options <Object> | <string>
    • outputEncoding <string> 返されたダイジェストをエンコードするために使用されるエンコーディングデフォルト: 'hex'
    • outputLength <number> 'shake256' などの XOF ハッシュ関数では、outputLength オプションを使用して、希望する出力長をバイト単位で指定できます。
  • 戻り値: <string> | <Buffer>

データのワンショットハッシュダイジェストを作成するためのユーティリティです。すぐに利用可能な少量のデータ(5MB 以下)をハッシュ化する場合、オブジェクトベースの crypto.createHash() よりも高速になることがあります。データが大きい場合やストリーミングされる場合は、引き続き crypto.createHash() を使用することが推奨されます。

algorithm は、プラットフォーム上の OpenSSL のバージョンでサポートされている利用可能なアルゴリズムに依存します。例としては 'sha256''sha512' などがあります。最近の OpenSSL リリースでは、openssl list -digest-algorithms で利用可能なダイジェストアルゴリズムが表示されます。

options が文字列の場合、それは outputEncoding を指定します。

const crypto = require('node:crypto');
const { Buffer } = require('node:buffer');

// Hashing a string and return the result as a hex-encoded string.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));

// Encode a base64-encoded string into a Buffer, hash it and return
// the result as a buffer.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));import crypto from 'node:crypto';
import { Buffer } from 'node:buffer';

// Hashing a string and return the result as a hex-encoded string.
const string = 'Node.js';
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string));

// Encode a base64-encoded string into a Buffer, hash it and return
// the result as a buffer.
const base64 = 'Tm9kZS5qcw==';
// <Buffer 10 b3 49 32 87 f8 31 e8 1a 43 88 11 a1 ff ba 01 f8 ce c4 b7>
console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer'));

crypto.hkdf(digest, ikm, salt, info, keylen, callback)#

  • digest <string> 使用するダイジェストアルゴリズム。
  • ikm <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> 入力キーイングマテリアル。提供する必要がありますが、ゼロ長でもかまいません。
  • salt <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> ソルト値。提供する必要がありますが、ゼロ長でもかまいません。
  • info <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 追加の情報値。提供する必要がありますが、ゼロ長でもかまいません。また、1024バイトを超えることはできません。
  • keylen <number> 生成する鍵の長さ。0 より大きくなければなりません。許容される最大値は、選択されたダイジェスト関数によって生成されるバイト数の 255 倍です(例: sha512 は 64 バイトのハッシュを生成し、最大の HKDF 出力は 16320 バイトになります)。
  • callback <Function>

HKDF は RFC 5869 で定義されている単純な鍵導出関数です。与えられた ikmsaltinfo は、digest と共に使用され、keylen バイトの鍵を導出します。

提供された callback 関数は、2つの引数 errderivedKey で呼び出されます。鍵の導出中にエラーが発生した場合、err が設定されます。それ以外の場合、errnull になります。正常に生成された derivedKey は、<ArrayBuffer> としてコールバックに渡されます。いずれかの入力引数が無効な値または型を指定した場合、エラーがスローされます。

import { Buffer } from 'node:buffer';
const {
  hkdf,
} = await import('node:crypto');

hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
  if (err) throw err;
  console.log(Buffer.from(derivedKey).toString('hex'));  // '24156e2...5391653'
});const {
  hkdf,
} = require('node:crypto');
const { Buffer } = require('node:buffer');

hkdf('sha512', 'key', 'salt', 'info', 64, (err, derivedKey) => {
  if (err) throw err;
  console.log(Buffer.from(derivedKey).toString('hex'));  // '24156e2...5391653'
});

crypto.hkdfSync(digest, ikm, salt, info, keylen)#

  • digest <string> 使用するダイジェストアルゴリズム。
  • ikm <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> 入力キーイングマテリアル。提供する必要がありますが、ゼロ長でもかまいません。
  • salt <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> ソルト値。提供する必要がありますが、ゼロ長でもかまいません。
  • info <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 追加の情報値。提供する必要がありますが、ゼロ長でもかまいません。また、1024バイトを超えることはできません。
  • keylen <number> 生成する鍵の長さ。0 より大きくなければなりません。許容される最大値は、選択されたダイジェスト関数によって生成されるバイト数の 255 倍です(例: sha512 は 64 バイトのハッシュを生成し、最大の HKDF 出力は 16320 バイトになります)。
  • 戻り値: <ArrayBuffer>

RFC 5869 で定義されている同期的な HKDF 鍵導出関数を提供します。与えられた ikmsaltinfo は、digest と共に使用され、keylen バイトの鍵を導出します。

正常に生成された derivedKey は、<ArrayBuffer> として返されます。

いずれかの入力引数が無効な値または型を指定した場合、または派生鍵が生成できない場合、エラーがスローされます。

import { Buffer } from 'node:buffer';
const {
  hkdfSync,
} = await import('node:crypto');

const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex'));  // '24156e2...5391653'const {
  hkdfSync,
} = require('node:crypto');
const { Buffer } = require('node:buffer');

const derivedKey = hkdfSync('sha512', 'key', 'salt', 'info', 64);
console.log(Buffer.from(derivedKey).toString('hex'));  // '24156e2...5391653'

crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)#

非同期のパスワードベース鍵導出関数 2 (PBKDF2) 実装を提供します。digest で指定された選択された HMAC ダイジェストアルゴリズムが、passwordsaltiterations から要求されたバイト長 (keylen) の鍵を導出するために適用されます。

提供された callback 関数は、2つの引数 errderivedKey で呼び出されます。鍵の導出中にエラーが発生した場合、err が設定されます。それ以外の場合、errnull になります。デフォルトでは、正常に生成された derivedKeyBuffer としてコールバックに渡されます。いずれかの入力引数が無効な値または型を指定した場合、エラーがスローされます。

iterations 引数は、できるだけ高い数値に設定する必要があります。イテレーション数が多いほど、派生した鍵はより安全になりますが、完了するまでの時間は長くなります。

salt はできるだけユニークであるべきです。ソルトはランダムで、少なくとも 16 バイト長であることが推奨されます。詳細は NIST SP 800-132 を参照してください。

password または salt に文字列を渡す場合、暗号 APIへの入力として文字列を使用する際の注意点 を考慮してください。

const {
  pbkdf2,
} = await import('node:crypto');

pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
});const {
  pbkdf2,
} = require('node:crypto');

pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
});

サポートされているダイジェスト関数の配列は、crypto.getHashes() を使用して取得できます。

この API は libuv のスレッドプールを使用します。これは一部のアプリケーションで驚くべき、そして否定的なパフォーマンスへの影響を与える可能性があります。詳細については UV_THREADPOOL_SIZE のドキュメントを参照してください。

crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)#

同期的なパスワードベース鍵導出関数 2 (PBKDF2) 実装を提供します。digest で指定された選択された HMAC ダイジェストアルゴリズムが、passwordsaltiterations から要求されたバイト長 (keylen) の鍵を導出するために適用されます。

エラーが発生した場合は Error がスローされます。それ以外の場合、派生した鍵は Buffer として返されます。

iterations 引数は、できるだけ高い数値に設定する必要があります。イテレーション数が多いほど、派生した鍵はより安全になりますが、完了するまでの時間は長くなります。

salt はできるだけユニークであるべきです。ソルトはランダムで、少なくとも 16 バイト長であることが推奨されます。詳細は NIST SP 800-132 を参照してください。

password または salt に文字列を渡す場合、暗号 APIへの入力として文字列を使用する際の注意点 を考慮してください。

const {
  pbkdf2Sync,
} = await import('node:crypto');

const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex'));  // '3745e48...08d59ae'const {
  pbkdf2Sync,
} = require('node:crypto');

const key = pbkdf2Sync('secret', 'salt', 100000, 64, 'sha512');
console.log(key.toString('hex'));  // '3745e48...08d59ae'

サポートされているダイジェスト関数の配列は、crypto.getHashes() を使用して取得できます。

crypto.privateDecrypt(privateKey, buffer)#

privateKeybuffer を復号します。buffer は、以前に対応する公開鍵を使用して、例えば crypto.publicEncrypt() を使って暗号化されたものです。

privateKeyKeyObject でない場合、この関数は privateKeycrypto.createPrivateKey() に渡されたかのように動作します。オブジェクトの場合、padding プロパティを渡すことができます。それ以外の場合、この関数は RSA_PKCS1_OAEP_PADDING を使用します。

crypto.privateDecrypt()crypto.constants.RSA_PKCS1_PADDING を使用するには、OpenSSL が暗黙の拒否 (rsa_pkcs1_implicit_rejection) をサポートしている必要があります。Node.js が使用する OpenSSL のバージョンがこの機能をサポートしていない場合、RSA_PKCS1_PADDING を使用しようとすると失敗します。

crypto.privateEncrypt(privateKey, buffer)#

privateKeybuffer を暗号化します。返されたデータは、対応する公開鍵を使用して、例えば crypto.publicDecrypt() を使って復号できます。

privateKeyKeyObject でない場合、この関数は privateKeycrypto.createPrivateKey() に渡されたかのように動作します。オブジェクトの場合、padding プロパティを渡すことができます。それ以外の場合、この関数は RSA_PKCS1_PADDING を使用します。

crypto.publicDecrypt(key, buffer)#

keybuffer を復号します。buffer は、以前に対応する秘密鍵を使用して、例えば crypto.privateEncrypt() を使って暗号化されたものです。

keyKeyObject でない場合、この関数は keycrypto.createPublicKey() に渡されたかのように動作します。オブジェクトの場合、padding プロパティを渡すことができます。それ以外の場合、この関数は RSA_PKCS1_PADDING を使用します。

RSA 公開鍵は秘密鍵から導出できるため、公開鍵の代わりに秘密鍵を渡すことができます。

crypto.publicEncrypt(key, buffer)#

buffer の内容を key で暗号化し、暗号化された内容を含む新しい Buffer を返します。返されたデータは、対応する秘密鍵を使用して、例えば crypto.privateDecrypt() を使って復号できます。

keyKeyObject でない場合、この関数は keycrypto.createPublicKey() に渡されたかのように動作します。オブジェクトの場合、padding プロパティを渡すことができます。それ以外の場合、この関数は RSA_PKCS1_OAEP_PADDING を使用します。

RSA 公開鍵は秘密鍵から導出できるため、公開鍵の代わりに秘密鍵を渡すことができます。

crypto.randomBytes(size[, callback])#

  • size <number> 生成するバイト数。size2**31 - 1 より大きくすることはできません。
  • callback <Function>
  • 戻り値: callback 関数が提供されない場合は <Buffer>

暗号学的に強力な擬似乱数データを生成します。size 引数は、生成するバイト数を示す数値です。

callback 関数が提供された場合、バイトは非同期に生成され、callback 関数は errbuf の2つの引数で呼び出されます。エラーが発生した場合、errError オブジェクトになります。それ以外の場合は null です。buf 引数は、生成されたバイトを含む Buffer です。

// Asynchronous
const {
  randomBytes,
} = await import('node:crypto');

randomBytes(256, (err, buf) => {
  if (err) throw err;
  console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});// Asynchronous
const {
  randomBytes,
} = require('node:crypto');

randomBytes(256, (err, buf) => {
  if (err) throw err;
  console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
});

callback 関数が提供されない場合、ランダムバイトは同期的に生成され、Buffer として返されます。バイトの生成に問題がある場合はエラーがスローされます。

// Synchronous
const {
  randomBytes,
} = await import('node:crypto');

const buf = randomBytes(256);
console.log(
  `${buf.length} bytes of random data: ${buf.toString('hex')}`);// Synchronous
const {
  randomBytes,
} = require('node:crypto');

const buf = randomBytes(256);
console.log(
  `${buf.length} bytes of random data: ${buf.toString('hex')}`);

crypto.randomBytes() メソッドは、十分なエントロピーが利用可能になるまで完了しません。これは通常、数ミリ秒以上かかることはありません。ランダムバイトの生成が長期間ブロックされる可能性がある唯一の時間は、システム全体のエントロピーがまだ低い起動直後です。

この API は libuv のスレッドプールを使用します。これは一部のアプリケーションで驚くべき、そして否定的なパフォーマンスへの影響を与える可能性があります。詳細については UV_THREADPOOL_SIZE のドキュメントを参照してください。

crypto.randomBytes() の非同期バージョンは、単一のスレッドプールリクエストで実行されます。スレッドプールのタスク長の変動を最小限に抑えるため、クライアントリクエストの処理の一部として大きな randomBytes リクエストを実行する場合は、リクエストを分割してください。

crypto.randomFill(buffer[, offset][, size], callback)#

  • buffer <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必ず指定する必要があります。提供される buffer のサイズは 2**31 - 1 より大きくすることはできません。
  • offset <number> デフォルト: 0
  • size <number> デフォルト: buffer.length - offsetsize2**31 - 1 より大きくすることはできません。
  • callback <Function> function(err, buf) {}

この関数は crypto.randomBytes() に似ていますが、最初の引数が埋められる Buffer である必要があります。また、コールバックを渡す必要があります。

callback 関数が提供されない場合、エラーがスローされます。

import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');

const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});

randomFill(buf, 5, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});

// The above is equivalent to the following:
randomFill(buf, 5, 5, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');

const buf = Buffer.alloc(10);
randomFill(buf, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});

randomFill(buf, 5, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});

// The above is equivalent to the following:
randomFill(buf, 5, 5, (err, buf) => {
  if (err) throw err;
  console.log(buf.toString('hex'));
});

任意の ArrayBufferTypedArray、または DataView インスタンスを buffer として渡すことができます。

これには Float32ArrayFloat64Array のインスタンスが含まれますが、この関数はランダムな浮動小数点数を生成するために使用すべきではありません。結果には +Infinity-InfinityNaN が含まれる可能性があり、配列に有限数のみが含まれている場合でも、それらは一様乱数分布から抽出されたものではなく、意味のある下限も上限もありません。

import { Buffer } from 'node:buffer';
const { randomFill } = await import('node:crypto');

const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
    .toString('hex'));
});

const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
    .toString('hex'));
});

const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf).toString('hex'));
});const { randomFill } = require('node:crypto');
const { Buffer } = require('node:buffer');

const a = new Uint32Array(10);
randomFill(a, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
    .toString('hex'));
});

const b = new DataView(new ArrayBuffer(10));
randomFill(b, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)
    .toString('hex'));
});

const c = new ArrayBuffer(10);
randomFill(c, (err, buf) => {
  if (err) throw err;
  console.log(Buffer.from(buf).toString('hex'));
});

この API は libuv のスレッドプールを使用します。これは一部のアプリケーションで驚くべき、そして否定的なパフォーマンスへの影響を与える可能性があります。詳細については UV_THREADPOOL_SIZE のドキュメントを参照してください。

crypto.randomFill() の非同期バージョンは、単一のスレッドプールリクエストで実行されます。スレッドプールのタスク長の変動を最小限に抑えるため、クライアントリクエストの処理の一部として大きな randomFill リクエストを実行する場合は、リクエストを分割してください。

crypto.randomFillSync(buffer[, offset][, size])#

crypto.randomFill() の同期バージョンです。

import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');

const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));

randomFillSync(buf, 5);
console.log(buf.toString('hex'));

// The above is equivalent to the following:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');

const buf = Buffer.alloc(10);
console.log(randomFillSync(buf).toString('hex'));

randomFillSync(buf, 5);
console.log(buf.toString('hex'));

// The above is equivalent to the following:
randomFillSync(buf, 5, 5);
console.log(buf.toString('hex'));

任意の ArrayBufferTypedArray または DataView インスタンスを buffer として渡すことができます。

import { Buffer } from 'node:buffer';
const { randomFillSync } = await import('node:crypto');

const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
                        a.byteOffset, a.byteLength).toString('hex'));

const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
                        b.byteOffset, b.byteLength).toString('hex'));

const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));const { randomFillSync } = require('node:crypto');
const { Buffer } = require('node:buffer');

const a = new Uint32Array(10);
console.log(Buffer.from(randomFillSync(a).buffer,
                        a.byteOffset, a.byteLength).toString('hex'));

const b = new DataView(new ArrayBuffer(10));
console.log(Buffer.from(randomFillSync(b).buffer,
                        b.byteOffset, b.byteLength).toString('hex'));

const c = new ArrayBuffer(10);
console.log(Buffer.from(randomFillSync(c)).toString('hex'));

crypto.randomInt([min, ]max[, callback])#

  • min <integer> ランダム範囲の開始 (含む)。デフォルト: 0
  • max <integer> ランダム範囲の終了 (含まない)。
  • callback <Function> function(err, n) {}

min <= n < max となるようなランダムな整数 n を返します。この実装はモジュロバイアスを回避します。

範囲 (max - min) は 248 未満でなければなりません。minmax安全な整数でなければなりません。

callback 関数が提供されない場合、ランダムな整数は同期的に生成されます。

// Asynchronous
const {
  randomInt,
} = await import('node:crypto');

randomInt(3, (err, n) => {
  if (err) throw err;
  console.log(`Random number chosen from (0, 1, 2): ${n}`);
});// Asynchronous
const {
  randomInt,
} = require('node:crypto');

randomInt(3, (err, n) => {
  if (err) throw err;
  console.log(`Random number chosen from (0, 1, 2): ${n}`);
});
// Synchronous
const {
  randomInt,
} = await import('node:crypto');

const n = randomInt(3);
console.log(`Random number chosen from (0, 1, 2): ${n}`);// Synchronous
const {
  randomInt,
} = require('node:crypto');

const n = randomInt(3);
console.log(`Random number chosen from (0, 1, 2): ${n}`);
// With `min` argument
const {
  randomInt,
} = await import('node:crypto');

const n = randomInt(1, 7);
console.log(`The dice rolled: ${n}`);// With `min` argument
const {
  randomInt,
} = require('node:crypto');

const n = randomInt(1, 7);
console.log(`The dice rolled: ${n}`);

crypto.randomUUID([options])#

  • options <Object>
    • disableEntropyCache <boolean> デフォルトでは、パフォーマンス向上のため、Node.js は最大128個のランダムなUUIDを生成するのに十分なランダムデータを生成し、キャッシュします。キャッシュを使用せずにUUIDを生成するには、disableEntropyCachetrue に設定します。デフォルト: false
  • 戻り値: <string>

ランダムな RFC 4122 バージョン 4 UUID を生成します。UUID は暗号化擬似乱数生成器を使用して生成されます。

crypto.scrypt(password, salt, keylen[, options], callback)#

非同期の scrypt 実装を提供します。Scrypt は、ブルートフォース攻撃を無駄にするために計算上およびメモリ的に高価になるように設計された、パスワードベースの鍵導出関数です。

salt はできるだけユニークであるべきです。ソルトはランダムで、少なくとも 16 バイト長であることが推奨されます。詳細は NIST SP 800-132 を参照してください。

password または salt に文字列を渡す場合、暗号 APIへの入力として文字列を使用する際の注意点 を考慮してください。

callback 関数は2つの引数、errderivedKey で呼び出されます。err は鍵導出が失敗した場合の例外オブジェクトで、それ以外の場合は null です。derivedKeyBuffer としてコールバックに渡されます。

いずれかの入力引数が無効な値または型を指定した場合、例外がスローされます。

const {
  scrypt,
} = await import('node:crypto');

// Using the factory defaults.
scrypt('password', 'salt', 64, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
});
// Using a custom N parameter. Must be a power of two.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...aa39b34'
});const {
  scrypt,
} = require('node:crypto');

// Using the factory defaults.
scrypt('password', 'salt', 64, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...08d59ae'
});
// Using a custom N parameter. Must be a power of two.
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
  if (err) throw err;
  console.log(derivedKey.toString('hex'));  // '3745e48...aa39b34'
});

crypto.scryptSync(password, salt, keylen[, options])#

  • password <string> | <Buffer> | <TypedArray> | <DataView>
  • salt <string> | <Buffer> | <TypedArray> | <DataView>
  • keylen <number>
  • options <Object>
    • cost <number> CPU/メモリコストパラメータ。1より大きい2のべき乗でなければなりません。デフォルト: 16384
    • blockSize <number> ブロックサイズパラメータ。デフォルト: 8
    • parallelization <number> 並列化パラメータ。デフォルト: 1
    • N <number> cost のエイリアス。両方のうち1つだけを指定できます。
    • r <number> blockSize のエイリアス。両方のうち1つだけを指定できます。
    • p <number> parallelization のエイリアス。両方のうち1つだけを指定できます。
    • maxmem <number> メモリ上限。(約) 128 * N * r > maxmem の場合、エラーになります。デフォルト: 32 * 1024 * 1024
  • 戻り値: <Buffer>

同期的な scrypt 実装を提供します。Scrypt は、ブルートフォース攻撃を無駄にするために計算上およびメモリ的に高価になるように設計された、パスワードベースの鍵導出関数です。

salt はできるだけユニークであるべきです。ソルトはランダムで、少なくとも 16 バイト長であることが推奨されます。詳細は NIST SP 800-132 を参照してください。

password または salt に文字列を渡す場合、暗号 APIへの入力として文字列を使用する際の注意点 を考慮してください。

鍵導出が失敗した場合、例外がスローされます。それ以外の場合、派生キーは Buffer として返されます。

いずれかの入力引数が無効な値または型を指定した場合、例外がスローされます。

const {
  scryptSync,
} = await import('node:crypto');
// Using the factory defaults.

const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex'));  // '3745e48...08d59ae'
// Using a custom N parameter. Must be a power of two.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex'));  // '3745e48...aa39b34'const {
  scryptSync,
} = require('node:crypto');
// Using the factory defaults.

const key1 = scryptSync('password', 'salt', 64);
console.log(key1.toString('hex'));  // '3745e48...08d59ae'
// Using a custom N parameter. Must be a power of two.
const key2 = scryptSync('password', 'salt', 64, { N: 1024 });
console.log(key2.toString('hex'));  // '3745e48...aa39b34'

crypto.secureHeapUsed()#

  • 戻り値: <Object>
    • total <number> --secure-heap=n コマンドラインフラグを使用して指定された、割り当てられたセキュアヒープの合計サイズ。
    • min <number> --secure-heap-min コマンドラインフラグを使用して指定された、セキュアヒープからの最小割り当て。
    • used <number> 現在セキュアヒープから割り当てられている合計バイト数。
    • utilization <number> 割り当てられた合計バイト数に対する used の計算された比率。

crypto.setEngine(engine[, flags])#

一部またはすべての OpenSSL 関数(フラグによって選択)に対して engine をロードして設定します。OpenSSL 3 以降、OpenSSL のカスタムエンジンのサポートは非推奨です。

engine は、ID またはエンジンの共有ライブラリへのパスのいずれかです。

オプションの flags 引数は、デフォルトで ENGINE_METHOD_ALL を使用します。flags は、以下のフラグ(crypto.constants で定義)の1つまたは組み合わせを取るビットフィールドです。

  • crypto.constants.ENGINE_METHOD_RSA
  • crypto.constants.ENGINE_METHOD_DSA
  • crypto.constants.ENGINE_METHOD_DH
  • crypto.constants.ENGINE_METHOD_RAND
  • crypto.constants.ENGINE_METHOD_EC
  • crypto.constants.ENGINE_METHOD_CIPHERS
  • crypto.constants.ENGINE_METHOD_DIGESTS
  • crypto.constants.ENGINE_METHOD_PKEY_METHS
  • crypto.constants.ENGINE_METHOD_PKEY_ASN1_METHS
  • crypto.constants.ENGINE_METHOD_ALL
  • crypto.constants.ENGINE_METHOD_NONE

crypto.setFips(bool)#

  • bool <boolean> FIPS モードを有効にする場合は true

FIPS 対応の Node.js ビルドで FIPS 準拠の暗号プロバイダを有効にします。FIPS モードが利用できない場合はエラーをスローします。

crypto.sign(algorithm, data, key[, callback])#

指定された秘密鍵とアルゴリズムを使用して data の署名を計算し、返します。algorithmnull または undefined の場合、アルゴリズムは鍵のタイプに依存します。

Ed25519、Ed448、ML-DSA の場合、algorithmnull または undefined である必要があります。

keyKeyObject でない場合、この関数は keycrypto.createPrivateKey() に渡されたかのように動作します。オブジェクトの場合、以下の追加プロパティを渡すことができます。

  • dsaEncoding <string> DSA および ECDSA の場合、このオプションは生成される署名の形式を指定します。以下のいずれかになります。

    • 'der' (デフォルト): DER エンコードされた ASN.1 署名構造。(r, s) をエンコードします。
    • 'ieee-p1363': IEEE-P1363 で提案された署名形式 r || s
  • padding <integer> RSA のオプションのパディング値。以下のいずれかです。

    • crypto.constants.RSA_PKCS1_PADDING (デフォルト)
    • crypto.constants.RSA_PKCS1_PSS_PADDING

    RSA_PKCS1_PSS_PADDING は、RFC 4055 のセクション 3.1 で指定されているように、メッセージの署名に使用されるのと同じハッシュ関数を持つ MGF1 を使用します。

  • saltLength <integer> パディングが RSA_PKCS1_PSS_PADDING の場合のソルト長。特別な値 crypto.constants.RSA_PSS_SALTLEN_DIGEST はソルト長をダイジェストサイズに設定し、crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN (デフォルト) はそれを許容される最大値に設定します。

  • context <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Ed448、ML-DSA、SLH-DSA の場合、このオプションは、同じ鍵で異なる目的のために生成された署名を区別するためのオプションのコンテキストを指定します。

callback 関数が提供された場合、この関数は libuv のスレッドプールを使用します。

crypto.subtle#

crypto.webcrypto.subtle の便利なエイリアスです。

crypto.timingSafeEqual(a, b)#

この関数は、指定された ArrayBufferTypedArray、または DataView インスタンスを表す基になるバイトを、定数時間アルゴリズムを使用して比較します。

この関数は、攻撃者が値の1つを推測できるようなタイミング情報を漏洩しません。これは、HMACダイジェストや認証クッキーや capability urls のような秘密の値を比較するのに適しています。

ab は両方とも BufferTypedArray、または DataView でなければならず、同じバイト長でなければなりません。ab のバイト長が異なる場合、エラーがスローされます。

ab の少なくとも一方が、Uint16Array のようにエントリごとに1バイト以上を持つ TypedArray である場合、結果はプラットフォームのバイトオーダーを使用して計算されます。

入力の両方が Float32Array または Float64Array の場合、この関数は浮動小数点数の IEEE 754 エンコーディングのために予期しない結果を返す可能性があります。特に、x === yObject.is(x, y) も、2つの浮動小数点数 xy のバイト表現が等しいことを意味しません。

crypto.timingSafeEqual の使用は、周囲のコードがタイミングセーフであることを保証するものではありません。周囲のコードがタイミングの脆弱性を導入しないように注意する必要があります。

crypto.verify(algorithm, data, key, signature[, callback])#

指定された鍵とアルゴリズムを使用して、data に対する指定された署名を検証します。algorithmnull または undefined の場合、アルゴリズムは鍵のタイプに依存します。

Ed25519、Ed448、ML-DSA の場合、algorithmnull または undefined である必要があります。

keyKeyObject でない場合、この関数は keycrypto.createPublicKey() に渡されたかのように動作します。オブジェクトの場合、以下の追加プロパティを渡すことができます。

  • dsaEncoding <string> DSA および ECDSA の場合、このオプションは署名のフォーマットを指定します。以下のいずれかです。

    • 'der' (デフォルト): DER エンコードされた ASN.1 署名構造。(r, s) をエンコードします。
    • 'ieee-p1363': IEEE-P1363 で提案された署名形式 r || s
  • padding <integer> RSA のオプションのパディング値。以下のいずれかです。

    • crypto.constants.RSA_PKCS1_PADDING (デフォルト)
    • crypto.constants.RSA_PKCS1_PSS_PADDING

    RSA_PKCS1_PSS_PADDING は、RFC 4055 のセクション 3.1 で指定されているように、メッセージの署名に使用されるのと同じハッシュ関数を持つ MGF1 を使用します。

  • saltLength <integer> パディングが RSA_PKCS1_PSS_PADDING の場合のソルト長。特別な値 crypto.constants.RSA_PSS_SALTLEN_DIGEST はソルト長をダイジェストサイズに設定し、crypto.constants.RSA_PSS_SALTLEN_MAX_SIGN (デフォルト) はそれを許容される最大値に設定します。

  • context <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> Ed448、ML-DSA、SLH-DSA の場合、このオプションは、同じ鍵で異なる目的のために生成された署名を区別するためのオプションのコンテキストを指定します。

signature 引数は、data に対して以前に計算された署名です。

公開鍵は秘密鍵から派生できるため、key には秘密鍵または公開鍵を渡すことができます。

callback 関数が提供された場合、この関数は libuv のスレッドプールを使用します。

crypto.webcrypto#

型: <Crypto> Web Crypto API 標準の実装。

詳細は Web Crypto API ドキュメント を参照してください。

注釈#

暗号 API への入力として文字列を使用する#

歴史的な理由から、Node.js が提供する多くの暗号 API は、基になる暗号アルゴリズムがバイトシーケンスで動作する場合でも、入力として文字列を受け入れます。これらのインスタンスには、平文、暗号文、共通鍵、初期化ベクトル、パスフレーズ、ソルト、認証タグ、追加認証データが含まれます。

暗号 API に文字列を渡す際には、以下の要因を考慮してください。

  • すべてのバイトシーケンスが有効な UTF-8 文字列であるわけではありません。したがって、長さ n のバイトシーケンスが文字列から派生した場合、そのエントロピーは通常、ランダムまたは擬似ランダムな n バイトシーケンスのエントロピーよりも低くなります。例えば、どの UTF-8 文字列もバイトシーケンス c0 af にはなりません。秘密鍵は、ほぼ例外なくランダムまたは擬似ランダムなバイトシーケンスであるべきです。

  • 同様に、ランダムまたは擬似ランダムなバイトシーケンスを UTF-8 文字列に変換する際、有効なコードポイントを表さないサブシーケンスは、Unicode 置換文字 (U+FFFD) に置き換えられることがあります。したがって、結果として得られる Unicode 文字列のバイト表現は、文字列が作成された元のバイトシーケンスと等しくない場合があります。

    const original = [0xc0, 0xaf];
    const bytesAsString = Buffer.from(original).toString('utf8');
    const stringAsBytes = Buffer.from(bytesAsString, 'utf8');
    console.log(stringAsBytes);
    // Prints '<Buffer ef bf bd ef bf bd>'. 

    暗号、ハッシュ関数、署名アルゴリズム、鍵導出関数の出力は擬似ランダムなバイトシーケンスであり、Unicode 文字列として使用すべきではありません。

  • 文字列がユーザー入力から取得される場合、一部の Unicode 文字は、異なるバイトシーケンスになる複数の同等の方法で表現できます。例えば、ユーザーのパスフレーズを PBKDF2 や scrypt などの鍵導出関数に渡す場合、鍵導出関数の結果は、文字列が合成文字を使用しているか分解文字を使用しているかによって異なります。Node.js は文字表現を正規化しません。開発者は、ユーザー入力を暗号 API に渡す前に String.prototype.normalize() を使用することを検討すべきです。

レガシーストリーム API (Node.js 0.10 以前)#

Crypto モジュールは、統一された Stream API の概念が存在する前、およびバイナリデータを扱うための Buffer オブジェクトが存在する前に Node.js に追加されました。そのため、多くの crypto クラスには、streams API を実装する他の Node.js クラスには通常見られないメソッド(例: update(), final(), digest())があります。また、多くのメソッドは、デフォルトで Buffer ではなく 'latin1' エンコードされた文字列を受け入れ、返していました。このデフォルトは Node.js v0.8 以降、代わりにデフォルトで Buffer オブジェクトを使用するように変更されました。

脆弱または危険にさらされたアルゴリズムのサポート#

node:crypto モジュールは、すでに危険にさらされており使用が推奨されない一部のアルゴリズムをまだサポートしています。また、API は安全な使用には弱すぎる小さな鍵サイズの暗号やハッシュの使用も許可しています。

ユーザーは、セキュリティ要件に応じて暗号アルゴリズムと鍵サイズを選択することに全責任を負うべきです。

NIST SP 800-131A の推奨事項に基づいています。

  • MD5 と SHA-1 は、デジタル署名など衝突耐性が要求される場面ではもはや受け入れられません。
  • RSA、DSA、DH アルゴリズムで使用される鍵は少なくとも 2048 ビット、ECDSA と ECDH の曲線の鍵は少なくとも 224 ビットであることが、数年間安全に使用するために推奨されます。
  • modp1modp2modp5 の DH グループは、2048 ビット未満の鍵サイズであり、推奨されません。

その他の推奨事項と詳細については、リファレンスを参照してください。

既知の弱点を持ち、実際にはほとんど関係のない一部のアルゴリズムは、デフォルトでは有効になっていないレガシープロバイダを通じてのみ利用可能です。

CCM モード#

CCM はサポートされている AEAD アルゴリズム の1つです。このモードを使用するアプリケーションは、暗号 API を使用する際に特定の制限に従う必要があります。

  • 認証タグの長さは、暗号作成時に authTagLength オプションを設定することで指定する必要があり、4, 6, 8, 10, 12, 14, 16 バイトのいずれかでなければなりません。
  • 初期化ベクトル (nonce) N の長さは、7 から 13 バイトの間でなければなりません (7 ≤ N ≤ 13)。
  • 平文の長さは 2 ** (8 * (15 - N)) バイトに制限されます。
  • 復号時、認証タグは update() を呼び出す前に setAuthTag() を介して設定する必要があります。さもなければ、復号は失敗し、final()RFC 3610 のセクション 2.6 に従ってエラーをスローします。
  • CCM モードで write(data)end(data)pipe() などのストリームメソッドを使用すると、CCM はインスタンスごとに1つ以上のデータチャンクを処理できないため、失敗する可能性があります。
  • 追加認証データ (AAD) を渡す場合、実際のメッセージの長さをバイト単位で setAAD()plaintextLength オプションを介して渡す必要があります。多くの暗号ライブラリは認証タグを暗号文に含めるため、plaintextLength + authTagLength の長さの暗号文を生成します。Node.js は認証タグを含めないため、暗号文の長さは常に plaintextLength です。AAD が使用されない場合はこれは必要ありません。
  • CCM はメッセージ全体を一度に処理するため、update() は正確に一度だけ呼び出す必要があります。
  • update() を呼び出すだけでメッセージの暗号化/復号化に十分ですが、アプリケーションは認証タグを計算または検証するために final() を呼び出す必要があります
import { Buffer } from 'node:buffer';
const {
  createCipheriv,
  createDecipheriv,
  randomBytes,
} = await import('node:crypto');

const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);

const aad = Buffer.from('0123456789', 'hex');

const cipher = createCipheriv('aes-192-ccm', key, nonce, {
  authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
  plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();

// Now transmit { ciphertext, nonce, tag }.

const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
  authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
  plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');

try {
  decipher.final();
} catch (err) {
  throw new Error('Authentication failed!', { cause: err });
}

console.log(receivedPlaintext);const { Buffer } = require('node:buffer');
const {
  createCipheriv,
  createDecipheriv,
  randomBytes,
} = require('node:crypto');

const key = 'keykeykeykeykeykeykeykey';
const nonce = randomBytes(12);

const aad = Buffer.from('0123456789', 'hex');

const cipher = createCipheriv('aes-192-ccm', key, nonce, {
  authTagLength: 16,
});
const plaintext = 'Hello world';
cipher.setAAD(aad, {
  plaintextLength: Buffer.byteLength(plaintext),
});
const ciphertext = cipher.update(plaintext, 'utf8');
cipher.final();
const tag = cipher.getAuthTag();

// Now transmit { ciphertext, nonce, tag }.

const decipher = createDecipheriv('aes-192-ccm', key, nonce, {
  authTagLength: 16,
});
decipher.setAuthTag(tag);
decipher.setAAD(aad, {
  plaintextLength: ciphertext.length,
});
const receivedPlaintext = decipher.update(ciphertext, null, 'utf8');

try {
  decipher.final();
} catch (err) {
  throw new Error('Authentication failed!', { cause: err });
}

console.log(receivedPlaintext);

FIPS モード#

OpenSSL 3 を使用する場合、Node.js は、OpenSSL 3 の FIPS プロバイダなど、適切な OpenSSL 3 プロバイダと使用することで FIPS 140-2 をサポートします。これは、OpenSSL の FIPS README ファイルの指示に従ってインストールできます。

Node.js での FIPS サポートには以下が必要です。

  • 正しくインストールされた OpenSSL 3 FIPS プロバイダ。
  • OpenSSL 3 FIPS モジュール設定ファイル
  • FIPS モジュール設定ファイルを参照する OpenSSL 3 設定ファイル。

Node.js は、FIPS プロバイダを指す OpenSSL 設定ファイルで設定する必要があります。設定ファイルの例は次のようになります。

nodejs_conf = nodejs_init

.include /<absolute path>/fipsmodule.cnf

[nodejs_init]
providers = provider_sect

[provider_sect]
default = default_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
fips = fips_sect

[default_sect]
activate = 1 

ここで、fipsmodule.cnf は FIPS プロバイダのインストール手順から生成された FIPS モジュール設定ファイルです。

openssl fipsinstall 

OPENSSL_CONF 環境変数を設定ファイルを指すように設定し、OPENSSL_MODULES を FIPS プロバイダのダイナミックライブラリの場所に設定します。例:

export OPENSSL_CONF=/<path to configuration file>/nodejs.cnf
export OPENSSL_MODULES=/<path to openssl lib>/ossl-modules 

その後、Node.js で FIPS モードは次のいずれかの方法で有効にできます。

  • --enable-fips または --force-fips コマンドラインフラグを使用して Node.js を起動する。
  • プログラムで crypto.setFips(true) を呼び出す。

オプションで、FIPS モードは OpenSSL 設定ファイルを介して Node.js で有効にできます。例:

nodejs_conf = nodejs_init

.include /<absolute path>/fipsmodule.cnf

[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect

[provider_sect]
default = default_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
fips = fips_sect

[default_sect]
activate = 1

[algorithm_sect]
default_properties = fips=yes 

暗号定数#

crypto.constants によってエクスポートされる以下の定数は、node:cryptonode:tls、および node:https モジュールのさまざまな用途に適用され、一般的に OpenSSL に固有です。

OpenSSL オプション#

詳細は SSL OP フラグのリスト を参照してください。

定数 説明
SSL_OP_ALL OpenSSL 内で複数のバグ回避策を適用します。詳細は https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html を参照してください。
SSL_OP_ALLOW_NO_DHE_KEX OpenSSL に、TLS v1.3 のための非 [EC]DHE ベースの鍵交換モードを許可するよう指示します。
SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION OpenSSL とパッチが適用されていないクライアントまたはサーバーとの間で、レガシーな安全でない再ネゴシエーションを許可します。 https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html を参照してください。
SSL_OP_CIPHER_SERVER_PREFERENCE 暗号を選択する際に、クライアントの優先設定ではなくサーバーの優先設定を使用しようとします。動作はプロトコルバージョンに依存します。 https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html を参照してください。
SSL_OP_CISCO_ANYCONNECT OpenSSL に Cisco の DTLS_BAD_VER のバージョン識別子を使用するよう指示します。
SSL_OP_COOKIE_EXCHANGE OpenSSL にクッキー交換をオンにするよう指示します。
SSL_OP_CRYPTOPRO_TLSEXT_BUG OpenSSL に、cryptopro ドラフトの初期バージョンからのサーバーハロー拡張を追加するよう指示します。
SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS OpenSSL に、OpenSSL 0.9.6d で追加された SSL 3.0/TLS 1.0 の脆弱性回避策を無効にするよう指示します。
SSL_OP_LEGACY_SERVER_CONNECT RI をサポートしないサーバーへの初期接続を許可します。
SSL_OP_NO_COMPRESSION OpenSSL に SSL/TLS 圧縮のサポートを無効にするよう指示します。
SSL_OP_NO_ENCRYPT_THEN_MAC OpenSSL に encrypt-then-MAC を無効にするよう指示します。
SSL_OP_NO_QUERY_MTU
SSL_OP_NO_RENEGOTIATION OpenSSL に再ネゴシエーションを無効にするよう指示します。
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION OpenSSL に、再ネゴシエーションを実行する際には常に新しいセッションを開始するよう指示します。
SSL_OP_NO_SSLv2 OpenSSL に SSL v2 をオフにするよう指示します。
SSL_OP_NO_SSLv3 OpenSSL に SSL v3 をオフにするよう指示します。
SSL_OP_NO_TICKET OpenSSL に RFC4507bis チケットの使用を無効にするよう指示します。
SSL_OP_NO_TLSv1 OpenSSL に TLS v1 をオフにするよう指示します。
SSL_OP_NO_TLSv1_1 OpenSSL に TLS v1.1 をオフにするよう指示します。
SSL_OP_NO_TLSv1_2 OpenSSL に TLS v1.2 をオフにするよう指示します。
SSL_OP_NO_TLSv1_3 OpenSSL に TLS v1.3 をオフにするよう指示します。
SSL_OP_PRIORITIZE_CHACHA OpenSSL サーバーに、クライアントが ChaCha20-Poly1305 を優先する場合に、それを優先するよう指示します。このオプションは、SSL_OP_CIPHER_SERVER_PREFERENCE が有効でない場合は効果がありません。
SSL_OP_TLS_ROLLBACK_BUG OpenSSL にバージョンロールバック攻撃の検出を無効にするよう指示します。

OpenSSL エンジン定数#

定数 説明
ENGINE_METHOD_RSA エンジン使用を RSA に制限します。
ENGINE_METHOD_DSA エンジン使用を DSA に制限します。
ENGINE_METHOD_DH エンジン使用を DH に制限します。
ENGINE_METHOD_RAND エンジン使用を RAND に制限します。
ENGINE_METHOD_EC エンジン使用を EC に制限します。
ENGINE_METHOD_CIPHERS エンジン使用を CIPHERS に制限します。
ENGINE_METHOD_DIGESTS エンジン使用を DIGESTS に制限します。
ENGINE_METHOD_PKEY_METHS エンジン使用を PKEY_METHS に制限します。
ENGINE_METHOD_PKEY_ASN1_METHS エンジン使用を PKEY_ASN1_METHS に制限します。
ENGINE_METHOD_ALL
ENGINE_METHOD_NONE

その他の OpenSSL 定数#

定数 説明
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
RSA_PKCS1_PADDING
RSA_SSLV23_PADDING
RSA_NO_PADDING
RSA_PKCS1_OAEP_PADDING
RSA_X931_PADDING
RSA_PKCS1_PSS_PADDING
RSA_PSS_SALTLEN_DIGEST 署名または検証時に、RSA_PKCS1_PSS_PADDING のソルト長をダイジェストサイズに設定します。
RSA_PSS_SALTLEN_MAX_SIGN データ署名時に、RSA_PKCS1_PSS_PADDING のソルト長を許容される最大値に設定します。
RSA_PSS_SALTLEN_AUTO 署名の検証時に、RSA_PKCS1_PSS_PADDING のソルト長を自動的に決定させます。
POINT_CONVERSION_COMPRESSED
POINT_CONVERSION_UNCOMPRESSED
POINT_CONVERSION_HYBRID

Node.js crypto 定数#

定数 説明
defaultCoreCipherList Node.js が使用する組み込みのデフォルト暗号リストを指定します。
defaultCipherList 現在の Node.js プロセスが使用するアクティブなデフォルト暗号リストを指定します。

脚注

  1. OpenSSL >= 3.5 が必要です 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

  2. OpenSSL >= 3.0 が必要です 2

  3. OpenSSL >= 3.2 が必要です 2 3 4 5 6