Crypto
ソースコード: 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:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
const { createHmac } = require('node:crypto')
const secret = 'abcdefg'
const hash = createHmac('sha256', secret).update('I love cupcakes').digest('hex')
console.log(hash)
// Prints:
// c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
暗号化サポートが利用できないかどうかの判断
Node.js が node:crypto
モジュールのサポートを含めずにビルドされる可能性があります。このような場合、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!')
}
クラス: Certificate
追加: v0.11.8
SPKAC は、Netscape によって最初に実装され、HTML5 のkeygen
要素の一部として正式に規定された証明書署名要求メカニズムです。
\<keygen\>
はHTML 5.2以降非推奨となっており、新しいプロジェクトではこの要素を使用するべきではありません。
node:crypto
モジュールは、SPKAC データを扱うためのCertificate
クラスを提供します。最も一般的な用途は、HTML5 の\<keygen\>
要素によって生成された出力を処理することです。Node.js は内部でOpenSSL の SPKAC 実装を使用しています。
静的メソッド: Certificate.exportChallenge(spkac[, encoding])
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | spkac 引数に ArrayBuffer を使用できるようになりました。spkac 引数のサイズを最大 2**31 - 1 バイトに制限しました。 |
v9.0.0 | 追加: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列のエンコーディング。- 戻り値: <Buffer> 公開鍵とチャレンジを含む
spkac
データ構造のチャレンジコンポーネント。
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Prints: チャレンジをUTF8文字列として出力
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
const challenge = Certificate.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Prints: チャレンジをUTF8文字列として出力
静的メソッド: Certificate.exportPublicKey(spkac[, encoding])
[履歴]
バージョン | 変更 |
---|---|
v15.0.0 | spkac 引数に ArrayBuffer を使用できるようになりました。spkac 引数のサイズを最大 2**31 - 1 バイトに制限しました。 |
v9.0.0 | 追加: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列のエンコーディング。- 戻り値: <Buffer> 公開鍵とチャレンジを含む
spkac
データ構造の公開鍵コンポーネント。
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
const publicKey = Certificate.exportPublicKey(spkac)
console.log(publicKey)
// 出力: 公開鍵を <Buffer ...> として出力
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
const publicKey = Certificate.exportPublicKey(spkac)
console.log(publicKey)
// 出力: 公開鍵を <Buffer ...> として出力
静的メソッド: Certificate.verifySpkac(spkac[, encoding])
[履歴]
バージョン | 変更 |
---|---|
v15.0.0 | spkac 引数に ArrayBuffer を使用できるようになりました。エンコーディングを追加しました。spkac 引数のサイズを最大 2**31 - 1 バイトに制限しました。 |
v9.0.0 | 追加: v9.0.0 |
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列のエンコーディング。- 戻り値: <boolean> 指定された
spkac
データ構造が有効な場合はtrue
、それ以外の場合はfalse
。
import { Buffer } from 'node:buffer'
const { Certificate } = await import('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// 出力: true または false
const { Buffer } = require('node:buffer')
const { Certificate } = require('node:crypto')
const spkac = getSpkacSomehow()
console.log(Certificate.verifySpkac(Buffer.from(spkac)))
// 出力: true または false
レガシー API
レガシーインターフェースとして、以下の例に示すように、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])
追加: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列の エンコーディング。- 戻り値: <Buffer> 公開鍵とチャレンジを含む
spkac
データ構造のチャレンジコンポーネント。
const { Certificate } = await import('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const challenge = cert.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Prints: チャレンジを UTF8 文字列として出力
const { Certificate } = require('node:crypto')
const cert = Certificate()
const spkac = getSpkacSomehow()
const challenge = cert.exportChallenge(spkac)
console.log(challenge.toString('utf8'))
// Prints: チャレンジを UTF8 文字列として出力
certificate.exportPublicKey(spkac[, encoding])
追加: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列の エンコーディング。- 戻り値: <Buffer> 公開鍵とチャレンジを含む
spkac
データ構造の公開鍵コンポーネント。
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])
追加: v0.11.8
spkac
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>spkac
文字列の エンコーディング。- 戻り値: <boolean> 与えられた
spkac
データ構造が有効な場合はtrue
、そうでない場合はfalse
。
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 false
const { 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
クラス: Cipher
追加: v0.1.94
Cipher
クラスのインスタンスは、データを暗号化するために使用されます。このクラスは、次の 2 つの方法で使用できます。
- 可読および書き込み可能な ストリーム として。この場合、暗号化されていない平文データが書き込まれ、可読側で暗号化されたデータが生成されます。
cipher.update()
およびcipher.final()
メソッドを使用して暗号化されたデータを生成します。
crypto.createCipheriv()
メソッドは、Cipher
インスタンスを作成するために使用されます。Cipher
オブジェクトを new
キーワードを使用して直接作成することはできません。
例: Cipher
オブジェクトをストリームとして使用する:
const { scrypt, randomFill, createCipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// キーと IV が揃ったら、暗号を作成して使用できます...
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('いくつかの平文データ')
cipher.end()
})
})
const { scrypt, randomFill, createCipheriv } = require('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
// キーと IV が揃ったら、暗号を作成して使用できます...
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('いくつかの平文データ')
cipher.end()
})
})
例: Cipher
とパイプされたストリームを使用する:
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 = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
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 = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
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 = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
const cipher = createCipheriv(algorithm, key, iv)
let encrypted = cipher.update('いくつかの平文データ', 'utf8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted)
})
})
const { scrypt, randomFill, createCipheriv } = require('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'キーを生成するために使用されるパスワード'
// まず、キーを生成します。キーの長さはアルゴリズムに依存します。
// この場合、aes192 の場合は 24 バイト (192 ビット) です。
scrypt(password, 'salt', 24, (err, key) => {
if (err) throw err
// 次に、ランダムな初期化ベクトルを生成します。
randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err
const cipher = createCipheriv(algorithm, key, iv)
let encrypted = cipher.update('いくつかの平文データ', 'utf8', 'hex')
encrypted += cipher.final('hex')
console.log(encrypted)
})
})
cipher.final([outputEncoding])
追加: v0.1.94
outputEncoding
<string> 返り値のエンコーディング。- 戻り値: <Buffer> | <string> 暗号化された残りのコンテンツ。
outputEncoding
が指定されている場合は文字列が返されます。outputEncoding
が指定されていない場合は、Buffer
が返されます。
cipher.final()
メソッドが呼び出されると、Cipher
オブジェクトはデータの暗号化には使用できなくなります。cipher.final()
を複数回呼び出そうとすると、エラーがスローされます。
cipher.getAuthTag()
追加: v1.0.0
- 戻り値: <Buffer> 認証付き暗号化モード(現在、
GCM
、CCM
、OCB
、およびchacha20-poly1305
がサポートされています)を使用する場合、cipher.getAuthTag()
メソッドは、指定されたデータから計算された認証タグを含むBuffer
を返します。
cipher.getAuthTag()
メソッドは、cipher.final()
メソッドを使用して暗号化が完了した後にのみ呼び出す必要があります。
cipher
インスタンスの作成時に authTagLength
オプションが設定されている場合、この関数は正確に authTagLength
バイトを返します。
cipher.setAAD(buffer[, options])
追加: v1.0.0
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
オプション戻り値: <Cipher> メソッドチェーン用の同じ
Cipher
インスタンス。
認証付き暗号化モード(現在、GCM
、CCM
、OCB
、および chacha20-poly1305
がサポートされています)を使用する場合、cipher.setAAD()
メソッドは、追加認証データ (AAD) 入力パラメータに使用される値を設定します。
plaintextLength
オプションは、GCM
および OCB
ではオプションです。CCM
を使用する場合、plaintextLength
オプションを指定する必要があり、その値は平文の長さ(バイト単位)と一致する必要があります。CCM モードを参照してください。
cipher.setAAD()
メソッドは、cipher.update()
の前に呼び出す必要があります。
cipher.setAutoPadding([autoPadding])
追加: v0.7.1
ブロック暗号アルゴリズムを使用する場合、Cipher
クラスは入力データに適切なブロックサイズへのパディングを自動的に追加します。デフォルトのパディングを無効にするには、cipher.setAutoPadding(false)
を呼び出します。
autoPadding
が false
の場合、入力データ全体の長さは暗号のブロックサイズの倍数である必要があります。そうでない場合、cipher.final()
はエラーをスローします。自動パディングの無効化は、PKCS パディングの代わりに 0x0
を使用するなど、非標準のパディングに役立ちます。
cipher.setAutoPadding()
メソッドは、cipher.final()
の前に呼び出す必要があります。
cipher.update(data[, inputEncoding][, outputEncoding])
[履歴]
バージョン | 変更 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.94 | 追加: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string> データのエンコーディング。outputEncoding
<string> 戻り値のエンコーディング。- 戻り値: <Buffer> | <string>
data
で暗号を更新します。inputEncoding
引数が指定されている場合、data
引数は指定されたエンコーディングを使用する文字列です。inputEncoding
引数が指定されていない場合、data
は Buffer
、TypedArray
、または DataView
である必要があります。data
が Buffer
、TypedArray
、または DataView
の場合、inputEncoding
は無視されます。
outputEncoding
は、暗号化されたデータの出力形式を指定します。outputEncoding
が指定されている場合、指定されたエンコーディングを使用する文字列が返されます。outputEncoding
が提供されていない場合、Buffer
が返されます。
cipher.final()
が呼び出されるまで、cipher.update()
メソッドを新しいデータで複数回呼び出すことができます。cipher.final()
の後に cipher.update()
を呼び出すと、エラーがスローされます。
クラス: Decipher
v0.1.94 で追加
Decipher
クラスのインスタンスは、データの復号化に使用されます。このクラスは、次の 2 つの方法のいずれかで使用できます。
- 可読ストリームと書き込み可能ストリームの両方であるストリームとして使用する場合、暗号化されたプレーンデータが書き込まれ、可読側で復号化されたデータが生成されます。
decipher.update()
メソッドとdecipher.final()
メソッドを使用して、復号化されたデータを生成します。
crypto.createDecipheriv()
メソッドは、Decipher
インスタンスを作成するために使用されます。Decipher
オブジェクトは、new
キーワードを使用して直接作成することはできません。
例: Decipher
オブジェクトをストリームとして使用する:
import { Buffer } from 'node:buffer'
const { scryptSync, createDecipheriv } = await import('node:crypto')
const algorithm = 'aes-192-cbc'
const password = 'キーの生成に使用するパスワード'
// キーの長さはアルゴリズムに依存します。この場合、aes192では、
// 24バイト(192ビット)です。
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
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)
// 出力: some clear text data
})
// 同じアルゴリズム、キー、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 = 'キーの生成に使用するパスワード'
// キーの長さはアルゴリズムに依存します。この場合、aes192では、
// 24バイト(192ビット)です。
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
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)
// 出力: some clear text data
})
// 同じアルゴリズム、キー、IVで暗号化。
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
decipher.write(encrypted, 'hex')
decipher.end()
例: Decipher
とパイプされたストリームを使用する:
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 = 'キーの生成に使用するパスワード'
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
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 = 'キーの生成に使用するパスワード'
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
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 = 'キーの生成に使用するパスワード'
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
const decipher = createDecipheriv(algorithm, key, iv)
// 同じアルゴリズム、キー、IVを使用して暗号化。
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// 出力: some clear text data
const { scryptSync, createDecipheriv } = require('node:crypto')
const { Buffer } = require('node:buffer')
const algorithm = 'aes-192-cbc'
const password = 'キーの生成に使用するパスワード'
// 代わりに非同期の`crypto.scrypt()`を使用してください。
const key = scryptSync(password, 'salt', 24)
// IVは通常、暗号文と一緒に渡されます。
const iv = Buffer.alloc(16, 0) // 初期化ベクトル。
const decipher = createDecipheriv(algorithm, key, iv)
// 同じアルゴリズム、キー、IVを使用して暗号化。
const encrypted = 'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa'
let decrypted = decipher.update(encrypted, 'hex', 'utf8')
decrypted += decipher.final('utf8')
console.log(decrypted)
// 出力: some clear text data
decipher.final([outputEncoding])
Added in: v0.1.94
outputEncoding
<string> 返り値のエンコーディング。- 戻り値: <Buffer> | <string> 残りの復号されたコンテンツ。
outputEncoding
が指定されている場合は、文字列が返されます。outputEncoding
が指定されていない場合は、Buffer
が返されます。
decipher.final()
メソッドが呼び出されると、Decipher
オブジェクトはデータの復号に使用できなくなります。decipher.final()
を複数回呼び出そうとすると、エラーがスローされます。
decipher.setAAD(buffer[, options])
[History]
バージョン | 変更点 |
---|---|
v15.0.0 | buffer 引数は文字列または ArrayBuffer にでき、2 ** 31 - 1 バイト以下に制限されます。 |
v7.2.0 | このメソッドは decipher への参照を返すようになりました。 |
v1.0.0 | Added in: v1.0.0 |
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>options
<Object>stream.transform
オプション- 戻り値: <Decipher> メソッドチェーンのための同じ Decipher。
認証付き暗号化モード(現在 GCM
、CCM
、OCB
、chacha20-poly1305
がサポートされています)を使用する場合、decipher.setAAD()
メソッドは 追加認証データ (AAD) 入力パラメータに使用される値を設定します。
options
引数は GCM
ではオプションです。CCM
を使用する場合は、plaintextLength
オプションを指定する必要があり、その値はバイト単位の暗号文の長さに一致する必要があります。CCM モード を参照してください。
decipher.setAAD()
メソッドは、decipher.update()
の前に呼び出す必要があります。
buffer
として文字列を渡す場合は、暗号化 API への入力として文字列を使用する場合の注意点 を考慮してください。
decipher.setAuthTag(buffer[, encoding])
[履歴]
バージョン | 変更 |
---|---|
v22.0.0, v20.13.0 | decipher の作成時に authTagLength オプションを指定せずに 128 ビット以外の GCM タグ長を使用することは非推奨になりました。 |
v15.0.0 | buffer 引数は、文字列または ArrayBuffer にすることができ、最大 2 ** 31 - 1 バイトに制限されています。 |
v11.0.0 | このメソッドは、GCM タグ長が無効な場合にスローするようになりました。 |
v7.2.0 | このメソッドは decipher への参照を返すようになりました。 |
v1.0.0 | 追加: v1.0.0 |
buffer
<string> | <Buffer> | <ArrayBuffer> | <TypedArray> | <DataView>encoding
<string>buffer
が文字列の場合に使用する文字列エンコーディング。- 戻り値: <Decipher> メソッドチェーンのための同じ Decipher。
認証付き暗号化モード (GCM
, CCM
, OCB
, および chacha20-poly1305
が現在サポートされています) を使用する場合、decipher.setAuthTag()
メソッドは、受信した 認証タグ を渡すために使用されます。タグが提供されない場合、または暗号テキストが改ざんされた場合、decipher.final()
は、認証に失敗したため暗号テキストを破棄する必要があることを示す例外をスローします。NIST SP 800-38D に従ってタグ長が無効であるか、authTagLength
オプションの値と一致しない場合、decipher.setAuthTag()
はエラーをスローします。
decipher.setAuthTag()
メソッドは、CCM
モードの場合は decipher.update()
の前、GCM
および OCB
モードと chacha20-poly1305
の場合は decipher.final()
の前に呼び出す必要があります。decipher.setAuthTag()
は一度しか呼び出すことができません。
認証タグとして文字列を渡す場合は、暗号化 API への入力として文字列を使用する場合の注意事項を考慮してください。
decipher.setAutoPadding([autoPadding])
追加: v0.7.1
autoPadding
<boolean> デフォルト:true
- 戻り値: <Decipher> メソッドチェーンのための同じ Decipher。
データが標準のブロックパディングなしで暗号化されている場合、decipher.setAutoPadding(false)
を呼び出すと、自動パディングが無効になり、decipher.final()
がパディングのチェックと削除を行うのを防ぎます。
自動パディングをオフにするのは、入力データの長さが暗号のブロックサイズの倍数である場合にのみ機能します。
decipher.setAutoPadding()
メソッドは、decipher.final()
の前に呼び出す必要があります。
decipher.update(data[, inputEncoding][, outputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.94 | 追加: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>data
文字列の エンコーディング。outputEncoding
<string> 戻り値の エンコーディング。- 戻り値: <Buffer> | <string>
復号器を data
で更新します。 inputEncoding
引数が与えられた場合、data
引数は指定されたエンコーディングを使用した文字列になります。 inputEncoding
引数が与えられなかった場合、data
は Buffer
である必要があります。 data
が Buffer
の場合、inputEncoding
は無視されます。
outputEncoding
は、暗号化されたデータの出力形式を指定します。 outputEncoding
が指定されている場合、指定されたエンコーディングを使用した文字列が返されます。 outputEncoding
が指定されていない場合は、Buffer
が返されます。
decipher.update()
メソッドは、decipher.final()
が呼び出されるまで、新しいデータで複数回呼び出すことができます。 decipher.final()
の後に decipher.update()
を呼び出すと、エラーが発生します。
基盤となる暗号が認証を実装している場合でも、この関数から返されるプレーンテキストの信頼性と整合性は、この時点では不確実である可能性があります。認証付き暗号化アルゴリズムの場合、認証は通常、アプリケーションが decipher.final()
を呼び出した場合にのみ確立されます。
クラス: DiffieHellman
追加: v0.5.0
DiffieHellman
クラスは、Diffie-Hellman 鍵交換を作成するためのユーティリティです。
DiffieHellman
クラスのインスタンスは、crypto.createDiffieHellman()
関数を使用して作成できます。
import assert from 'node:assert'
const { createDiffieHellman } = await import('node:crypto')
// Aliceの鍵を生成...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// Bobの鍵を生成...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
const bobKey = bob.generateKeys()
// 交換して秘密を生成...
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')
// Aliceの鍵を生成...
const alice = createDiffieHellman(2048)
const aliceKey = alice.generateKeys()
// Bobの鍵を生成...
const bob = createDiffieHellman(alice.getPrime(), alice.getGenerator())
const bobKey = bob.generateKeys()
// 交換して秘密を生成...
const aliceSecret = alice.computeSecret(bobKey)
const bobSecret = bob.computeSecret(aliceKey)
// OK
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'))
diffieHellman.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
追加: v0.5.0
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>otherPublicKey
文字列の エンコーディング。outputEncoding
<string> 戻り値の エンコーディング。- 戻り値: <Buffer> | <string>
otherPublicKey
を相手側の公開鍵として使用して共有秘密を計算し、計算された共有秘密を返します。指定されたキーは、指定された inputEncoding
を使用して解釈され、秘密は指定された outputEncoding
を使用してエンコードされます。inputEncoding
が指定されていない場合、otherPublicKey
は Buffer
、TypedArray
、または DataView
であると想定されます。
outputEncoding
が指定されている場合は文字列が返されます。それ以外の場合は、Buffer
が返されます。
diffieHellman.generateKeys([encoding])
追加: v0.5.0
まだ生成または計算されていない場合、Diffie-Hellman の秘密鍵と公開鍵の値を生成し、指定されたencoding
で公開鍵を返します。この鍵は相手に転送する必要があります。encoding
が提供された場合は文字列が返され、そうでない場合はBuffer
が返されます。
この関数はDH_generate_key()
の薄いラッパーです。特に、秘密鍵が生成または設定された後、この関数を呼び出すと公開鍵のみが更新され、新しい秘密鍵は生成されません。
diffieHellman.getGenerator([encoding])
追加: v0.5.0
指定されたencoding
で Diffie-Hellman ジェネレーターを返します。encoding
が提供された場合は文字列が返され、そうでない場合はBuffer
が返されます。
diffieHellman.getPrime([encoding])
追加: v0.5.0
指定されたencoding
で Diffie-Hellman 素数を返します。encoding
が提供された場合は文字列が返され、そうでない場合はBuffer
が返されます。
diffieHellman.getPrivateKey([encoding])
追加: v0.5.0
指定された encoding
で Diffie-Hellman の秘密鍵を返します。encoding
が指定された場合、文字列が返されます。それ以外の場合は、Buffer
が返されます。
diffieHellman.getPublicKey([encoding])
追加: v0.5.0
指定された encoding
で Diffie-Hellman の公開鍵を返します。encoding
が指定された場合、文字列が返されます。それ以外の場合は、Buffer
が返されます。
diffieHellman.setPrivateKey(privateKey[, encoding])
追加: v0.5.0
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>privateKey
文字列のエンコーディング。
Diffie-Hellman の秘密鍵を設定します。encoding
引数が指定された場合、privateKey
は文字列であると想定されます。encoding
が指定されない場合、privateKey
はBuffer
、TypedArray
、またはDataView
であると想定されます。
この関数は、関連付けられた公開鍵を自動的に計算しません。diffieHellman.setPublicKey()
または diffieHellman.generateKeys()
を使用して、手動で公開鍵を提供するか、自動的に導出することができます。
diffieHellman.setPublicKey(publicKey[, encoding])
追加: v0.5.0
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>publicKey
文字列のエンコーディング。
Diffie-Hellman 公開鍵を設定します。encoding
引数が提供された場合、publicKey
は文字列であることが期待されます。encoding
が提供されない場合、publicKey
はBuffer
、TypedArray
、またはDataView
であることが期待されます。
diffieHellman.verifyError
追加: v0.11.12
DiffieHellman
オブジェクトの初期化中に実行されたチェックから生じた警告やエラーを含むビットフィールド。
このプロパティには、以下の値が有効です(node:constants
モジュールで定義されています)。
DH_CHECK_P_NOT_SAFE_PRIME
DH_CHECK_P_NOT_PRIME
DH_UNABLE_TO_CHECK_GENERATOR
DH_NOT_SUITABLE_GENERATOR
クラス: DiffieHellmanGroup
追加: v0.7.5
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 セクション 3)'modp15'
(3072 ビット、RFC 3526 セクション 4)'modp16'
(4096 ビット、RFC 3526 セクション 5)'modp17'
(6144 ビット、RFC 3526 セクション 6)'modp18'
(8192 ビット、RFC 3526 セクション 7)
以下のグループはまだサポートされていますが、非推奨です(注意点を参照)。
'modp1'
(768 ビット、RFC 2409 セクション 6.1)'modp2'
(1024 ビット、RFC 2409 セクション 6.2)'modp5'
(1536 ビット、RFC 3526 セクション 2)
これらの非推奨グループは、将来の Node.js のバージョンで削除される可能性があります。
クラス: ECDH
追加: v0.11.14
ECDH
クラスは、楕円曲線 Diffie-Hellman (ECDH) 鍵交換を作成するためのユーティリティです。
ECDH
クラスのインスタンスは、crypto.createECDH()
関数を使用して作成できます。
import assert from 'node:assert'
const { createECDH } = await import('node:crypto')
// Aliceの鍵を生成...
const alice = createECDH('secp521r1')
const aliceKey = alice.generateKeys()
// Bobの鍵を生成...
const bob = createECDH('secp521r1')
const bobKey = bob.generateKeys()
// 交換して秘密鍵を生成...
const aliceSecret = alice.computeSecret(bobKey)
const bobSecret = bob.computeSecret(aliceKey)
assert.strictEqual(aliceSecret.toString('hex'), bobSecret.toString('hex'))
// OK
const assert = require('node:assert')
const { createECDH } = require('node:crypto')
// Aliceの鍵を生成...
const alice = createECDH('secp521r1')
const aliceKey = alice.generateKeys()
// Bobの鍵を生成...
const bob = createECDH('secp521r1')
const bobKey = bob.generateKeys()
// 交換して秘密鍵を生成...
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]]])
追加: v10.0.0
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>curve
<string>inputEncoding
<string>key
文字列のエンコーディング。outputEncoding
<string> 戻り値のエンコーディング。format
<string> デフォルト:'uncompressed'
- 戻り値: <Buffer> | <string>
key
と curve
で指定された EC Diffie-Hellman 公開鍵を format
で指定された形式に変換します。format
引数はポイントエンコーディングを指定し、'compressed'
、'uncompressed'
、または 'hybrid'
を指定できます。指定されたキーは指定された inputEncoding
を使用して解釈され、返されたキーは指定された outputEncoding
を使用してエンコードされます。
利用可能な曲線名のリストを取得するには、crypto.getCurves()
を使用してください。最近の OpenSSL リリースでは、openssl ecparam -list_curves
でも、利用可能な各楕円曲線の名前と説明が表示されます。
format
が指定されていない場合、ポイントは 'uncompressed'
形式で返されます。
inputEncoding
が指定されていない場合、key
は Buffer
、TypedArray
、または 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')
// 変換されたキーと非圧縮の公開キーは同じである必要があります
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')
// 変換されたキーと非圧縮の公開キーは同じである必要があります
console.log(uncompressedKey === ecdh.getPublicKey('hex'))
ecdh.computeSecret(otherPublicKey[, inputEncoding][, outputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v10.0.0 | 無効な公開鍵エラーをより適切にサポートするようにエラー形式を変更しました。 |
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.11.14 | v0.11.14 で追加されました。 |
otherPublicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>otherPublicKey
文字列の エンコーディング。outputEncoding
<string> 返り値の エンコーディング。- 戻り値: <Buffer> | <string>
otherPublicKey
を相手の公開鍵として使用して共有秘密鍵を計算し、計算された共有秘密鍵を返します。指定されたキーは、指定されたinputEncoding
を使用して解釈され、返された秘密鍵は、指定されたoutputEncoding
を使用してエンコードされます。inputEncoding
が提供されない場合、otherPublicKey
はBuffer
、TypedArray
、またはDataView
であることが期待されます。
outputEncoding
が与えられた場合、文字列が返されます。それ以外の場合は、Buffer
が返されます。
ecdh.computeSecret
は、otherPublicKey
が楕円曲線外にある場合、ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
エラーをスローします。otherPublicKey
は通常、安全でないネットワーク経由でリモートユーザーから提供されるため、この例外を適切に処理するようにしてください。
ecdh.generateKeys([encoding[, format]])
追加: v0.11.14
EC Diffie-Hellman の秘密鍵と公開鍵の値を生成し、指定されたformat
とencoding
で公開鍵を返します。この鍵は相手に転送する必要があります。
format
引数は点のエンコーディングを指定し、'compressed'
または'uncompressed'
を指定できます。format
が指定されていない場合、点は'uncompressed'
形式で返されます。
encoding
が指定されている場合は文字列が返されます。そうでない場合はBuffer
が返されます。
ecdh.getPrivateKey([encoding])
追加: v0.11.14
encoding
が指定されている場合は文字列が返されます。そうでない場合はBuffer
が返されます。
ecdh.getPublicKey([encoding][, format])
追加: v0.11.14
encoding
<string> 返り値のエンコーディング。format
<string> デフォルト:'uncompressed'
- 戻り値: <Buffer> | <string> 指定された
encoding
およびformat
での EC Diffie-Hellman の公開鍵。
format
引数は点のエンコーディングを指定し、'compressed'
または'uncompressed'
を指定できます。format
が指定されていない場合、点は'uncompressed'
形式で返されます。
encoding
が指定されている場合は文字列が返されます。そうでない場合はBuffer
が返されます。
ecdh.setPrivateKey(privateKey[, encoding])
追加: v0.11.14
privateKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>privateKey
文字列のエンコーディング。
EC Diffie-Hellman の秘密鍵を設定します。encoding
が提供されている場合、privateKey
は文字列であると想定されます。それ以外の場合、privateKey
は Buffer
、TypedArray
、または DataView
であると想定されます。
ECDH
オブジェクトが作成されたときに指定された曲線に対して privateKey
が有効でない場合、エラーがスローされます。秘密鍵を設定すると、関連する公開点(鍵)も生成され、ECDH
オブジェクトに設定されます。
ecdh.setPublicKey(publicKey[, encoding])
追加: v0.11.14
非推奨: v5.2.0 以降
publicKey
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>publicKey
文字列のエンコーディング。
EC Diffie-Hellman の公開鍵を設定します。encoding
が指定されている場合、publicKey
は文字列であると想定されます。それ以外の場合、Buffer
、TypedArray
、または DataView
が想定されます。
ECDH
は共有秘密を計算するために秘密鍵と相手の公開鍵のみを必要とするため、通常、このメソッドを呼び出す理由はありません。通常、ecdh.generateKeys()
または ecdh.setPrivateKey()
のいずれかが呼び出されます。ecdh.setPrivateKey()
メソッドは、設定されている秘密鍵に関連付けられた公開点/鍵を生成しようとします。
例(共有秘密を取得):
const { createECDH, createHash } = await import('node:crypto')
const alice = createECDH('secp256k1')
const bob = createECDH('secp256k1')
// これはアリスの以前の秘密鍵の1つを指定するショートカットの方法です。
// 実際のアプリケーションでこのような予測可能な秘密鍵を使用することは賢明ではありません。
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// ボブは、新しく生成された暗号的に強力な疑似乱数鍵ペアを使用します
bob.generateKeys()
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex')
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex')
// aliceSecret と bobSecret は同じ共有秘密の値である必要があります
console.log(aliceSecret === bobSecret)
const { createECDH, createHash } = require('node:crypto')
const alice = createECDH('secp256k1')
const bob = createECDH('secp256k1')
// これはアリスの以前の秘密鍵の1つを指定するショートカットの方法です。
// 実際のアプリケーションでこのような予測可能な秘密鍵を使用することは賢明ではありません。
alice.setPrivateKey(createHash('sha256').update('alice', 'utf8').digest())
// ボブは、新しく生成された暗号的に強力な疑似乱数鍵ペアを使用します
bob.generateKeys()
const aliceSecret = alice.computeSecret(bob.getPublicKey(), null, 'hex')
const bobSecret = bob.computeSecret(alice.getPublicKey(), null, 'hex')
// aliceSecret と bobSecret は同じ共有秘密の値である必要があります
console.log(aliceSecret === bobSecret)
クラス: Hash
追加バージョン: v0.1.92
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', () => {
// ハッシュストリームによって生成される要素は1つだけです。
const data = hash.read()
if (data) {
console.log(data.toString('hex'))
// 出力:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
}
})
hash.write('some data to hash')
hash.end()
const { createHash } = require('node:crypto')
const hash = createHash('sha256')
hash.on('readable', () => {
// ハッシュストリームによって生成される要素は1つだけです。
const data = hash.read()
if (data) {
console.log(data.toString('hex'))
// 出力:
// 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'))
// 出力:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
const { createHash } = require('node:crypto')
const hash = createHash('sha256')
hash.update('some data to hash')
console.log(hash.digest('hex'))
// 出力:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
hash.copy([options])
追加: v13.1.0
options
<Object>stream.transform
オプション- 戻り値: <Hash>
現在のHash
オブジェクトの内部状態のディープコピーを含む新しいHash
オブジェクトを作成します。
オプションのoptions
引数はストリームの動作を制御します。 'shake256'
などの XOF ハッシュ関数では、outputLength
オプションを使用して、目的の出力長をバイト単位で指定できます。
hash.digest()
メソッドが呼び出された後で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'))
// など
// ローリングハッシュを計算します。
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'))
// など
hash.digest([encoding])
追加: v0.1.92
(hash.update()
メソッドを使用して)ハッシュ化されるように渡されたすべてのデータのダイジェストを計算します。 encoding
が指定されている場合は文字列が返されます。そうでない場合は、Buffer
が返されます。
Hash
オブジェクトは、hash.digest()
メソッドが呼び出された後は再度使用できません。複数回呼び出すとエラーがスローされます。
hash.update(data[, inputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.92 | v0.1.92 で追加されました。 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>data
文字列の エンコーディング。
指定された data
でハッシュの内容を更新します。エンコーディングは inputEncoding
で指定します。encoding
が提供されず、data
が文字列の場合、'utf8'
のエンコーディングが適用されます。data
が Buffer
、TypedArray
、または DataView
の場合、inputEncoding
は無視されます。
ストリームとして新しいデータが来るたびに、これを複数回呼び出すことができます。
クラス: Hmac
追加: v0.1.94
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', () => {
// ハッシュ ストリームによって生成されるのは 1 つの要素のみです。
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// 出力:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
}
})
hmac.write('some data to hash')
hmac.end()
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.on('readable', () => {
// ハッシュ ストリームによって生成されるのは 1 つの要素のみです。
const data = hmac.read()
if (data) {
console.log(data.toString('hex'))
// 出力:
// 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'))
// 出力:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
const { createHmac } = require('node:crypto')
const hmac = createHmac('sha256', 'a secret')
hmac.update('some data to hash')
console.log(hmac.digest('hex'))
// 出力:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
hmac.digest([encoding])
Added in: v0.1.94
hmac.update()
を使用して渡されたすべてのデータの HMAC ダイジェストを計算します。encoding
が指定されている場合は文字列が返されます。それ以外の場合は Buffer
が返されます。
Hmac
オブジェクトは、hmac.digest()
が呼び出された後は再度使用できません。hmac.digest()
を複数回呼び出すとエラーがスローされます。
hmac.update(data[, inputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.94 | Added in: v0.1.94 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>data
文字列のエンコーディング。
与えられた data
で Hmac
のコンテンツを更新します。data
のエンコーディングは inputEncoding
で与えられます。encoding
が提供されず、data
が文字列である場合、'utf8'
のエンコーディングが強制されます。data
が Buffer
、TypedArray
、または DataView
の場合、inputEncoding
は無視されます。
これはストリーミングされるため、新しいデータで何度も呼び出すことができます。
クラス: KeyObject
[履歴]
バージョン | 変更点 |
---|---|
v14.5.0, v12.19.0 | このクラスのインスタンスは、postMessage を使用してワーカー スレッドに渡せるようになりました。 |
v11.13.0 | このクラスがエクスポートされるようになりました。 |
v11.6.0 | Added in: v11.6.0 |
Node.js は、対称キーまたは非対称キーを表すために KeyObject
クラスを使用し、各種類のキーは異なる関数を公開します。crypto.createSecretKey()
、crypto.createPublicKey()
および crypto.createPrivateKey()
メソッドは、KeyObject
インスタンスを作成するために使用されます。KeyObject
オブジェクトは、new
キーワードを使用して直接作成することはできません。
ほとんどのアプリケーションでは、セキュリティ機能が向上しているため、キーを文字列または Buffer
として渡す代わりに、新しい KeyObject
API を使用することを検討する必要があります。
KeyObject
インスタンスは、postMessage()
を介して他のスレッドに渡すことができます。受信側はクローンされた KeyObject
を取得し、KeyObject
は transferList
引数にリストする必要はありません。
静的メソッド: KeyObject.from(key)
追加: v15.0.0
key
<CryptoKey>- 戻り値: <KeyObject>
例: 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
[履歴]
バージョン | 変更点 |
---|---|
v16.9.0 | RSA-PSS キーのRSASSA-PSS-params シーケンスパラメータを公開。 |
v15.7.0 | 追加: v15.7.0 |
- <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
シーケンスが含まれている場合、hashAlgorithm
、mgf1HashAlgorithm
、およびsaltLength
プロパティが設定されます。
他のキーの詳細が、追加の属性を使用してこの API 経由で公開される可能性があります。
keyObject.asymmetricKeyType
[履歴]
バージョン | 変更点 |
---|---|
v13.9.0, v12.17.0 | 'dh' のサポートが追加されました。 |
v12.0.0 | 'rsa-pss' のサポートが追加されました。 |
v12.0.0 | このプロパティは、認識されないタイプの KeyObject インスタンスに対して、アボートする代わりに undefined を返すようになりました。 |
v12.0.0 | 'x25519' および 'x448' のサポートが追加されました。 |
v12.0.0 | 'ed25519' および 'ed448' のサポートが追加されました。 |
v11.6.0 | v11.6.0 で追加されました。 |
非対称キーの場合、このプロパティはキーのタイプを表します。サポートされているキータイプは次のとおりです。
'rsa'
(OID 1.2.840.113549.1.1.1)'rsa-pss'
(OID 1.2.840.113549.1.1.10)'dsa'
(OID 1.2.840.10040.4.1)'ec'
(OID 1.2.840.10045.2.1)'x25519'
(OID 1.3.101.110)'x448'
(OID 1.3.101.111)'ed25519'
(OID 1.3.101.112)'ed448'
(OID 1.3.101.113)'dh'
(OID 1.2.840.113549.1.3.1)
このプロパティは、認識されない KeyObject
タイプおよび対称キーの場合は undefined
です。
keyObject.equals(otherKeyObject)
追加: v17.7.0, v16.15.0
otherKeyObject
: <KeyObject>keyObject
と比較するKeyObject
。- 戻り値: <boolean>
キーのタイプ、値、およびパラメーターが完全に同じであるかどうかによって、true
または false
を返します。このメソッドは 定数時間 ではありません。
keyObject.export([options])
[履歴]
バージョン | 変更点 |
---|---|
v15.9.0 | 'jwk' 形式のサポートが追加されました。 |
v11.6.0 | v11.6.0 で追加されました。 |
対称キーの場合、次のエンコードオプションを使用できます。
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 パスワードベース暗号化を使用して、指定されたcipher
およびpassphrase
で暗号化されます。passphrase
: <string> | <Buffer> 暗号化に使用するパスフレーズ。cipher
を参照してください。
結果のタイプは、選択したエンコード形式によって異なります。PEM の場合、結果は文字列になり、DER の場合、DER としてエンコードされたデータを含むバッファになります。JWK の場合、オブジェクトになります。
JWK エンコード形式が選択された場合、他のすべてのエンコードオプションは無視されます。
PKCS#1、SEC1、および PKCS#8 タイプのキーは、cipher
オプションと format
オプションの組み合わせを使用することで暗号化できます。PKCS#8 type
は、cipher
を指定することにより、任意の format
で任意のキーアルゴリズム (RSA、EC、または DH) を暗号化するために使用できます。PKCS#1 および SEC1 は、PEM format
が使用されている場合に cipher
を指定することによってのみ暗号化できます。最大の互換性を得るには、暗号化された秘密キーには PKCS#8 を使用してください。PKCS#8 は独自の暗号化メカニズムを定義しているため、PKCS#8 キーを暗号化する場合、PEM レベルの暗号化はサポートされていません。PKCS#8 暗号化については RFC 5208 を、PKCS#1 および SEC1 暗号化については RFC 1421 を参照してください。
keyObject.symmetricKeySize
追加: v11.6.0
秘密鍵の場合、このプロパティは鍵のサイズをバイト単位で表します。このプロパティは、非対称鍵の場合は undefined
になります。
keyObject.toCryptoKey(algorithm, extractable, keyUsages)
追加: v23.0.0
algorithm
: <AlgorithmIdentifier> | <RsaHashedImportParams> | <EcKeyImportParams> | <HmacImportParams>extractable
: <boolean>keyUsages
: <string[]> 鍵の利用 を参照してください。戻り値: <CryptoKey>
KeyObject
インスタンスを CryptoKey
に変換します。
keyObject.type
追加: v11.6.0
この KeyObject
の型に応じて、このプロパティは、秘密 (対称) 鍵の場合は 'secret'
、公開 (非対称) 鍵の場合は 'public'
、秘密 (非対称) 鍵の場合は 'private'
のいずれかになります。
クラス: Sign
追加: v0.1.92
Sign
クラスは、署名を生成するためのユーティリティです。次の 2 つの方法のいずれかで使用できます。
- 書き込み可能な ストリーム として、署名するデータが書き込まれ、
sign.sign()
メソッドを使用して署名を生成して返すか、 sign.update()
およびsign.sign()
メソッドを使用して署名を生成します。
crypto.createSign()
メソッドは、Sign
インスタンスを作成するために使用されます。引数は、使用するハッシュ関数の文字列名です。Sign
オブジェクトは、new
キーワードを使用して直接作成することはできません。
例: ストリームとして Sign
および Verify
オブジェクトを使用する場合:
const { generateKeyPairSync, createSign, createVerify } = await import('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
})
const sign = createSign('SHA256')
sign.write('署名するデータ')
sign.end()
const signature = sign.sign(privateKey, 'hex')
const verify = createVerify('SHA256')
verify.write('署名するデータ')
verify.end()
console.log(verify.verify(publicKey, signature, 'hex'))
// Prints: true
const { generateKeyPairSync, createSign, createVerify } = require('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'sect239k1',
})
const sign = createSign('SHA256')
sign.write('署名するデータ')
sign.end()
const signature = sign.sign(privateKey, 'hex')
const verify = createVerify('SHA256')
verify.write('署名するデータ')
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('署名するデータ')
sign.end()
const signature = sign.sign(privateKey)
const verify = createVerify('SHA256')
verify.update('署名するデータ')
verify.end()
console.log(verify.verify(publicKey, signature))
// Prints: true
const { generateKeyPairSync, createSign, createVerify } = require('node:crypto')
const { privateKey, publicKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
})
const sign = createSign('SHA256')
sign.update('署名するデータ')
sign.end()
const signature = sign.sign(privateKey)
const verify = createVerify('SHA256')
verify.update('署名するデータ')
verify.end()
console.log(verify.verify(publicKey, signature))
// Prints: true
sign.sign(privateKey[, outputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | privateKey が ArrayBuffer および CryptoKey でも可能になりました。 |
v13.2.0, v12.16.0 | この関数は IEEE-P1363 DSA および ECDSA 署名をサポートするようになりました。 |
v12.0.0 | この関数は RSA-PSS キーをサポートするようになりました。 |
v11.6.0 | この関数はキーオブジェクトをサポートするようになりました。 |
v8.0.0 | RSASSA-PSS および追加オプションのサポートが追加されました。 |
v0.1.92 | 追加: v0.1.92 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>outputEncoding
<string> 返り値の エンコーディング。- 戻り値: <Buffer> | <string>
sign.update()
または sign.write()
を使用して渡されたすべてのデータに対して署名を計算します。
privateKey
が KeyObject
でない場合、この関数は privateKey
が crypto.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 を使用します。ただし、RFC 4055 のセクション 3.3 に準拠して、キーの一部として 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])
[履歴]
バージョン | 変更点 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.92 | v0.1.92 で追加されました。 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>data
文字列の エンコーディング。
指定された data
で Sign
の内容を更新します。そのエンコーディングは inputEncoding
で指定します。 encoding
が指定されておらず、data
が文字列の場合、'utf8'
のエンコーディングが適用されます。 data
が Buffer
、TypedArray
、または DataView
の場合、inputEncoding
は無視されます。
これはストリームとして新しいデータが供給されるため、複数回呼び出すことができます。
クラス: Verify
追加: v0.1.92
Verify
クラスは、署名を検証するためのユーティリティです。次の 2 つの方法のいずれかで使用できます。
- 書き込み可能な ストリーム として使用し、書き込まれたデータが提供された署名に対して検証される、または
verify.update()
およびverify.verify()
メソッドを使用して、署名を検証する。
crypto.createVerify()
メソッドは、Verify
インスタンスを作成するために使用されます。 Verify
オブジェクトを new
キーワードを使用して直接作成することはできません。
例については、Sign
を参照してください。
verify.update(data[, inputEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v6.0.0 | デフォルトの inputEncoding が binary から utf8 に変更されました。 |
v0.1.92 | v0.1.92 で追加されました。 |
data
<string> | <Buffer> | <TypedArray> | <DataView>inputEncoding
<string>data
文字列の エンコーディング。
指定された data
で Verify
の内容を更新します。そのエンコーディングは inputEncoding
で指定します。 inputEncoding
が指定されておらず、data
が文字列の場合、'utf8'
のエンコーディングが適用されます。 data
が Buffer
、TypedArray
、または DataView
の場合、inputEncoding
は無視されます。
これはストリームとして新しいデータが供給されるため、複数回呼び出すことができます。
verify.verify(object, signature[, signatureEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | object が ArrayBuffer および CryptoKey にもなり得ます。 |
v13.2.0, v12.16.0 | この関数が IEEE-P1363 DSA および ECDSA 署名をサポートするようになりました。 |
v12.0.0 | この関数が RSA-PSS 鍵をサポートするようになりました。 |
v11.7.0 | 鍵が秘密鍵にもなり得ます。 |
v8.0.0 | RSASSA-PSS および追加オプションのサポートが追加されました。 |
v0.1.92 | v0.1.92 で追加されました。 |
object
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>戻り値: <boolean> データと公開鍵の署名の有効性に応じて
true
またはfalse
。
指定された object
と signature
を使用して、提供されたデータを検証します。
object
が KeyObject
でない場合、この関数は object
が crypto.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 を使用します。ただし、RFC 4055 の 3.3 節に準拠して、MGF1 ハッシュ関数がキーの一部として指定されている場合は除きます。
saltLength
<integer> パディングがRSA_PKCS1_PSS_PADDING
の場合のソルト長。特殊値crypto.constants.RSA_PSS_SALTLEN_DIGEST
はソルト長をダイジェストサイズに設定し、crypto.constants.RSA_PSS_SALTLEN_AUTO
(デフォルト) は自動的に決定されるようにします。
signature
引数は、signatureEncoding
でデータに対して以前に計算された署名です。signatureEncoding
が指定されている場合、signature
は文字列であると予想されます。それ以外の場合、signature
は Buffer
、TypedArray
、または DataView
であると予想されます。
verify
オブジェクトは、verify.verify()
が呼び出された後は再利用できません。verify.verify()
を複数回呼び出すと、エラーがスローされます。
公開鍵は秘密鍵から派生できるため、公開鍵の代わりに秘密鍵を渡すことができます。
クラス: X509Certificate
追加バージョン: v15.6.0
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)
追加バージョン: v15.6.0
buffer
<string> | <TypedArray> | <Buffer> | <DataView> PEM または DER エンコードされた X509 証明書。
x509.ca
追加バージョン: v15.6.0
- タイプ: <boolean> これが認証局(CA)証明書である場合は
true
になります。
x509.checkEmail(email[, options])
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | subject オプションのデフォルトが'default' になりました。 |
v17.5.0, v16.15.0 | subject オプションを'default' に設定できるようになりました。 |
v17.5.0, v16.14.1 | wildcards 、partialWildcards 、multiLabelWildcards 、およびsingleLabelSubdomains オプションは効果がなかったため削除されました。 |
v15.6.0 | 追加バージョン: v15.6.0 |
email
<string>options
<Object>subject
<string>'default'
,'always'
、または'never'
。デフォルト:'default'
。
- 戻り値: <string> | <undefined> 証明書が一致する場合は
email
を返し、一致しない場合はundefined
を返します。
証明書が指定されたメールアドレスと一致するかどうかを確認します。
'subject'
オプションが未定義または'default'
に設定されている場合、証明書のサブジェクトは、サブジェクト代替名拡張が存在しないか、メールアドレスが含まれていない場合にのみ考慮されます。
'subject'
オプションが'always'
に設定されている場合、およびサブジェクト代替名拡張が存在しないか、一致するメールアドレスが含まれていない場合は、証明書のサブジェクトが考慮されます。
'subject'
オプションが'never'
に設定されている場合、証明書にサブジェクト代替名が含まれていない場合でも、証明書のサブジェクトは決して考慮されません。
x509.checkHost(name[, options])
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | subject オプションのデフォルトが'default' になりました。 |
v17.5.0, v16.15.0 | subject オプションに'default' を設定できるようになりました。 |
v15.6.0 | v15.6.0 で追加されました。 |
name
<string>options
<Object>戻り値: <string> | <undefined>
name
に一致するサブジェクト名を返します。name
に一致するサブジェクト名がない場合はundefined
を返します。
証明書が指定されたホスト名に一致するかどうかをチェックします。
証明書が指定されたホスト名に一致する場合、一致するサブジェクト名が返されます。返される名前は完全一致 (例: foo.example.com
) か、ワイルドカードを含む場合があります (例: *.example.com
)。ホスト名の比較は大文字と小文字を区別しないため、返されるサブジェクト名は、大文字と小文字の区別において、指定された name
と異なる場合があります。
'subject'
オプションが未定義または'default'
に設定されている場合、サブジェクト代替名拡張が存在しないか、DNS 名が含まれていない場合にのみ、証明書のサブジェクトが考慮されます。この動作は、RFC 2818 ("HTTP Over TLS") と一貫しています。
'subject'
オプションが 'always'
に設定され、サブジェクト代替名拡張が存在しないか、一致する DNS 名が含まれていない場合、証明書のサブジェクトが考慮されます。
'subject'
オプションが 'never'
に設定されている場合、証明書にサブジェクト代替名が含まれていない場合でも、証明書のサブジェクトは考慮されません。
x509.checkIP(ip)
[履歴]
バージョン | 変更点 |
---|---|
v17.5.0, v16.14.1 | options 引数は効果がなかったため削除されました。 |
v15.6.0 | v15.6.0 で追加されました。 |
ip
<string>- 戻り値: <string> | <undefined> 証明書が一致する場合は
ip
を返し、一致しない場合はundefined
を返します。
証明書が指定された IP アドレス(IPv4 または IPv6)と一致するかどうかを確認します。
RFC 5280 iPAddress
サブジェクト代替名のみが考慮され、それらは指定された ip
アドレスと完全に一致する必要があります。その他のサブジェクト代替名と証明書のサブジェクトフィールドは無視されます。
x509.checkIssued(otherCert)
追加: v15.6.0
otherCert
<X509Certificate>- 戻り値: <boolean>
この証明書が指定された otherCert
によって発行されたかどうかを確認します。
x509.checkPrivateKey(privateKey)
追加: v15.6.0
privateKey
<KeyObject> 秘密鍵。- 戻り値: <boolean>
この証明書の公開鍵が、指定された秘密鍵と一致するかどうかを確認します。
x509.extKeyUsage
追加: v15.6.0
- 型: <string[]>
この証明書の拡張キー使用法を詳しく説明する配列。
x509.fingerprint
追加: v15.6.0
- 型: <string>
この証明書の SHA-1 フィンガープリント。
SHA-1 は暗号学的に破られており、SHA-1 のセキュリティは証明書の署名に一般的に使用されるアルゴリズムよりも著しく低いため、代わりに x509.fingerprint256
を使用することを検討してください。
x509.fingerprint256
追加: v15.6.0
- 型: <string>
この証明書の SHA-256 指紋。
x509.fingerprint512
追加: v17.2.0, v16.14.0
- 型: <string>
この証明書の SHA-512 指紋。
SHA-256 指紋の計算は通常より高速であり、SHA-512 指紋の半分程度のサイズであるため、x509.fingerprint256
の方が良い選択肢となる可能性があります。SHA-512 は一般的にセキュリティレベルが高いと考えられますが、SHA-256 のセキュリティは、証明書の署名によく使用されるほとんどのアルゴリズムと同等です。
x509.infoAccess
[履歴]
バージョン | 変更点 |
---|---|
v17.3.1, v16.13.2 | CVE-2021-44532 への対応として、この文字列の一部が JSON 文字列リテラルとしてエンコードされる場合があります。 |
v15.6.0 | 追加: v15.6.0 |
- 型: <string>
証明書の認証局情報アクセス拡張のテキスト表現。
これは、アクセス記述の改行区切りリストです。各行は、アクセス方法とアクセス場所の種類で始まり、コロンとアクセス場所に関連付けられた値が続きます。
アクセス方法とアクセス場所の種類を示すプレフィックスの後、各行の残りの部分は、値が JSON 文字列リテラルであることを示すために引用符で囲まれる場合があります。後方互換性のため、Node.js は曖昧さを避ける必要がある場合にのみ、このプロパティ内で JSON 文字列リテラルを使用します。サードパーティのコードは、両方の可能なエントリ形式を処理できるように準備する必要があります。
x509.issuer
追加: v15.6.0
- 型: <string>
この証明書に含まれる発行者の識別情報。
x509.issuerCertificate
追加: v15.9.0
- タイプ: <X509Certificate>
発行者の証明書、または発行者の証明書が利用できない場合は undefined
。
x509.publicKey
追加: v15.6.0
- タイプ: <KeyObject>
この証明書の公開鍵 <KeyObject>。
x509.raw
追加: v15.6.0
- タイプ: <Buffer>
この証明書の DER エンコーディングを含む Buffer
。
x509.serialNumber
追加: v15.6.0
- タイプ: <string>
この証明書のシリアル番号。
シリアル番号は認証局によって割り当てられ、証明書を一意に識別するものではありません。代わりに、一意の識別子として x509.fingerprint256
を使用することを検討してください。
x509.subject
追加: v15.6.0
- タイプ: <string>
この証明書の完全なサブジェクト。
x509.subjectAltName
[履歴]
バージョン | 変更点 |
---|---|
v17.3.1, v16.13.2 | CVE-2021-44532 への対応として、この文字列の一部が JSON 文字列リテラルとしてエンコードされる場合があります。 |
v15.6.0 | 追加: v15.6.0 |
- タイプ: <string>
この証明書に指定されたサブジェクトの代替名。
これは、サブジェクトの代替名のカンマ区切りのリストです。各エントリは、サブジェクトの代替名の種類を識別する文字列で始まり、コロンとエントリに関連付けられた値が続きます。
以前のバージョンの Node.js では、このプロパティを 2 文字のシーケンス ', '
で分割しても安全であると誤って想定していました (CVE-2021-44532 を参照)。ただし、悪意のある証明書と正当な証明書の両方で、文字列として表現した場合にこのシーケンスを含むサブジェクトの代替名を含めることができます。
エントリの種類を示すプレフィックスの後、各エントリの残りの部分は、値が JSON 文字列リテラルであることを示すために引用符で囲まれている場合があります。下位互換性のために、Node.js は曖昧さを避けるために必要な場合にのみ、このプロパティ内で JSON 文字列リテラルを使用します。サードパーティのコードは、両方の可能なエントリ形式を処理できるように準備する必要があります。
x509.toJSON()
追加: v15.6.0
- 型: <string>
X509 証明書の標準的な JSON エンコーディングはありません。toJSON()
メソッドは、PEM エンコードされた証明書を含む文字列を返します。
x509.toLegacyObject()
追加: v15.6.0
- 型: <Object>
レガシーな証明書オブジェクトエンコーディングを使用して、この証明書に関する情報を返します。
x509.toString()
追加: v15.6.0
- 型: <string>
PEM エンコードされた証明書を返します。
x509.validFrom
追加: v15.6.0
- 型: <string>
この証明書が有効になる日時。
x509.validFromDate
追加: v23.0.0
- 型: <Date>
この証明書が有効になる日時をDate
オブジェクトでカプセル化したもの。
x509.validTo
追加: v15.6.0
- 型: <string>
この証明書が有効期限切れになる日時。
x509.validToDate
追加: v23.0.0
- 型: <Date>
この証明書が有効期限切れになる日時をDate
オブジェクトでカプセル化したもの。
x509.verify(publicKey)
追加: v15.6.0
publicKey
<KeyObject> 公開鍵。- 戻り値: <boolean>
この証明書が与えられた公開鍵で署名されたことを検証します。証明書に対する他の検証チェックは行いません。
node:crypto
モジュールのメソッドとプロパティ
crypto.checkPrime(candidate[, options], callback)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.8.0 | v15.8.0 で追加 |
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> 任意の長さのビッグエンディアンオクテットのシーケンスとしてエンコードされた、素数の候補。options
<Object>checks
<number> 実行するミラー・ラビン確率的素数判定の反復回数。値が0
(ゼロ) の場合、ランダムな入力に対して最大 2 の偽陽性率を生成するチェック数が使用されます。チェック数を選択する際には注意が必要です。詳細については、OpenSSL のBN_is_prime_ex
関数のnchecks
オプションのドキュメントを参照してください。デフォルト:0
callback
<Function>
candidate
の素数性をチェックします。
crypto.checkPrimeSync(candidate[, options])
追加: v15.8.0
candidate
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint> 任意の長さのビッグエンディアンオクテットのシーケンスとしてエンコードされた、ありうる素数。options
<Object>checks
<number> 実行するミラーラビン確率的素数性反復の数。値が0
(ゼロ) の場合、ランダム入力に対して最大 2 の偽陽性率を生成するチェック数が使用されます。チェック数を選択する際には注意が必要です。詳細については、OpenSSL ドキュメントのBN_is_prime_ex
関数のnchecks
オプションを参照してください。 デフォルト:0
戻り値: <boolean>
candidate
が0.25 ** options.checks
未満のエラー確率を持つ素数の場合はtrue
。
candidate
の素数性を確認します。
crypto.constants
追加: v6.3.0
暗号化およびセキュリティ関連操作によく使用される定数を含むオブジェクト。暗号定数 で現在定義されている特定の定数について説明します。
crypto.createCipheriv(algorithm, key, iv[, options])
[履歴]
バージョン | 変更 |
---|---|
v17.9.0, v16.17.0 | chacha20-poly1305 暗号を使用する場合、authTagLength オプションはオプションになり、デフォルトで 16 バイトになります。 |
v15.0.0 | パスワードと iv 引数は ArrayBuffer にすることができ、それぞれ最大 2 ** 31 - 1 バイトに制限されます。 |
v11.6.0 | key 引数はKeyObject にできるようになりました。 |
v11.2.0, v10.17.0 | 暗号chacha20-poly1305 (ChaCha20-Poly1305 の IETF バリアント)がサポートされるようになりました。 |
v10.10.0 | OCB モードの暗号がサポートされるようになりました。 |
v10.2.0 | authTagLength オプションを使用して、GCM モードでより短い認証タグを生成できるようになり、デフォルトは 16 バイトになりました。 |
v9.9.0 | 初期化ベクトルを必要としない暗号の場合、iv パラメーターがnull になる場合があります。 |
v0.1.94 | v0.1.94 で追加されました |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object>stream.transform
オプション- 戻り値: <Cipher>
指定されたalgorithm
、key
、および初期化ベクトル(iv
)を使用して、Cipher
オブジェクトを作成して返します。
options
引数はストリームの動作を制御し、CCM または OCB モード(例:'aes-128-ccm'
)の暗号が使用されている場合を除き、オプションです。その場合、authTagLength
オプションは必須であり、認証タグの長さをバイト単位で指定します。 CCM モードを参照してください。 GCM モードでは、authTagLength
オプションは必須ではありませんが、getAuthTag()
によって返される認証タグの長さを設定するために使用でき、デフォルトは 16 バイトです。 chacha20-poly1305
の場合、authTagLength
オプションのデフォルトは 16 バイトです。
algorithm
は OpenSSL に依存しており、例として'aes192'
などがあります。 最近の OpenSSL リリースでは、openssl list -cipher-algorithms
で利用可能な暗号アルゴリズムが表示されます。
key
はalgorithm
で使用される生の鍵であり、iv
は初期化ベクトルです。 両方の引数は'utf8'
エンコードされた文字列、Buffer、TypedArray
、またはDataView
である必要があります。 key
は、オプションでsecret
型のKeyObject
にすることができます。 暗号に初期化ベクトルが必要ない場合、iv
はnull
になる可能性があります。
key
またはiv
に文字列を渡す場合は、暗号化 API への入力として文字列を使用する場合の注意点を考慮してください。
初期化ベクトルは予測不可能で一意である必要があります。理想的には、暗号論的にランダムになります。それらは秘密である必要はありません。IV は通常、暗号化されていない暗号文メッセージに追加されるだけです。何かが予測不可能で一意である必要があり、秘密である必要がないというのは矛盾しているように聞こえるかもしれませんが、攻撃者は特定の IV がどうなるかを事前に予測できないはずであることを覚えておいてください。
crypto.createDecipheriv(algorithm, key, iv[, options])
[履歴]
バージョン | 変更点 |
---|---|
v17.9.0, v16.17.0 | chacha20-poly1305 暗号を使用する場合、authTagLength オプションがオプションになり、デフォルトは 16 バイトになりました。 |
v11.6.0 | key 引数がKeyObject になりました。 |
v11.2.0, v10.17.0 | 暗号chacha20-poly1305 (ChaCha20-Poly1305 の IETF バリアント)がサポートされるようになりました。 |
v10.10.0 | OCB モードの暗号がサポートされるようになりました。 |
v10.2.0 | authTagLength オプションを使用して、受け入れられる GCM 認証タグの長さを制限できるようになりました。 |
v9.9.0 | 初期化ベクトルを必要としない暗号の場合、iv パラメータがnull になるようになりました。 |
v0.1.94 | v0.1.94 で追加。 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>iv
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <null>options
<Object>stream.transform
オプション- 戻り値: <Decipher>
指定されたalgorithm
、key
、および初期化ベクトル(iv
)を使用するDecipher
オブジェクトを作成して返します。
options
引数はストリームの動作を制御し、CCM または OCB モード(例:'aes-128-ccm'
)で暗号が使用される場合を除き、オプションです。その場合、authTagLength
オプションが必要であり、CCM モードを参照して、認証タグの長さをバイト単位で指定します。 AES-GCM およびchacha20-poly1305
の場合、authTagLength
オプションのデフォルトは 16 バイトであり、異なる長さを使用する場合は異なる値に設定する必要があります。
algorithm
は OpenSSL に依存しており、例として'aes192'
などがあります。最近の OpenSSL リリースでは、openssl list -cipher-algorithms
で利用可能な暗号アルゴリズムが表示されます。
key
はalgorithm
で使用される生のキーであり、iv
は初期化ベクトルです。両方の引数は、'utf8'
エンコードされた文字列、Buffer、TypedArray
、またはDataView
である必要があります。 key
は、オプションでタイプsecret
のKeyObject
にすることができます。暗号が初期化ベクトルを必要としない場合、iv
はnull
になる可能性があります。
key
またはiv
に文字列を渡す場合は、暗号化 API への入力として文字列を使用する場合の注意点を考慮してください。
初期化ベクトルは、予測不可能で一意である必要があり、理想的には、暗号的にランダムになります。それらは秘密である必要はありません。IV は通常、暗号化されていない暗号文メッセージに追加されるだけです。何かが予測不可能で一意である必要があるが、秘密である必要はないというのは矛盾しているように聞こえるかもしれません。攻撃者が与えられた IV がどうなるかを事前に予測できないことを覚えておいてください。
crypto.createDiffieHellman(prime[, primeEncoding][, generator][, generatorEncoding])
[履歴]
バージョン | 変更点 |
---|---|
v8.0.0 | prime 引数に TypedArray または DataView を指定できるようになりました。 |
v8.0.0 | prime 引数に Uint8Array を指定できるようになりました。 |
v6.0.0 | エンコーディングパラメーターのデフォルトが binary から utf8 に変更されました。 |
v0.11.12 | v0.11.12 で追加。 |
prime
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>primeEncoding
<string>prime
文字列のエンコーディング。generator
<number> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> デフォルト:2
generatorEncoding
<string>generator
文字列のエンコーディング。- 戻り値: <DiffieHellman>
指定された prime
とオプションの特定の generator
を使用して DiffieHellman
鍵交換オブジェクトを作成します。
generator
引数には、数値、文字列、または Buffer
を指定できます。generator
が指定されていない場合は、値 2
が使用されます。
primeEncoding
が指定されている場合、prime
は文字列であることが期待されます。それ以外の場合は、Buffer
、TypedArray
、または DataView
が期待されます。
generatorEncoding
が指定されている場合、generator
は文字列であることが期待されます。それ以外の場合は、数値、Buffer
、TypedArray
、または DataView
が期待されます。
crypto.createDiffieHellman(primeLength[, generator])
Added in: v0.5.0
primeLength
<number>generator
<number> Default:2
- Returns: <DiffieHellman>
DiffieHellman
鍵交換オブジェクトを作成し、オプションの特定の数値generator
を使用してprimeLength
ビットの素数を生成します。generator
が指定されていない場合は、値2
が使用されます。
crypto.createDiffieHellmanGroup(name)
Added in: v0.9.3
name
<string>- Returns: <DiffieHellmanGroup>
crypto.getDiffieHellman()
のエイリアスです。
crypto.createECDH(curveName)
Added in: v0.11.14
curveName
文字列で指定された定義済みの曲線を使用して、楕円曲線 Diffie-Hellman(ECDH
)鍵交換オブジェクトを作成します。利用可能な曲線名のリストを取得するには、crypto.getCurves()
を使用します。最近の OpenSSL リリースでは、openssl ecparam -list_curves
も、利用可能な各楕円曲線の名前と説明を表示します。
crypto.createHash(algorithm[, options])
[History]
Version | Changes |
---|---|
v12.8.0 | outputLength オプションが XOF ハッシュ関数に追加されました。 |
v0.1.92 | Added in: v0.1.92 |
algorithm
<string>options
<Object>stream.transform
options- Returns: <Hash>
指定された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', () => {
// ハッシュストリームによって生成される要素は1つだけです。
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', () => {
// ハッシュストリームによって生成される要素は1つだけです。
const data = input.read()
if (data) hash.update(data)
else {
console.log(`${hash.digest('hex')} ${filename}`)
}
})
crypto.createHmac(algorithm, key[, options])
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | キーは ArrayBuffer または CryptoKey でも可能になりました。encoding オプションが追加されました。キーは 2 ** 32 - 1 バイトを超えることはできません。 |
v11.6.0 | key 引数が KeyObject になりました。 |
v0.1.94 | v0.1.94 で追加されました。 |
algorithm
<string>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>options
<Object>stream.transform
オプションencoding
<string>key
が文字列の場合に使用する文字列エンコーディング。
戻り値: <Hmac>
指定された algorithm
と key
を使用する 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', () => {
// ハッシュストリームによって生成される要素は 1 つだけです。
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', () => {
// ハッシュストリームによって生成される要素は 1 つだけです。
const data = input.read()
if (data) hmac.update(data)
else {
console.log(`${hmac.digest('hex')} ${filename}`)
}
})
crypto.createPrivateKey(key)
[履歴]
バージョン | 変更点 |
---|---|
v15.12.0 | キーは JWK オブジェクトにもできます。 |
v15.0.0 | キーは ArrayBuffer にもできます。encoding オプションが追加されました。キーには 2 ** 32 - 1 バイトを超えることはできません。 |
v11.6.0 | v11.6.0 で追加されました。 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> PEM、DER、または JWK 形式のキーマテリアル。format
: <string>'pem'
、'der'
、または'jwk'
である必要があります。デフォルト:'pem'
。type
: <string>'pkcs1'
、'pkcs8'
、または'sec1'
である必要があります。このオプションはformat
が'der'
の場合にのみ必要で、それ以外の場合は無視されます。passphrase
: <string> | <Buffer> 復号に使用するパスフレーズ。encoding
: <string>key
が文字列の場合に使用する文字列エンコーディング。
戻り値: <KeyObject>
秘密鍵を含む新しいキーオブジェクトを作成して返します。key
が文字列または Buffer
の場合、format
は 'pem'
であると想定されます。それ以外の場合、key
は上記のようなプロパティを持つオブジェクトである必要があります。
秘密鍵が暗号化されている場合は、passphrase
を指定する必要があります。パスフレーズの長さは 1024 バイトに制限されています。
crypto.createPublicKey(key)
[履歴]
バージョン | 変更点 |
---|---|
v15.12.0 | key は JWK オブジェクトでも構いません。 |
v15.0.0 | key は ArrayBuffer でも構いません。encoding オプションが追加されました。key は 2 ** 32 - 1 バイトを超えることはできません。 |
v11.13.0 | key 引数は、型が private の KeyObject でも構いません。 |
v11.7.0 | key 引数は、秘密鍵でも構いません。 |
v11.6.0 | 追加: v11.6.0 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
: <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <Object> PEM、DER、または JWK 形式のキーマテリアル。format
: <string>'pem'
、'der'
、または'jwk'
である必要があります。デフォルト:'pem'
。type
: <string>'pkcs1'
または'spki'
である必要があります。このオプションは、format
が'der'
の場合にのみ必須であり、それ以外の場合は無視されます。encoding
<string>key
が文字列の場合に使用する文字列エンコーディング。
戻り値: <KeyObject>
公開鍵を含む新しいキーオブジェクトを作成して返します。key
が文字列または Buffer
の場合、format
は 'pem'
であると想定されます。key
が型 'private'
の KeyObject
である場合、公開鍵は指定された秘密鍵から派生します。それ以外の場合、key
は上記のプロパティを持つオブジェクトである必要があります。
形式が 'pem'
の場合、'key'
は X.509 証明書である場合もあります。
公開鍵は秘密鍵から派生できるため、公開鍵の代わりに秘密鍵を渡すことができます。その場合、この関数は crypto.createPrivateKey()
が呼び出されたかのように動作しますが、返される KeyObject
の型は 'public'
になり、返される KeyObject
から秘密鍵を抽出することはできません。同様に、型 'private'
の KeyObject
が指定された場合、型 'public'
の新しい KeyObject
が返され、返されたオブジェクトから秘密鍵を抽出することは不可能になります。
crypto.createSecretKey(key[, encoding])
[History]
Version | Changes |
---|---|
v18.8.0, v16.18.0 | The key can now be zero-length. |
v15.0.0 | The key can also be an ArrayBuffer or string. The encoding argument was added. The key cannot contain more than 2 ** 32 - 1 bytes. |
v11.6.0 | Added in: v11.6.0 |
key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>encoding
<string>key
が文字列の場合の文字列エンコーディング。- 戻り値: <KeyObject>
対称暗号化または Hmac
用の秘密鍵を含む新しいキーオブジェクトを作成して返します。
crypto.createSign(algorithm[, options])
Added in: v0.1.92
algorithm
<string>options
<Object>stream.Writable
のオプション- 戻り値: <Sign>
指定された algorithm
を使用する Sign
オブジェクトを作成して返します。利用可能なダイジェストアルゴリズムの名前を取得するには、crypto.getHashes()
を使用してください。オプションの options
引数は stream.Writable
の動作を制御します。
場合によっては、ダイジェストアルゴリズムの代わりに 'RSA-SHA256'
などの署名アルゴリズムの名前を使用して Sign
インスタンスを作成できます。これは対応するダイジェストアルゴリズムを使用します。これは 'ecdsa-with-SHA256'
などのすべての署名アルゴリズムで機能するわけではないため、常にダイジェストアルゴリズム名を使用するのが最適です。
crypto.createVerify(algorithm[, options])
追加: v0.1.92
algorithm
<string>options
<Object>stream.Writable
オプション- 戻り値: <Verify>
指定されたアルゴリズムを使用する Verify
オブジェクトを作成して返します。利用可能な署名アルゴリズムの名前の配列を取得するには、crypto.getHashes()
を使用します。オプションの options
引数は stream.Writable
の動作を制御します。
場合によっては、ダイジェストアルゴリズムではなく、'RSA-SHA256'
のような署名アルゴリズムの名前を使用して Verify
インスタンスを作成できます。これにより、対応するダイジェストアルゴリズムが使用されます。これは、'ecdsa-with-SHA256'
のようなすべての署名アルゴリズムで機能するわけではないため、常にダイジェストアルゴリズム名を使用するのが最適です。
crypto.diffieHellman(options)
追加: v13.9.0, v12.17.0
options
: <Object>privateKey
: <KeyObject>publicKey
: <KeyObject>
戻り値: <Buffer>
privateKey
と publicKey
に基づいて Diffie-Hellman 秘密を計算します。両方のキーは同じ asymmetricKeyType
を持つ必要があり、それは 'dh'
(Diffie-Hellman 用)、'ec'
、'x448'
、または 'x25519'
(ECDH 用) のいずれかである必要があります。
crypto.fips
追加: v6.0.0
非推奨: v10.0.0
FIPS 準拠の暗号プロバイダーが現在使用されているかどうかを確認および制御するためのプロパティ。true に設定するには、Node.js の FIPS ビルドが必要です。
このプロパティは非推奨です。代わりに crypto.setFips()
および crypto.getFips()
を使用してください。
crypto.generateKey(type, options, callback)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなくERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.0.0 | v15.0.0 で追加 |
type
: <string> 生成された秘密鍵の意図された使用法。現在、受け入れられる値は'hmac'
と'aes'
です。options
: <Object>length
: <number> 生成する鍵のビット長。これは 0 より大きい値でなければなりません。type
が'hmac'
の場合、最小値は 8 で、最大長は 2-1 です。値が 8 の倍数でない場合、生成された鍵はMath.floor(length / 8)
に切り捨てられます。type
が'aes'
の場合、長さは128
、192
、または256
のいずれかでなければなりません。
callback
: <Function>err
: <Error>key
: <KeyObject>
指定された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)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v16.10.0 | RSA-PSS キーペアの RSASSA-PSS-params シーケンスパラメータを定義する機能を追加しました。 |
v13.9.0, v12.17.0 | Diffie-Hellman のサポートを追加しました。 |
v12.0.0 | RSA-PSS キーペアのサポートを追加しました。 |
v12.0.0 | X25519 および X448 キーペアを生成する機能を追加しました。 |
v12.0.0 | Ed25519 および Ed448 キーペアを生成する機能を追加しました。 |
v11.6.0 | エンコーディングが指定されていない場合、generateKeyPair および generateKeyPairSync 関数はキーオブジェクトを生成するようになりました。 |
v10.12.0 | v10.12.0 で追加されました。 |
type
: <string>'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
, または'dh'
である必要があります。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()
を参照してください。
callback
: <Function>err
: <Error>publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
指定された 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) => {
// エラーを処理し、生成されたキーペアを使用します。
}
)
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) => {
// エラーを処理し、生成されたキーペアを使用します。
}
)
完了すると、callback
は err
が undefined
に設定され、publicKey
/ privateKey
が生成されたキーペアを表して呼び出されます。
このメソッドが util.promisify()
されたバージョンとして呼び出された場合、publicKey
および privateKey
プロパティを持つ Object
の Promise
を返します。
crypto.generateKeyPairSync(type, options)
[履歴]
バージョン | 変更点 |
---|---|
v16.10.0 | RSA-PSS キーペアの RSASSA-PSS-params シーケンスパラメータを定義する機能を追加。 |
v13.9.0, v12.17.0 | Diffie-Hellman のサポートを追加。 |
v12.0.0 | RSA-PSS キーペアのサポートを追加。 |
v12.0.0 | X25519 および X448 キーペアを生成する機能を追加。 |
v12.0.0 | Ed25519 および Ed448 キーペアを生成する機能を追加。 |
v11.6.0 | エンコーディングが指定されていない場合、generateKeyPair および generateKeyPairSync 関数がキーオブジェクトを生成するようになりました。 |
v10.12.0 | v10.12.0 で追加されました。 |
type
: <string>'rsa'
,'rsa-pss'
,'dsa'
,'ec'
,'ed25519'
,'ed448'
,'x25519'
,'x448'
, または'dh'
である必要があります。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>
publicKey
: <string> | <Buffer> | <KeyObject>privateKey
: <string> | <Buffer> | <KeyObject>
指定された type
の新しい非対称キーペアを生成します。現在、RSA、RSA-PSS、DSA、EC、Ed25519、Ed448、X25519、X448、および DH がサポートされています。
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)
追加: v15.0.0
type
: <string> 生成される秘密鍵の意図された使用法。現在受け入れられる値は、'hmac'
と'aes'
です。options
: <Object>length
: <number> 生成する鍵のビット長。type
が'hmac'
の場合、最小値は 8 で、最大長は 2-1 です。値が 8 の倍数でない場合、生成される鍵はMath.floor(length / 8)
に切り捨てられます。type
が'aes'
の場合、長さは128
、192
、または256
のいずれかでなければなりません。
戻り値: <KeyObject>
指定された length
の新しいランダムな秘密鍵を同期的に生成します。type
は、length
に対して実行される検証を決定します。
const { generateKeySync } = await import('node:crypto')
const key = generateKeySync('hmac', { length: 512 })
console.log(key.export().toString('hex')) // e89..........41e
const { 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]])
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.8.0 | 追加: v15.8.0 |
size
<number> 生成する素数のサイズ(ビット単位)。options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> デフォルト:false
。bigint
<boolean>true
の場合、生成された素数はbigint
として返されます。
callback
<Function>err
<Error>prime
<ArrayBuffer> | <bigint>
size
ビットの擬似乱数素数を生成します。
options.safe
が true
の場合、素数は安全な素数になります。つまり、(素数 - 1) / 2
も素数になります。
options.add
および options.rem
パラメーターを使用して、Diffie-Hellman などの追加要件を強制できます。
options.add
とoptions.rem
の両方が設定されている場合、素数は素数 % add = rem
という条件を満たします。options.add
のみが設定され、options.safe
がtrue
でない場合、素数は素数 % add = 1
という条件を満たします。options.add
のみが設定され、options.safe
がtrue
に設定されている場合、素数は代わりに素数 % add = 3
という条件を満たします。これは、options.add > 2
の場合、素数 % add = 1
がoptions.safe
によって強制される条件と矛盾するため、必要です。options.add
が指定されていない場合、options.rem
は無視されます。
ArrayBuffer
、SharedArrayBuffer
、TypedArray
、Buffer
、または DataView
として指定された場合、options.add
と options.rem
の両方をビッグエンディアンシーケンスとしてエンコードする必要があります。
デフォルトでは、素数は <ArrayBuffer> 内のオクテットのビッグエンディアンシーケンスとしてエンコードされます。bigint
オプションが true
の場合、<bigint> が提供されます。
crypto.generatePrimeSync(size[, options])
追加: v15.8.0
size
<number> 生成する素数のサイズ(ビット単位)。options
<Object>add
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>rem
<ArrayBuffer> | <SharedArrayBuffer> | <TypedArray> | <Buffer> | <DataView> | <bigint>safe
<boolean> デフォルト:false
。bigint
<boolean>true
の場合、生成された素数はbigint
として返されます。
戻り値: <ArrayBuffer> | <bigint>
size
ビットの疑似乱数素数を生成します。
options.safe
が true
の場合、素数は安全な素数、つまり (prime - 1) / 2
も素数になります。
options.add
および options.rem
パラメータを使用して、追加の要件を強制できます。例えば、Diffie-Hellman の場合:
options.add
とoptions.rem
の両方が設定されている場合、素数はprime % add = rem
の条件を満たします。options.add
のみが設定され、options.safe
がtrue
でない場合、素数はprime % add = 1
の条件を満たします。options.add
のみが設定され、options.safe
がtrue
に設定されている場合、素数は代わりにprime % add = 3
の条件を満たします。 これは、options.add > 2
の場合、prime % add = 1
がoptions.safe
によって強制される条件と矛盾するため必要です。options.add
が指定されていない場合、options.rem
は無視されます。
options.add
および options.rem
は、ArrayBuffer
、SharedArrayBuffer
、TypedArray
、Buffer
、または DataView
として指定された場合、ビッグエンディアンシーケンスとしてエンコードされる必要があります。
デフォルトでは、素数は <ArrayBuffer> 内のオクテットのビッグエンディアンシーケンスとしてエンコードされます。bigint
オプションが true
の場合、<bigint> が提供されます。
crypto.getCipherInfo(nameOrNid[, options])
Added in: v15.0.0
nameOrNid
: <string> | <number> クエリ対象の暗号の名前または NID。options
: <Object>- Returns: <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()
追加: v0.9.3
- 戻り値:
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()
追加: v2.3.0
- 戻り値:
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)
追加: v0.7.5
groupName
string
- 戻り値:
DiffieHellmanGroup
定義済みの 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とbobSecretは同じであるべきです */
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とbobSecretは同じであるべきです */
console.log(aliceSecret === bobSecret)
crypto.getFips()
追加: v10.0.0
- 戻り値: <number> FIPS 準拠の暗号化プロバイダーが現在使用されている場合にのみ
1
、それ以外の場合は0
を返します。将来の semver メジャーリリースでは、この API の戻り値の型が<boolean>に変更される可能性があります。
crypto.getHashes()
追加: v0.9.3
- 戻り値: <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)
追加: v17.4.0
typedArray
<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>- 戻り値: <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer>
typedArray
を返します。
crypto.webcrypto.getRandomValues()
の便利なエイリアスです。この実装は Web Crypto 仕様に準拠していません。Web 互換のコードを記述するには、代わりにcrypto.webcrypto.getRandomValues()
を使用してください。
crypto.hash(algorithm, data[, outputEncoding])
追加: v21.7.0, v20.12.0
algorithm
<string> | <undefined>data
<string> | <Buffer> | <TypedArray> | <DataView>data
が文字列の場合、ハッシュ化される前に UTF-8 としてエンコードされます。文字列入力に対して異なる入力エンコーディングが必要な場合は、TextEncoder
またはBuffer.from()
のいずれかを使用して文字列をTypedArray
にエンコードし、エンコードされたTypedArray
をこの API に渡すことができます。outputEncoding
<string> | <undefined> 返されるダイジェストをエンコードするために使用される エンコーディング。デフォルト:'hex'
。- 戻り値: <string> | <Buffer>
データのワンショットハッシュダイジェストを作成するためのユーティリティです。比較的小さい量のデータ(<= 5MB)がすぐに利用できる場合、オブジェクトベースの crypto.createHash()
よりも高速になる可能性があります。データが大きい場合やストリーミングされる場合は、代わりに crypto.createHash()
を使用することをお勧めします。
algorithm
は、プラットフォーム上の OpenSSL のバージョンでサポートされている利用可能なアルゴリズムに依存します。例として、'sha256'
、'sha512'
などがあります。OpenSSL の最近のリリースでは、openssl list -digest-algorithms
が利用可能なダイジェストアルゴリズムを表示します。
例:
const crypto = require('node:crypto')
const { Buffer } = require('node:buffer')
// 文字列をハッシュ化し、結果を16進エンコードされた文字列として返します。
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// base64エンコードされた文字列を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'
// 文字列をハッシュ化し、結果を16進エンコードされた文字列として返します。
const string = 'Node.js'
// 10b3493287f831e81a438811a1ffba01f8cec4b7
console.log(crypto.hash('sha1', string))
// base64エンコードされた文字列を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)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v18.8.0, v16.18.0 | 入力キーマテリアルがゼロ長でもよくなりました。 |
v15.0.0 | v15.0.0 で追加されました |
digest
<string> 使用するダイジェストアルゴリズム。ikm
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> 入力キーマテリアル。必須ですが、ゼロ長でも構いません。salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> ソルト値。必須ですが、ゼロ長でも構いません。info
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 追加の info 値。必須ですが、ゼロ長でも構いません。また、1024 バイトを超えることはできません。keylen
<number> 生成するキーの長さ。0 より大きい必要があります。許容される最大値は、選択したダイジェスト関数が生成するバイト数の255
倍です(例:sha512
は 64 バイトのハッシュを生成するため、最大 HKDF 出力は 16320 バイトです)。callback
<Function>err
<Error>derivedKey
<ArrayBuffer>
HKDF は、RFC 5869 で定義されている単純なキー導出関数です。指定された ikm
、salt
、info
が、digest
とともに使用され、keylen
バイトのキーを導出します。
指定された callback
関数は、2 つの引数 err
と derivedKey
を付けて呼び出されます。キーの導出中にエラーが発生した場合、err
が設定されます。それ以外の場合、err
は null
になります。正常に生成された 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)
[履歴]
バージョン | 変更点 |
---|---|
v18.8.0, v16.18.0 | 入力キーイングマテリアルがゼロ長でもよくなりました。 |
v15.0.0 | v15.0.0 で追加 |
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 キー導出関数を提供します。指定された ikm
、salt
、および info
は、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)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.0.0 | password および salt 引数に ArrayBuffer インスタンスも使用できるようになりました。 |
v14.0.0 | iterations パラメータが正の値に制限されるようになりました。以前のリリースでは、他の値は 1 として扱われていました。 |
v8.0.0 | digest パラメータが常に必須になりました。 |
v6.0.0 | digest パラメータを渡さずにこの関数を呼び出すことは非推奨となり、警告が発行されるようになりました。 |
v6.0.0 | 文字列である場合の password のデフォルトエンコーディングが binary から utf8 に変更されました。 |
v0.5.5 | v0.5.5 で追加されました。 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>callback
<Function>
パスワードベースの鍵導出関数 2(PBKDF2)の非同期実装を提供します。 digest
で指定された選択された HMAC ダイジェストアルゴリズムが適用され、password
、salt
、および iterations
から要求されたバイト長 (keylen
) の鍵が導出されます。
指定された callback
関数は、2 つの引数 err
と derivedKey
を付けて呼び出されます。鍵の導出中にエラーが発生した場合、err
が設定されます。それ以外の場合、err
は null
になります。デフォルトでは、正常に生成された derivedKey
は、Buffer
としてコールバックに渡されます。入力引数のいずれかが無効な値または型を指定した場合、エラーがスローされます。
iterations
引数は、できるだけ高い数値に設定する必要があります。イテレーションの回数が多くなるほど、導出された鍵はより安全になりますが、完了までに時間がかかります。
salt
はできるだけ一意にする必要があります。 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)
[履歴]
バージョン | 変更点 |
---|---|
v14.0.0 | iterations パラメーターは正の値に制限されるようになりました。以前のリリースでは、他の値は 1 として扱われていました。 |
v6.0.0 | digest パラメーターを渡さずにこの関数を呼び出すことは非推奨となり、警告を発するようになりました。 |
v6.0.0 | 文字列の場合の password のデフォルトエンコーディングが binary から utf8 に変更されました。 |
v0.9.3 | v0.9.3 で追加 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>iterations
<number>keylen
<number>digest
<string>- 戻り値: <Buffer>
同期的な Password-Based Key Derivation Function 2 (PBKDF2) の実装を提供します。digest
で指定された選択された HMAC ダイジェストアルゴリズムが、password
、salt
、および iterations
から要求されたバイト長 (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)
[履歴]
バージョン | 変更点 |
---|---|
v21.6.2, v20.11.1, v18.19.1 | OpenSSL ビルドが暗黙的な拒否をサポートしていない場合、RSA_PKCS1_PADDING パディングは無効になりました。 |
v15.0.0 | キータイプとして文字列、ArrayBuffer、CryptoKey が許可されるようになりました。oaepLabel は ArrayBuffer にすることができます。バッファーは文字列または ArrayBuffer にすることができます。バッファーを受け入れるすべての型は、最大 2 ** 31 - 1 バイトに制限されます。 |
v12.11.0 | oaepLabel オプションが追加されました。 |
v12.9.0 | oaepHash オプションが追加されました。 |
v11.6.0 | この関数はキーオブジェクトをサポートするようになりました。 |
v0.11.14 | v0.11.14 で追加されました。 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>oaepHash
<string> OAEP パディングおよび MGF1 に使用するハッシュ関数。デフォルト:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> OAEP パディングに使用するラベル。指定しない場合、ラベルは使用されません。padding
<crypto.constants>crypto.constants
で定義されたオプションのパディング値。crypto.constants.RSA_NO_PADDING
、crypto.constants.RSA_PKCS1_PADDING
、またはcrypto.constants.RSA_PKCS1_OAEP_PADDING
を指定できます。
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>戻り値: <Buffer> 復号化されたコンテンツを含む新しい
Buffer
。
privateKey
を使用してbuffer
を復号化します。buffer
は以前、対応する公開鍵を使用して暗号化されていました。たとえば、crypto.publicEncrypt()
を使用します。
privateKey
がKeyObject
でない場合、この関数はprivateKey
がcrypto.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)
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | 文字列、ArrayBuffer、および CryptoKey を許可されるキータイプとして追加。パスフレーズは ArrayBuffer にできます。バッファーは文字列または ArrayBuffer にできます。バッファーを受け入れるすべての型は最大 2 ** 31 - 1 バイトに制限されています。 |
v11.6.0 | この関数はキーオブジェクトをサポートするようになりました。 |
v1.1.0 | v1.1.0 で追加。 |
privateKey
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> PEM エンコードされた秘密鍵。passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 秘密鍵のオプションのパスフレーズ。padding
<crypto.constants>crypto.constants
で定義されたオプションのパディング値。crypto.constants.RSA_NO_PADDING
またはcrypto.constants.RSA_PKCS1_PADDING
のいずれかになります。encoding
<string>buffer
、key
、またはpassphrase
が文字列の場合に使用する文字列エンコーディング。
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>戻り値: <Buffer> 暗号化されたコンテンツを含む新しい
Buffer
。
buffer
をprivateKey
で暗号化します。返されたデータは、たとえばcrypto.publicDecrypt()
を使用して、対応する公開鍵を使用して復号化できます。
privateKey
がKeyObject
でない場合、この関数はprivateKey
がcrypto.createPrivateKey()
に渡されたかのように動作します。オブジェクトの場合、padding
プロパティを渡すことができます。それ以外の場合、この関数はRSA_PKCS1_PADDING
を使用します。
crypto.publicDecrypt(key, buffer)
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | 文字列、ArrayBuffer、および CryptoKey を許可されるキータイプとして追加しました。パスフレーズは ArrayBuffer にできます。バッファは文字列または ArrayBuffer にできます。バッファを受け入れるすべてのタイプは、最大 2 ** 31 - 1 バイトに制限されます。 |
v11.6.0 | この関数はキーオブジェクトをサポートするようになりました。 |
v1.1.0 | v1.1.0 で追加されました |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 秘密鍵のオプションのパスフレーズ。padding
<crypto.constants>crypto.constants
で定義されたオプションのパディング値。crypto.constants.RSA_NO_PADDING
またはcrypto.constants.RSA_PKCS1_PADDING
のいずれかになります。encoding
<string>buffer
、key
、またはpassphrase
が文字列の場合に使用する文字列エンコーディング。
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>戻り値: <Buffer> 復号化されたコンテンツを含む新しい
Buffer
。
buffer
を key
で復号化します。buffer
は、たとえば crypto.privateEncrypt()
を使用して、対応する秘密鍵を使用して以前に暗号化されました。
key
が KeyObject
でない場合、この関数は key
が crypto.createPublicKey()
に渡されたかのように動作します。オブジェクトである場合は、padding
プロパティを渡すことができます。それ以外の場合、この関数は RSA_PKCS1_PADDING
を使用します。
RSA 公開鍵は秘密鍵から導出できるため、公開鍵の代わりに秘密鍵を渡すことができます。
crypto.publicEncrypt(key, buffer)
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | 文字列、ArrayBuffer、および CryptoKey を許可されるキータイプとして追加。 oaepLabel と passphrase は ArrayBuffer にできます。 buffer は文字列または ArrayBuffer にできます。 バッファを受け入れるすべてのタイプは、最大 2 ** 31 - 1 バイトに制限されています。 |
v12.11.0 | oaepLabel オプションが追加されました。 |
v12.9.0 | oaepHash オプションが追加されました。 |
v11.6.0 | この関数はキーオブジェクトをサポートするようになりました。 |
v0.11.14 | v0.11.14 で追加されました。 |
key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>key
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey> PEM エンコードされた公開鍵または秘密鍵、<KeyObject>、または<CryptoKey>。oaepHash
<string> OAEP パディングと MGF1 に使用するハッシュ関数。 デフォルト:'sha1'
oaepLabel
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> OAEP パディングに使用するラベル。 指定しない場合、ラベルは使用されません。passphrase
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 秘密鍵のオプションのパスフレーズ。padding
<crypto.constants>crypto.constants
で定義されたオプションのパディング値。crypto.constants.RSA_NO_PADDING
、crypto.constants.RSA_PKCS1_PADDING
、またはcrypto.constants.RSA_PKCS1_OAEP_PADDING
のいずれかです。encoding
<string>buffer
、key
、oaepLabel
、またはpassphrase
が文字列の場合に使用する文字列エンコーディング。
buffer
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>戻り値: <Buffer> 暗号化されたコンテンツを持つ新しい
Buffer
。
buffer
の内容を key
で暗号化し、暗号化されたコンテンツを持つ新しい Buffer
を返します。 返されたデータは、対応する秘密鍵を使用して復号化できます。たとえば、crypto.privateDecrypt()
を使用します。
key
が KeyObject
でない場合、この関数は key
が crypto.createPublicKey()
に渡されたかのように動作します。 オブジェクトの場合、padding
プロパティを渡すことができます。 それ以外の場合、この関数は RSA_PKCS1_OAEP_PADDING
を使用します。
RSA 公開鍵は秘密鍵から派生させることができるため、公開鍵の代わりに秘密鍵を渡すことができます。
crypto.randomBytes(size[, callback])
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v9.0.0 | callback 引数に null を渡すと、ERR_INVALID_CALLBACK がスローされるようになりました。 |
v0.5.8 | v0.5.8 で追加 |
size
<number> 生成するバイト数。size
は2**31 - 1
より大きくすることはできません。callback
<Function>戻り値:
callback
関数が提供されていない場合は、<Buffer>。
暗号学的に強力な擬似乱数データを生成します。size
引数は、生成するバイト数を示す数値です。
callback
関数が提供されている場合、バイトは非同期で生成され、callback
関数は 2 つの引数 err
と buf
で呼び出されます。エラーが発生した場合、err
は Error
オブジェクトになります。それ以外の場合は null
になります。buf
引数は、生成されたバイトを含む Buffer
です。
// 非同期
const { randomBytes } = await import('node:crypto')
randomBytes(256, (err, buf) => {
if (err) throw err
console.log(`${buf.length} バイトのランダムデータ: ${buf.toString('hex')}`)
})
// 非同期
const { randomBytes } = require('node:crypto')
randomBytes(256, (err, buf) => {
if (err) throw err
console.log(`${buf.length} バイトのランダムデータ: ${buf.toString('hex')}`)
})
callback
関数が提供されていない場合、ランダムバイトは同期的に生成され、Buffer
として返されます。バイトの生成に問題がある場合、エラーがスローされます。
// 同期
const { randomBytes } = await import('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} バイトのランダムデータ: ${buf.toString('hex')}`)
// 同期
const { randomBytes } = require('node:crypto')
const buf = randomBytes(256)
console.log(`${buf.length} バイトのランダムデータ: ${buf.toString('hex')}`)
crypto.randomBytes()
メソッドは、十分なエントロピーが利用可能になるまで完了しません。通常、これには数ミリ秒以上かかることはありません。ランダムバイトの生成がより長い時間ブロックされる可能性がある唯一のケースは、システム全体のエントロピーがまだ低い状態である起動直後です。
この API は libuv のスレッドプールを使用しますが、一部のアプリケーションでは驚くべき悪影響を及ぼす可能性があります。詳細については、UV_THREADPOOL_SIZE
ドキュメントを参照してください。
crypto.randomBytes()
の非同期バージョンは、単一のスレッドプールリクエストで実行されます。スレッドプールタスクの長さの変動を最小限に抑えるには、クライアントリクエストの処理の一部として大きな randomBytes
リクエストを実行する際に、それらを分割してください。
crypto.randomFill(buffer[, offset][, size], callback)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v9.0.0 | buffer 引数には任意の TypedArray または DataView を指定できるようになりました。 |
v7.10.0, v6.13.0 | 追加: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須です。指定されたbuffer
のサイズは2**31 - 1
より大きくすることはできません。offset
<number> デフォルト:0
size
<number> デフォルト:buffer.length - offset
。size
は2**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'))
})
// 上記は下記と同等です:
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'))
})
// 上記は下記と同等です:
randomFill(buf, 5, 5, (err, buf) => {
if (err) throw err
console.log(buf.toString('hex'))
})
任意の ArrayBuffer
、TypedArray
、または DataView
インスタンスを buffer
として渡すことができます。
これには Float32Array
および Float64Array
のインスタンスが含まれますが、この関数はランダムな浮動小数点数を生成するために使用しないでください。結果には +Infinity
、-Infinity
、および NaN
が含まれる可能性があり、たとえ配列に有限数のみが含まれていても、それらは均一な乱数分布から描画されたものではなく、有意な下限または上限を持ちません。
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])
[履歴]
バージョン | 変更点 |
---|---|
v9.0.0 | buffer 引数に任意の TypedArray または DataView を指定できるようになりました。 |
v7.10.0, v6.13.0 | 追加: v7.10.0, v6.13.0 |
buffer
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> 必須。指定されたbuffer
のサイズは2**31 - 1
を超えてはなりません。offset
<number> デフォルト:0
size
<number> デフォルト:buffer.length - offset
。size
は2**31 - 1
を超えてはなりません。- 戻り値: <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>
buffer
引数として渡されたオブジェクト。
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'))
// 上記は以下と同等です:
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'))
// 上記は以下と同等です:
randomFillSync(buf, 5, 5)
console.log(buf.toString('hex'))
ArrayBuffer
、TypedArray
、または 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])
[履歴]
バージョン | 変更 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v14.10.0, v12.19.0 | 追加: v14.10.0, v12.19.0 |
min
<integer> 乱数範囲の開始(含む)。デフォルト:0
。max
<integer> 乱数範囲の終了(含まない)。callback
<Function>function(err, n) {}
。
min <= n < max
となるような乱数整数 n
を返します。この実装では、剰余バイアスを回避します。
範囲(max - min
)は 2 未満である必要があります。min
と max
は 安全な整数 でなければなりません。
callback
関数が提供されない場合、乱数整数は同期的に生成されます。
// 非同期
const { randomInt } = await import('node:crypto')
randomInt(3, (err, n) => {
if (err) throw err
console.log(`(0, 1, 2) から選ばれた乱数: ${n}`)
})
// 非同期
const { randomInt } = require('node:crypto')
randomInt(3, (err, n) => {
if (err) throw err
console.log(`(0, 1, 2) から選ばれた乱数: ${n}`)
})
// 同期
const { randomInt } = await import('node:crypto')
const n = randomInt(3)
console.log(`(0, 1, 2) から選ばれた乱数: ${n}`)
// 同期
const { randomInt } = require('node:crypto')
const n = randomInt(3)
console.log(`(0, 1, 2) から選ばれた乱数: ${n}`)
// `min` 引数付き
const { randomInt } = await import('node:crypto')
const n = randomInt(1, 7)
console.log(`サイコロの目は: ${n}`)
// `min` 引数付き
const { randomInt } = require('node:crypto')
const n = randomInt(1, 7)
console.log(`サイコロの目は: ${n}`)
crypto.randomUUID([options])
追加: v15.6.0, v14.17.0
options
<Object>disableEntropyCache
<boolean> デフォルトでは、パフォーマンスを向上させるために、Node.js は最大 128 個のランダム UUID を生成するのに十分なランダムデータを生成してキャッシュします。キャッシュを使用せずに UUID を生成するには、disableEntropyCache
をtrue
に設定します。デフォルト:false
。
戻り値: <string>
ランダムなRFC 4122バージョン 4 UUID を生成します。UUID は、暗号論的に擬似乱数生成器を使用して生成されます。
crypto.scrypt(password, salt, keylen[, options], callback)
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなくERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.0.0 | password と salt 引数に ArrayBuffer インスタンスも使用できるようになりました。 |
v12.8.0, v10.17.0 | maxmem の値は安全な整数であればどのような値でも使用できるようになりました。 |
v10.9.0 | cost , blockSize , parallelization オプション名が追加されました。 |
v10.5.0 | 追加: v10.5.0 |
password
<string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <ArrayBuffer> | <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
。
callback
<Function>
非同期scryptの実装を提供します。Scrypt はパスワードベースの鍵導出関数であり、ブルートフォース攻撃を不利にするために、計算とメモリの両方で負荷が高くなるように設計されています。
salt
はできるだけ一意である必要があります。salt はランダムで少なくとも 16 バイト長であることが推奨されます。詳細はNIST SP 800-132を参照してください。
password
またはsalt
に文字列を渡す場合は、暗号 API への入力として文字列を使用する場合の注意点を考慮してください。
callback
関数は、err
とderivedKey
の 2 つの引数で呼び出されます。鍵導出が失敗した場合、err
は例外オブジェクトになります。そうでない場合、err
はnull
になります。derivedKey
はBuffer
としてコールバックに渡されます。
入力引数のいずれかに無効な値または型が指定された場合、例外がスローされます。
const { scrypt } = await import('node:crypto')
// ファクトリのデフォルトを使用する。
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// カスタムのNパラメータを使用する。2のべき乗でなければならない。
scrypt('password', 'salt', 64, { N: 1024 }, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...aa39b34'
})
const { scrypt } = require('node:crypto')
// ファクトリのデフォルトを使用する。
scrypt('password', 'salt', 64, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex')) // '3745e48...08d59ae'
})
// カスタムのNパラメータを使用する。2のべき乗でなければならない。
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])
[履歴]
バージョン | 変更点 |
---|---|
v12.8.0, v10.17.0 | maxmem の値が任意の安全な整数にできるようになりました。 |
v10.9.0 | cost , blockSize , および parallelization オプション名が追加されました。 |
v10.5.0 | v10.5.0 で追加されました。 |
password
<string> | <Buffer> | <TypedArray> | <DataView>salt
<string> | <Buffer> | <TypedArray> | <DataView>keylen
<number>options
<Object>cost
<number> CPU/メモリコストパラメータ。2 より大きい 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')
// ファクトリーデフォルトを使用します。
const key1 = scryptSync('password', 'salt', 64)
console.log(key1.toString('hex')) // '3745e48...08d59ae'
// カスタム N パラメータを使用します。2 のべき乗である必要があります。
const key2 = scryptSync('password', 'salt', 64, { N: 1024 })
console.log(key2.toString('hex')) // '3745e48...aa39b34'
const { scryptSync } = require('node:crypto')
// ファクトリーデフォルトを使用します。
const key1 = scryptSync('password', 'salt', 64)
console.log(key1.toString('hex')) // '3745e48...08d59ae'
// カスタム N パラメータを使用します。2 のべき乗である必要があります。
const key2 = scryptSync('password', 'salt', 64, { N: 1024 })
console.log(key2.toString('hex')) // '3745e48...aa39b34'
crypto.secureHeapUsed()
追加: v15.6.0
- 戻り値: <Object>
crypto.setEngine(engine[, flags])
[履歴]
バージョン | 変更点 |
---|---|
v22.4.0, v20.16.0 | OpenSSL 3 でのカスタムエンジンサポートは非推奨になりました。 |
v0.11.11 | 追加: v0.11.11 |
engine
<string>flags
<crypto.constants> デフォルト:crypto.constants.ENGINE_METHOD_ALL
OpenSSL 関数のいくつかまたはすべて(フラグで選択)に対して engine
をロードおよび設定します。OpenSSL でのカスタムエンジンのサポートは、OpenSSL 3 以降非推奨になっています。
engine
は、ID またはエンジンの共有ライブラリへのパスのいずれかです。
オプションの flags
引数は、デフォルトで ENGINE_METHOD_ALL
を使用します。flags
は、次のフラグのいずれかまたは組み合わせを受け取るビットフィールドです(crypto.constants
で定義)。
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)
追加: v10.0.0
bool
<boolean>true
で FIPS モードを有効にします。
FIPS 対応の Node.js ビルドで FIPS 準拠の暗号化プロバイダを有効にします。FIPS モードが利用できない場合はエラーをスローします。
crypto.sign(algorithm, data, key[, callback])
[履歴]
バージョン | 変更 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりにERR_INVALID_ARG_TYPE をスローするようになりました。 |
v15.12.0 | オプションのコールバック引数が追加されました。 |
v13.2.0, v12.16.0 | この関数は、IEEE-P1363 DSA および ECDSA 署名をサポートするようになりました。 |
v12.0.0 | 追加: v12.0.0 |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>callback
<Function>戻り値:
callback
関数が提供されていない場合は<Buffer>。
指定された秘密鍵とアルゴリズムを使用してdata
の署名を計算して返します。 algorithm
がnull
またはundefined
の場合、アルゴリズムは鍵のタイプ(特に Ed25519 および Ed448)に依存します。
key
がKeyObject
ではない場合、この関数はkey
がcrypto.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
(デフォルト)は最大許容値に設定します。
callback
関数が提供されている場合、この関数は libuv のスレッドプールを使用します。
crypto.subtle
追加: v17.4.0
- タイプ: <SubtleCrypto>
crypto.webcrypto.subtle
の便利なエイリアス。
crypto.timingSafeEqual(a, b)
[履歴]
バージョン | 変更点 |
---|---|
v15.0.0 | a と b の引数に ArrayBuffer も使用可能になりました。 |
v6.6.0 | 追加: v6.6.0 |
a
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>b
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>- 戻り値: <boolean>
この関数は、定数時間アルゴリズムを使用して、与えられた ArrayBuffer
、TypedArray
、または DataView
インスタンスを表す基礎となるバイトを比較します。
この関数は、攻撃者が値の 1 つを推測することを可能にするタイミング情報を漏洩しません。これは、HMAC ダイジェスト、認証クッキー、またはケイパビリティ URLのような秘密値を比較するのに適しています。
a
と b
は両方とも Buffer
、TypedArray
、または DataView
でなければならず、同じバイト長を持つ必要があります。a
と b
のバイト長が異なる場合、エラーがスローされます。
a
と b
の少なくとも一方が、Uint16Array
のようにエントリあたり複数のバイトを持つ TypedArray
である場合、結果はプラットフォームのバイト順を使用して計算されます。
両方の入力が Float32Array
または Float64Array
の場合、この関数は浮動小数点数の IEEE 754 エンコーディングにより予期しない結果を返す可能性があります。特に、x === y
も Object.is(x, y)
も、2 つの浮動小数点数 x
と y
のバイト表現が等しいことを意味しません。
crypto.timingSafeEqual
を使用しても、周辺 コードがタイミングセーフであることは保証されません。周辺のコードがタイミングの脆弱性を導入しないように注意する必要があります。
crypto.verify(algorithm, data, key, signature[, callback])
[履歴]
バージョン | 変更点 |
---|---|
v18.0.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK の代わりに ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v15.12.0 | オプションの callback 引数が追加されました。 |
v15.0.0 | data、key、signature 引数に ArrayBuffer も使用できるようになりました。 |
v13.2.0, v12.16.0 | この関数は、IEEE-P1363 DSA および ECDSA 署名をサポートするようになりました。 |
v12.0.0 | v12.0.0 で追加されました |
algorithm
<string> | <null> | <undefined>data
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>key
<Object> | <string> | <ArrayBuffer> | <Buffer> | <TypedArray> | <DataView> | <KeyObject> | <CryptoKey>signature
<ArrayBuffer> | <Buffer> | <TypedArray> | <DataView>callback
<Function>戻り値: <boolean>
callback
関数が提供されていない場合、データと公開鍵に対する署名の有効性に応じてtrue
またはfalse
が返されます。
指定された鍵とアルゴリズムを使用して、data
の指定された署名を検証します。 algorithm
が null
または undefined
の場合、アルゴリズムは鍵のタイプ (特に Ed25519 および Ed448) によって異なります。
key
が KeyObject
でない場合、この関数は、key
が crypto.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
(デフォルト) はソルト長を最大許容値に設定します。
signature
引数は、data
に対して以前に計算された署名です。
公開鍵は秘密鍵から導き出すことができるため、key
には秘密鍵または公開鍵を渡すことができます。
callback
関数が指定されている場合、この関数は libuv のスレッドプールを使用します。
crypto.webcrypto
追加: v15.0.0
型: <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 文字列のバイト表現は、文字列の作成元のバイトシーケンスと等しくない可能性があります。暗号、ハッシュ関数、署名アルゴリズム、および鍵導出関数の出力は、擬似ランダムなバイトシーケンスであり、Unicode 文字列として使用しないでください。 - 文字列がユーザー入力から取得される場合、一部の Unicode 文字は、異なるバイトシーケンスになる複数の同等の方法で表現できます。たとえば、PBKDF2 や scrypt などの鍵導出関数にユーザーパスフレーズを渡す場合、鍵導出関数の結果は、文字列が合成文字を使用するか分解文字を使用するかによって異なります。Node.js は文字表現を正規化しません。開発者は、暗号 API に渡す前に、ユーザー入力で
String.prototype.normalize()
を使用することを検討する必要があります。
レガシーストリーム API (Node.js 0.10 より前)
Crypto モジュールは、統一されたストリーム API の概念や、バイナリデータを処理するためのBuffer
オブジェクトができる前に Node.js に追加されました。そのため、多くのcrypto
クラスには、ストリーム 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 ビットであるのが推奨されており、数年間の使用に安全です。
modp1
、modp2
、modp5
の 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()
を介して認証タグを設定する必要があります。そうしないと、復号化は失敗し、RFC 3610のセクション 2.6 に従ってfinal()
がエラーをスローします。 - CCM モードでの
write(data)
、end(data)
、pipe()
などのストリームメソッドの使用は、CCM がインスタンスごとに複数のデータの塊を処理できないため、失敗する可能性があります。 - 追加認証データ(AAD)を渡す場合、実際のメッセージの長さ(バイト単位)を、
plaintextLength
オプションを介してsetAAD()
に渡す必要があります。多くの暗号ライブラリは、認証タグを暗号文に含めているため、plaintextLength + authTagLength
の長さの暗号文を生成します。Node.js は認証タグを含めないため、暗号文の長さは常にplaintextLength
になります。AAD を使用しない場合は、これは必要ありません。 - CCM はメッセージ全体を一度に処理するため、
update()
は正確に 1 回呼び出す必要があります。 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 /<絶対パス>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
[provider_sect]
default = default_sect
# fips セクション名は、 {#the-fips-section-name-should-match-the-section-name-inside-the}
# インクルードされた fipsmodule.cnf 内のセクション名と一致する必要があります。
fips = fips_sect
[default_sect]
activate = 1
ここで、fipsmodule.cnf
は、FIPS プロバイダーのインストール手順で生成された FIPS モジュール構成ファイルです。
openssl fipsinstall
OPENSSL_CONF
環境変数を構成ファイルへのパスに設定し、OPENSSL_MODULES
を FIPS プロバイダーの動的ライブラリの場所に設定します。例:
export OPENSSL_CONF=/<構成ファイルへのパス>/nodejs.cnf
export OPENSSL_MODULES=/<openssl libへのパス>/ossl-modules
FIPS モードは、Node.js で次のいずれかの方法で有効にできます。
--enable-fips
または--force-fips
コマンドラインフラグを付けて Node.js を起動する。crypto.setFips(true)
をプログラムで呼び出す。
オプションで、FIPS モードは OpenSSL 構成ファイルを介して Node.js で有効にできます。例:
nodejs_conf = nodejs_init
.include /<絶対パス>/fipsmodule.cnf
[nodejs_init]
providers = provider_sect
alg_section = algorithm_sect
[provider_sect]
default = default_sect
# fips セクション名は、 {#included-fipsmodulecnf}
# インクルードされた fipsmodule.cnf 内のセクション名と一致する必要があります。
fips = fips_sect
[default_sect]
activate = 1
[algorithm_sect]
default_properties = fips=yes
暗号定数
crypto.constants
によってエクスポートされる以下の定数は、node:crypto
、node: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 | TLS v1.3 に対して、[EC]DHE ベースではない鍵交換モードを許可するように OpenSSL に指示します。 |
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 に、DTLS_BAD_VER の Cisco のバージョン識別子を使用するように指示します。 |
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 プロセスが使用するアクティブなデフォルト暗号リストを指定します。 |