Web Crypto API#

安定性: 2 - Stable

Node.js は Web Crypto API 標準の実装を提供します。

このモジュールにアクセスするには、globalThis.crypto または require('node:crypto').webcrypto を使用してください。

const { subtle } = globalThis.crypto;

(async function() {

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

  const enc = new TextEncoder();
  const message = enc.encode('I love cupcakes');

  const digest = await subtle.sign({
    name: 'HMAC',
  }, key, message);

})(); 

Web Cryptography API のモダンなアルゴリズム#

安定性: 1.1 - Active development

Node.js は、WICG の提案である Modern Algorithms in the Web Cryptography API から以下の機能の実装を提供します。

アルゴリズム

  • 'AES-OCB'1
  • 'Argon2d'2
  • 'Argon2i'2
  • 'Argon2id'2
  • 'ChaCha20-Poly1305'
  • 'cSHAKE128'
  • 'cSHAKE256'
  • 'KMAC128'1
  • 'KMAC256'1
  • 'ML-DSA-44'3
  • 'ML-DSA-65'3
  • 'ML-DSA-87'3
  • 'ML-KEM-512'3
  • 'ML-KEM-768'3
  • 'ML-KEM-1024'3
  • 'SHA3-256'
  • 'SHA3-384'
  • 'SHA3-512'

鍵フォーマット

  • 'raw-public'
  • 'raw-secret'
  • 'raw-seed'

メソッド

Web Cryptography API の安全な曲線#

安定性: 1.1 - Active development

Node.js は、WICG の提案である Secure Curves in the Web Cryptography API から以下の機能の実装を提供します。

アルゴリズム

  • 'Ed448'
  • 'X448'

#

鍵の生成#

<SubtleCrypto> クラスは、対称 (秘密) 鍵または非対称鍵ペア (公開鍵と秘密鍵) を生成するために使用できます。

AES 鍵#
const { subtle } = globalThis.crypto;

async function generateAesKey(length = 256) {
  const key = await subtle.generateKey({
    name: 'AES-CBC',
    length,
  }, true, ['encrypt', 'decrypt']);

  return key;
} 
ECDSA 鍵ペア#
const { subtle } = globalThis.crypto;

async function generateEcKey(namedCurve = 'P-521') {
  const {
    publicKey,
    privateKey,
  } = await subtle.generateKey({
    name: 'ECDSA',
    namedCurve,
  }, true, ['sign', 'verify']);

  return { publicKey, privateKey };
} 
Ed25519/X25519 鍵ペア#
const { subtle } = globalThis.crypto;

async function generateEd25519Key() {
  return subtle.generateKey({
    name: 'Ed25519',
  }, true, ['sign', 'verify']);
}

async function generateX25519Key() {
  return subtle.generateKey({
    name: 'X25519',
  }, true, ['deriveKey']);
} 
HMAC 鍵#
const { subtle } = globalThis.crypto;

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

  return key;
} 
RSA 鍵ペア#
const { subtle } = globalThis.crypto;
const publicExponent = new Uint8Array([1, 0, 1]);

async function generateRsaKey(modulusLength = 2048, hash = 'SHA-256') {
  const {
    publicKey,
    privateKey,
  } = await subtle.generateKey({
    name: 'RSASSA-PKCS1-v1_5',
    modulusLength,
    publicExponent,
    hash,
  }, true, ['sign', 'verify']);

  return { publicKey, privateKey };
} 

暗号化と復号#

const crypto = globalThis.crypto;

async function aesEncrypt(plaintext) {
  const ec = new TextEncoder();
  const key = await generateAesKey();
  const iv = crypto.getRandomValues(new Uint8Array(16));

  const ciphertext = await crypto.subtle.encrypt({
    name: 'AES-CBC',
    iv,
  }, key, ec.encode(plaintext));

  return {
    key,
    iv,
    ciphertext,
  };
}

async function aesDecrypt(ciphertext, key, iv) {
  const dec = new TextDecoder();
  const plaintext = await crypto.subtle.decrypt({
    name: 'AES-CBC',
    iv,
  }, key, ciphertext);

  return dec.decode(plaintext);
} 

鍵のエクスポートとインポート#

const { subtle } = globalThis.crypto;

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

  return subtle.exportKey(format, key);
}

async function importHmacKey(keyData, format = 'jwk', hash = 'SHA-512') {
  const key = await subtle.importKey(format, keyData, {
    name: 'HMAC',
    hash,
  }, true, ['sign', 'verify']);

  return key;
} 

鍵のラッピングとアンラッピング#

const { subtle } = globalThis.crypto;

async function generateAndWrapHmacKey(format = 'jwk', hash = 'SHA-512') {
  const [
    key,
    wrappingKey,
  ] = await Promise.all([
    subtle.generateKey({
      name: 'HMAC', hash,
    }, true, ['sign', 'verify']),
    subtle.generateKey({
      name: 'AES-KW',
      length: 256,
    }, true, ['wrapKey', 'unwrapKey']),
  ]);

  const wrappedKey = await subtle.wrapKey(format, key, wrappingKey, 'AES-KW');

  return { wrappedKey, wrappingKey };
}

async function unwrapHmacKey(
  wrappedKey,
  wrappingKey,
  format = 'jwk',
  hash = 'SHA-512') {

  const key = await subtle.unwrapKey(
    format,
    wrappedKey,
    wrappingKey,
    'AES-KW',
    { name: 'HMAC', hash },
    true,
    ['sign', 'verify']);

  return key;
} 

署名と検証#

const { subtle } = globalThis.crypto;

async function sign(key, data) {
  const ec = new TextEncoder();
  const signature =
    await subtle.sign('RSASSA-PKCS1-v1_5', key, ec.encode(data));
  return signature;
}

async function verify(key, signature, data) {
  const ec = new TextEncoder();
  const verified =
    await subtle.verify(
      'RSASSA-PKCS1-v1_5',
      key,
      signature,
      ec.encode(data));
  return verified;
} 

ビットと鍵の導出#

const { subtle } = globalThis.crypto;

async function pbkdf2(pass, salt, iterations = 1000, length = 256) {
  const ec = new TextEncoder();
  const key = await subtle.importKey(
    'raw',
    ec.encode(pass),
    'PBKDF2',
    false,
    ['deriveBits']);
  const bits = await subtle.deriveBits({
    name: 'PBKDF2',
    hash: 'SHA-512',
    salt: ec.encode(salt),
    iterations,
  }, key, length);
  return bits;
}

async function pbkdf2Key(pass, salt, iterations = 1000, length = 256) {
  const ec = new TextEncoder();
  const keyMaterial = await subtle.importKey(
    'raw',
    ec.encode(pass),
    'PBKDF2',
    false,
    ['deriveKey']);
  const key = await subtle.deriveKey({
    name: 'PBKDF2',
    hash: 'SHA-512',
    salt: ec.encode(salt),
    iterations,
  }, keyMaterial, {
    name: 'AES-GCM',
    length,
  }, true, ['encrypt', 'decrypt']);
  return key;
} 

ダイジェスト#

const { subtle } = globalThis.crypto;

async function digest(data, algorithm = 'SHA-512') {
  const ec = new TextEncoder();
  const digest = await subtle.digest(algorithm, ec.encode(data));
  return digest;
} 

実行時のアルゴリズムサポートの確認#

SubtleCrypto.supports() は、Web Crypto API の機能検出を可能にし、特定のアルゴリズム識別子 (そのパラメータを含む) が与えられた操作でサポートされているかどうかを検出するために使用できます。

この例では、利用可能であれば Argon2、そうでなければ PBKDF2 を使用してパスワードから鍵を導出し、利用可能であれば AES-OCB、そうでなければ AES-GCM を使用してテキストを暗号化および復号します。

const { SubtleCrypto, crypto } = globalThis;

const password = 'correct horse battery staple';
const derivationAlg =
  SubtleCrypto.supports?.('importKey', 'Argon2id') ?
    'Argon2id' :
    'PBKDF2';
const encryptionAlg =
  SubtleCrypto.supports?.('importKey', 'AES-OCB') ?
    'AES-OCB' :
    'AES-GCM';
const passwordKey = await crypto.subtle.importKey(
  derivationAlg === 'Argon2id' ? 'raw-secret' : 'raw',
  new TextEncoder().encode(password),
  derivationAlg,
  false,
  ['deriveKey'],
);
const nonce = crypto.getRandomValues(new Uint8Array(16));
const derivationParams =
  derivationAlg === 'Argon2id' ?
    {
      nonce,
      parallelism: 4,
      memory: 2 ** 21,
      passes: 1,
    } :
    {
      salt: nonce,
      iterations: 100_000,
      hash: 'SHA-256',
    };
const key = await crypto.subtle.deriveKey(
  {
    name: derivationAlg,
    ...derivationParams,
  },
  passwordKey,
  {
    name: encryptionAlg,
    length: 256,
  },
  false,
  ['encrypt', 'decrypt'],
);
const plaintext = 'Hello, world!';
const iv = crypto.getRandomValues(new Uint8Array(16));
const encrypted = await crypto.subtle.encrypt(
  { name: encryptionAlg, iv },
  key,
  new TextEncoder().encode(plaintext),
);
const decrypted = new TextDecoder().decode(await crypto.subtle.decrypt(
  { name: encryptionAlg, iv },
  key,
  encrypted,
)); 

アルゴリズムマトリックス#

以下の表は、Node.js Web Crypto API 実装でサポートされているアルゴリズムと、それぞれでサポートされている API の詳細を示しています。

鍵管理 API#

アルゴリズムsubtle.generateKey()subtle.exportKey()subtle.importKey()subtle.getPublicKey()
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'4
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'5
'HKDF'
'HMAC'
'KMAC128'4
'KMAC256'4
'ML-DSA-44'4
'ML-DSA-65'4
'ML-DSA-87'4
'ML-KEM-512'4
'ML-KEM-768'4
'ML-KEM-1024'4
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'5

暗号操作 API#

列の凡例

アルゴリズム暗号化署名と MAC鍵またはビットの導出鍵のラッピング鍵のカプセル化ダイジェスト
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'4
'cSHAKE128'4
'cSHAKE256'4
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'5
'HKDF'
'HMAC'
'KMAC128'4
'KMAC256'4
'ML-DSA-44'4
'ML-DSA-65'4
'ML-DSA-87'4
'ML-KEM-512'4
'ML-KEM-768'4
'ML-KEM-1024'4
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'SHA-1'
'SHA-256'
'SHA-384'
'SHA-512'
'SHA3-256'4
'SHA3-384'4
'SHA3-512'4
'X25519'
'X448'5

クラス: Crypto#

globalThis.cryptoCrypto クラスのインスタンスです。Crypto は、残りの暗号 API へのアクセスを提供するシングルトンです。

crypto.subtle#

SubtleCrypto API へのアクセスを提供します。

crypto.getRandomValues(typedArray)#

暗号学的に強力な乱数値を生成します。指定された typedArray は乱数値で満たされ、typedArray への参照が返されます。

指定された typedArray は、整数ベースの <TypedArray> のインスタンスでなければなりません。つまり、Float32ArrayFloat64Array は受け付けられません。

指定された typedArray が 65,536 バイトより大きい場合、エラーがスローされます。

crypto.randomUUID()#

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

クラス: CryptoKey#

cryptoKey.algorithm#

鍵が使用できるアルゴリズムと、アルゴリズム固有の追加パラメータを詳述するオブジェクトです。

読み取り専用です。

cryptoKey.extractable#

true の場合、<CryptoKey>subtle.exportKey() または subtle.wrapKey() を使用して取り出すことができます。

読み取り専用です。

cryptoKey.type#

  • 型: <string> 'secret''private'、または 'public' のいずれか。

鍵が対称鍵 ('secret') か非対称鍵 ('private' または 'public') かを識別する文字列です。

cryptoKey.usages#

鍵が使用できる操作を識別する文字列の配列です。

可能な用途は以下の通りです。

有効な鍵の用途は、鍵アルゴリズム (cryptokey.algorithm.name によって識別) に依存します。

列の凡例

サポートされている鍵アルゴリズム暗号化署名と MAC鍵またはビットの導出鍵のラッピング鍵のカプセル化
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'
'Argon2d'
'Argon2i'
'Argon2id'
'ChaCha20-Poly1305'4
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'5
'HDKF'
'HMAC'
'KMAC128'4
'KMAC256'4
'ML-DSA-44'4
'ML-DSA-65'4
'ML-DSA-87'4
'ML-KEM-512'4
'ML-KEM-768'4
'ML-KEM-1024'4
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'5

クラス: CryptoKeyPair#

CryptoKeyPair は、publicKeyprivateKey プロパティを持つ単純なディクショナリオブジェクトで、非対称鍵ペアを表します。

cryptoKeyPair.privateKey#

cryptoKeyPair.publicKey#

クラス: SubtleCrypto#

静的メソッド: SubtleCrypto.supports(operation, algorithm[, lengthOrAdditionalAlgorithm])#

安定性: 1.1 - Active development

  • operation <string> "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "getPublicKey", "wrapKey", "unwrapKey", "encapsulateBits", "encapsulateKey", "decapsulateBits", または "decapsulateKey"
  • algorithm <string> | <Algorithm>
  • lengthOrAdditionalAlgorithm <null> | <number> | <string> | <Algorithm> | <undefined> 操作に応じて、これは無視されるか、操作が "deriveBits" の場合は length 引数の値、操作が "deriveKey" の場合は導出される鍵のアルゴリズム、操作が "wrapKey" の場合はラッピング前にエクスポートされる鍵のアルゴリズム、操作が "unwrapKey" の場合はアンラッピング後にインポートされる鍵のアルゴリズム、操作が "encapsulateKey" または "decapsulateKey" の場合は鍵のカプセル化/カプセル化解除後にインポートされる鍵のアルゴリズムになります。デフォルト: 操作が "deriveBits" の場合は null、それ以外の場合は undefined
  • 戻り値: <boolean> 実装が指定された操作をサポートしているかどうかを示します。

Web Crypto API の機能検出を可能にし、特定のアルゴリズム識別子 (そのパラメータを含む) が与えられた操作でサポートされているかどうかを検出するために使用できます。

このメソッドの使用例については、実行時のアルゴリズムサポートの確認 を参照してください。

subtle.decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext)#

安定性: 1.1 - Active development

メッセージ受信者は、非対称秘密鍵を使用して「カプセル化された鍵」(暗号文) を復号し、それによって一時的な対称鍵 (<ArrayBuffer> として表現) を回復し、それを使用してメッセージを復号します。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4

subtle.decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages)#

安定性: 1.1 - Active development

メッセージ受信者は、非対称秘密鍵を使用して「カプセル化された鍵」(暗号文) を復号し、それによって一時的な対称鍵 (<CryptoKey> として表現) を回復し、それを使用してメッセージを復号します。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4

subtle.decrypt(algorithm, key, data)#

algorithm で指定されたメソッドとパラメータ、および key で提供された鍵マテリアルを使用して、このメソッドは提供された data を復号しようとします。成功した場合、返された Promise は平文の結果を含む <ArrayBuffer> で解決されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

subtle.deriveBits(algorithm, baseKey[, length])#

algorithm で指定されたメソッドとパラメータ、および baseKey で提供された鍵マテリアルを使用して、このメソッドは length ビットを生成しようとします。

length が提供されていないか null の場合、特定のアルゴリズムの最大ビット数が生成されます。これは 'ECDH''X25519'、および 'X448'5 アルゴリズムで許可されており、他のアルゴリズムでは length は数値である必要があります。

成功した場合、返された Promise は生成されたデータを含む <ArrayBuffer> で解決されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'Argon2d'4
  • 'Argon2i'4
  • 'Argon2id'4
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'5

subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)#

algorithm で指定されたメソッドとパラメータ、および baseKey で提供された鍵マテリアルを使用して、このメソッドは derivedKeyAlgorithm のメソッドとパラメータに基づいて新しい <CryptoKey> を生成しようとします。

このメソッドの呼び出しは、subtle.deriveBits() を呼び出して生の鍵マテリアルを生成し、その結果を subtle.importKey() メソッドに入力として deriveKeyAlgorithmextractablekeyUsages パラメータを使用して渡すことと同等です。

現在サポートされているアルゴリズムは以下の通りです。

  • 'Argon2d'4
  • 'Argon2i'4
  • 'Argon2id'4
  • 'ECDH'
  • 'HKDF'
  • 'PBKDF2'
  • 'X25519'
  • 'X448'5

subtle.digest(algorithm, data)#

algorithm で識別されるメソッドを使用して、このメソッドは data のダイジェストを生成しようとします。成功した場合、返された Promise は計算されたダイジェストを含む <ArrayBuffer> で解決されます。

algorithm<string> として提供された場合、それは以下のいずれかでなければなりません。

  • 'cSHAKE128'4
  • 'cSHAKE256'4
  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

algorithm<Object> として提供された場合、その name プロパティの値は上記のうちの 1 つでなければなりません。

subtle.encapsulateBits(encapsulationAlgorithm, encapsulationKey)#

安定性: 1.1 - Active development

メッセージ受信者の非対称公開鍵を使用して一時的な対称鍵を暗号化します。この暗号化された鍵は、「カプセル化された鍵」であり、<EncapsulatedBits>として表現されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4

subtle.encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages)#

安定性: 1.1 - Active development

メッセージ受信者の非対称公開鍵を使用して一時的な対称鍵を暗号化します。この暗号化された鍵は、「カプセル化された鍵」であり、<EncapsulatedKey>として表現されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4

subtle.encrypt(algorithm, key, data)#

algorithm で指定されたメソッドとパラメータ、および key で提供された鍵マテリアルを使用して、このメソッドは data を暗号化しようとします。成功した場合、返された Promise は暗号化された結果を含む <ArrayBuffer> で解決されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

subtle.exportKey(format, key)#

指定された鍵を、サポートされていれば指定されたフォーマットにエクスポートします。

<CryptoKey> が取り出し可能でない場合、返された Promise は reject されます。

format'pkcs8' または 'spki' のいずれかで、エクスポートが成功した場合、返された Promise はエクスポートされた鍵データを含む <ArrayBuffer> で解決されます。

format'jwk' でエクスポートが成功した場合、返された Promise は JSON Web Key 仕様に準拠した JavaScript オブジェクトで解決されます。

サポートされている鍵アルゴリズム'spki''pkcs8''jwk''raw''raw-secret''raw-public''raw-seed'
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'4
'ChaCha20-Poly1305'4
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'5
'HMAC'
'KMAC128'4
'KMAC256'4
'ML-DSA-44'4
'ML-DSA-65'4
'ML-DSA-87'4
'ML-KEM-512'4
'ML-KEM-768'4
'ML-KEM-1024'4
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'

subtle.getPublicKey(key, keyUsages)#

安定性: 1.1 - Active development

与えられた秘密鍵から公開鍵を導出します。

subtle.generateKey(algorithm, extractable, keyUsages)#

algorithm で提供されたパラメータを使用して、このメソッドは新しい鍵マテリアルを生成しようとします。使用されるアルゴリズムに応じて、単一の <CryptoKey> または <CryptoKeyPair> が生成されます。

<CryptoKeyPair> (公開鍵と秘密鍵) を生成するサポートされているアルゴリズムは以下の通りです。

  • 'ECDH'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'5
  • 'ML-DSA-44'4
  • 'ML-DSA-65'4
  • 'ML-DSA-87'4
  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'5

<CryptoKey> (秘密鍵) を生成するサポートされているアルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'HMAC'
  • 'KMAC128'4
  • 'KMAC256'4

subtle.importKey(format, keyData, algorithm, extractable, keyUsages)#

このメソッドは、提供された keyData を指定された format として解釈し、提供された algorithmextractablekeyUsages 引数を使用して <CryptoKey> インスタンスを作成しようとします。インポートが成功した場合、返された Promise は鍵マテリアルの <CryptoKey> 表現で解決されます。

KDF アルゴリズムの鍵をインポートする場合、extractablefalse でなければなりません。

現在サポートされているアルゴリズムは以下の通りです。

サポートされている鍵アルゴリズム'spki''pkcs8''jwk''raw''raw-secret''raw-public''raw-seed'
'AES-CBC'
'AES-CTR'
'AES-GCM'
'AES-KW'
'AES-OCB'4
'Argon2d'4
'Argon2i'4
'Argon2id'4
'ChaCha20-Poly1305'4
'ECDH'
'ECDSA'
'Ed25519'
'Ed448'5
'HDKF'
'HMAC'
'KMAC128'4
'KMAC256'4
'ML-DSA-44'4
'ML-DSA-65'4
'ML-DSA-87'4
'ML-KEM-512'4
'ML-KEM-768'4
'ML-KEM-1024'4
'PBKDF2'
'RSA-OAEP'
'RSA-PSS'
'RSASSA-PKCS1-v1_5'
'X25519'
'X448'5

subtle.sign(algorithm, key, data)#

algorithm で指定されたメソッドとパラメータ、および key で提供された鍵マテリアルを使用して、このメソッドは data の暗号署名を生成しようとします。成功した場合、返された Promise は生成された署名を含む <ArrayBuffer> で解決されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'5
  • 'HMAC'
  • 'KMAC128'4
  • 'KMAC256'4
  • 'ML-DSA-44'4
  • 'ML-DSA-65'4
  • 'ML-DSA-87'4
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'

subtle.unwrapKey(format, wrappedKey, unwrappingKey, unwrapAlgo, unwrappedKeyAlgo, extractable, keyUsages)#

暗号学では、「鍵のラッピング」とは、鍵マテリアルをエクスポートしてから暗号化することを指します。このメソッドは、ラップされた鍵を復号し、<CryptoKey> インスタンスを作成しようとします。これは、まず暗号化された鍵データに対して subtle.decrypt() を呼び出し(wrappedKeyunwrapAlgounwrappingKey 引数を入力として使用)、その結果を subtle.importKey() メソッドに入力として unwrappedKeyAlgoextractablekeyUsages 引数を使用して渡すことと同等です。成功した場合、返された Promise は <CryptoKey> オブジェクトで解決されます。

現在サポートされているラッピングアルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

サポートされているアンラップされた鍵アルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'ECDH'
  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'5
  • 'HMAC'
  • 'KMAC128'5
  • 'KMAC256'5
  • 'ML-DSA-44'4
  • 'ML-DSA-65'4
  • 'ML-DSA-87'4
  • 'ML-KEM-512'4
  • 'ML-KEM-768'4
  • 'ML-KEM-1024'4v
  • 'RSA-OAEP'
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'
  • 'X25519'
  • 'X448'5

subtle.verify(algorithm, key, signature, data)#

algorithm で指定されたメソッドとパラメータ、および key で提供された鍵マテリアルを使用して、このメソッドは signaturedata の有効な暗号署名であることを検証しようとします。返された Promise は true または false のいずれかで解決されます。

現在サポートされているアルゴリズムは以下の通りです。

  • 'ECDSA'
  • 'Ed25519'
  • 'Ed448'5
  • 'HMAC'
  • 'KMAC128'5
  • 'KMAC256'5
  • 'ML-DSA-44'4
  • 'ML-DSA-65'4
  • 'ML-DSA-87'4
  • 'RSA-PSS'
  • 'RSASSA-PKCS1-v1_5'

subtle.wrapKey(format, key, wrappingKey, wrapAlgo)#

暗号学では、「鍵のラッピング」とは、鍵マテリアルをエクスポートしてから暗号化することを指します。このメソッドは、鍵マテリアルを format で識別されるフォーマットにエクスポートし、wrapAlgo で指定されたメソッドとパラメータ、および wrappingKey で提供された鍵マテリアルを使用して暗号化します。これは、subtle.exportKey()formatkey を引数として呼び出し、その結果を subtle.encrypt() メソッドに wrappingKeywrapAlgo を入力として渡すことと同等です。成功した場合、返された Promise は暗号化された鍵データを含む <ArrayBuffer> で解決されます。

現在サポートされているラッピングアルゴリズムは以下の通りです。

  • 'AES-CBC'
  • 'AES-CTR'
  • 'AES-GCM'
  • 'AES-KW'
  • 'AES-OCB'4
  • 'ChaCha20-Poly1305'4
  • 'RSA-OAEP'

アルゴリズムパラメータ#

アルゴリズムパラメータオブジェクトは、さまざまな <SubtleCrypto> メソッドで使用されるメソッドとパラメータを定義します。ここでは「クラス」として説明されていますが、これらは単純な JavaScript のディクショナリオブジェクトです。

クラス: Algorithm#

Algorithm.name#

クラス: AeadParams#

aeadParams.additionalData#

暗号化されないが、データの認証に含まれる追加の入力です。additionalData の使用はオプションです。

aeadParams.iv#

初期化ベクトルは、特定の鍵を使用するすべての暗号化操作で一意でなければなりません。

aeadParams.name#
  • 型: <string> 'AES-GCM''AES-OCB'、または 'ChaCha20-Poly1305' でなければなりません。
aeadParams.tagLength#
  • 型: <number> 生成される認証タグのビット単位のサイズです。

クラス: AesDerivedKeyParams#

aesDerivedKeyParams.name#
  • 型: <string> 'AES-CBC''AES-CTR''AES-GCM''AES-OCB'、または 'AES-KW' のいずれかでなければなりません。
aesDerivedKeyParams.length#

導出される AES 鍵の長さです。これは 128192、または 256 のいずれかでなければなりません。

クラス: AesCbcParams#

aesCbcParams.iv#

初期化ベクトルを提供します。これは正確に 16 バイトの長さでなければならず、予測不可能で暗号学的にランダムであるべきです。

aesCbcParams.name#
  • 型: <string> 'AES-CBC' でなければなりません。

クラス: AesCtrParams#

aesCtrParams.counter#

カウンターブロックの初期値です。これは正確に 16 バイトの長さでなければなりません。

AES-CTR メソッドは、ブロックの右端の length ビットをカウンターとして使用し、残りのビットをノンスとして使用します。

aesCtrParams.length#
  • 型: <number> aesCtrParams.counter の中でカウンターとして使用されるビット数です。
aesCtrParams.name#
  • 型: <string> 'AES-CTR' でなければなりません。

クラス: AesKeyAlgorithm#

aesKeyAlgorithm.length#

AES 鍵のビット単位の長さです。

aesKeyAlgorithm.name#

クラス: AesKeyGenParams#

aesKeyGenParams.length#

生成される AES 鍵の長さです。これは 128192、または 256 のいずれかでなければなりません。

aesKeyGenParams.name#
  • 型: <string> 'AES-CBC''AES-CTR''AES-GCM'、または 'AES-KW' のいずれかでなければなりません。

クラス: Argon2Params#

argon2Params.associatedData#

オプションの関連データを表します。

argon2Params.memory#

メモリサイズをキビバイト単位で表します。並列度の 8 倍以上でなければなりません。

argon2Params.name#
  • 型: <string> 'Argon2d''Argon2i'、または 'Argon2id' のいずれかでなければなりません。
argon2Params.nonce#

ノンスを表し、パスワードハッシュアプリケーションのソルトとして機能します。

argon2Params.parallelism#

並列度を表します。

argon2Params.passes#

パス回数を表します。

argon2Params.secretValue#

オプションの秘密値を表します。

argon2Params.version#

Argon2 のバージョン番号を表します。デフォルトであり、現在定義されている唯一のバージョンは 19 (0x13) です。

クラス: ContextParams#

contextParams.name#
  • 型: <string> Ed4485'ML-DSA-44'4'ML-DSA-65'4、または 'ML-DSA-87'4 のいずれかである必要があります。
contextParams.context#

context メンバーは、メッセージに関連付けるオプションのコンテキストデータを表します。

クラス: CShakeParams#

cShakeParams.customization#

customization メンバーは、カスタマイズ文字列を表します。Node.js の Web Crypto API 実装では、長さがゼロのカスタマイズのみをサポートしており、これはカスタマイズをまったく提供しないことと同等です。

cShakeParams.functionName#

functionName メンバーは、cSHAKE に基づいて関数を定義するために NIST が使用する関数名を表します。Node.js の Web Crypto API 実装では、長さがゼロの functionName のみをサポートしており、これは functionName をまったく提供しないことと同等です。

cShakeParams.length#
  • 型: <number> 要求される出力長をビット単位で表します。
cShakeParams.name#
  • 型: <string> 'cSHAKE128'4 または 'cSHAKE256'4 のいずれかである必要があります。

クラス: EcdhKeyDeriveParams#

ecdhKeyDeriveParams.name#
  • 型: <string> 'ECDH''X25519'、または 'X448'5 のいずれかである必要があります。
ecdhKeyDeriveParams.public#

ECDH 鍵導出は、一方の当事者の秘密鍵と他方の当事者の公開鍵を入力として受け取り、両方を使用して共通の共有秘密を生成することによって動作します。ecdhKeyDeriveParams.public プロパティには、他方の当事者の公開鍵が設定されます。

クラス: EcdsaParams#

ecdsaParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

ecdsaParams.name#
  • 型: <string> 'ECDSA' である必要があります。

クラス: EcKeyAlgorithm#

ecKeyAlgorithm.name#
ecKeyAlgorithm.namedCurve#

クラス: EcKeyGenParams#

ecKeyGenParams.name#
  • 型: <string> 'ECDSA' または 'ECDH' のいずれかである必要があります。
ecKeyGenParams.namedCurve#
  • 型: <string> 'P-256''P-384''P-521' のいずれかである必要があります。

クラス: EcKeyImportParams#

ecKeyImportParams.name#
  • 型: <string> 'ECDSA' または 'ECDH' のいずれかである必要があります。
ecKeyImportParams.namedCurve#
  • 型: <string> 'P-256''P-384''P-521' のいずれかである必要があります。

クラス: EncapsulatedBits#

メッセージ暗号化のための一時的な対称秘密鍵 (<ArrayBuffer> として表される) と、この共有鍵で暗号化された暗号文 (メッセージとともにメッセージ受信者に送信可能) です。受信者は自身の秘密鍵を使用して共有鍵が何かを特定し、それによってメッセージを復号化できます。

encapsulatedBits.ciphertext#
encapsulatedBits.sharedKey#

クラス: EncapsulatedKey#

メッセージ暗号化のための一時的な対称秘密鍵 (<CryptoKey> として表される) と、この共有鍵で暗号化された暗号文 (メッセージとともにメッセージ受信者に送信可能) です。受信者は自身の秘密鍵を使用して共有鍵が何かを特定し、それによってメッセージを復号化できます。

encapsulatedKey.ciphertext#
encapsulatedKey.sharedKey#

クラス: HkdfParams#

hkdfParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

hkdfParams.info#

HKDF アルゴリズムにアプリケーション固有のコンテキスト入力を提供します。これは長さがゼロであってもかまいませんが、提供する必要があります。

hkdfParams.name#
  • 型: <string> 'HKDF' である必要があります。
hkdfParams.salt#

ソルト値は HKDF アルゴリズムの強度を大幅に向上させます。ランダムまたは擬似ランダムであるべきで、ダイジェスト関数の出力と同じ長さであるべきです (例えば、ダイジェストとして 'SHA-256' を使用する場合、ソルトは 256 ビットのランダムデータであるべきです)。

クラス: HmacImportParams#

hmacImportParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

hmacImportParams.length#

HMAC 鍵のビット数 (オプション)。これはオプションであり、ほとんどの場合省略すべきです。

hmacImportParams.name#
  • 型: <string> 'HMAC' である必要があります。

クラス: HmacKeyAlgorithm#

hmacKeyAlgorithm.hash#
hmacKeyAlgorithm.length#

HMAC 鍵の長さをビット単位で指定します。

hmacKeyAlgorithm.name#

クラス: HmacKeyGenParams#

hmacKeyGenParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

hmacKeyGenParams.length#

HMAC 鍵として生成するビット数。省略した場合、長さは使用されるハッシュアルゴリズムによって決定されます。これはオプションであり、ほとんどの場合省略すべきです。

hmacKeyGenParams.name#
  • 型: <string> 'HMAC' である必要があります。

クラス: KeyAlgorithm#

keyAlgorithm.name#

クラス: KmacImportParams#

kmacImportParams.length#

KMAC 鍵のビット数 (オプション)。これはオプションであり、ほとんどの場合省略すべきです。

kmacImportParams.name#
  • 型: <string> 'KMAC128' または 'KMAC256' である必要があります。

クラス: KmacKeyAlgorithm#

kmacKeyAlgorithm.length#

KMAC 鍵の長さをビット単位で指定します。

kmacKeyAlgorithm.name#

クラス: KmacKeyGenParams#

kmacKeyGenParams.length#

KMAC 鍵として生成するビット数。省略した場合、長さは使用される KMAC アルゴリズムによって決定されます。これはオプションであり、ほとんどの場合省略すべきです。

kmacKeyGenParams.name#
  • 型: <string> 'KMAC128' または 'KMAC256' である必要があります。

クラス: KmacParams#

kmacParams.algorithm#
  • 型: <string> 'KMAC128' または 'KMAC256' である必要があります。
kmacParams.customization#

customization メンバーは、オプションのカスタマイズ文字列を表します。

kmacParams.length#

出力の長さをバイト単位で指定します。これは正の整数でなければなりません。

クラス: Pbkdf2Params#

pbkdf2Params.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

pbkdf2Params.iterations#

PBKDF2 アルゴリズムがビットを導出する際に実行すべき反復回数。

pbkdf2Params.name#
  • 型: <string> 'PBKDF2' である必要があります。
pbkdf2Params.salt#

少なくとも 16 バイトのランダムまたは擬似ランダムなバイトであるべきです。

クラス: RsaHashedImportParams#

rsaHashedImportParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

rsaHashedImportParams.name#
  • 型: <string> 'RSASSA-PKCS1-v1_5''RSA-PSS'、または 'RSA-OAEP' のいずれかである必要があります。

クラス: RsaHashedKeyAlgorithm#

rsaHashedKeyAlgorithm.hash#
rsaHashedKeyAlgorithm.modulusLength#

RSA モジュラスのビット長。

rsaHashedKeyAlgorithm.name#
rsaHashedKeyAlgorithm.publicExponent#

RSA 公開指数。

クラス: RsaHashedKeyGenParams#

rsaHashedKeyGenParams.hash#

<string> で表される場合、値は以下のいずれかである必要があります。

  • 'SHA-1'
  • 'SHA-256'
  • 'SHA-384'
  • 'SHA-512'
  • 'SHA3-256'4
  • 'SHA3-384'4
  • 'SHA3-512'4

<Algorithm> で表される場合、オブジェクトの name プロパティは上記のいずれかの値である必要があります。

rsaHashedKeyGenParams.modulusLength#

RSA モジュラスのビット長。ベストプラクティスとして、これは少なくとも 2048 であるべきです。

rsaHashedKeyGenParams.name#
  • 型: <string> 'RSASSA-PKCS1-v1_5''RSA-PSS'、または 'RSA-OAEP' のいずれかである必要があります。
rsaHashedKeyGenParams.publicExponent#

RSA 公開指数。これは、ビッグエンディアンの符号なし整数を含む <Uint8Array> でなければならず、32ビットに収まる必要があります。<Uint8Array> には任意の数の先行ゼロビットを含めることができます。値は素数でなければなりません。異なる値を使用する理由がない限り、公開指数として new Uint8Array([1, 0, 1]) (65537) を使用してください。

クラス: RsaOaepParams#

rsaOaepParams.label#

暗号化はされませんが、生成された暗号文に紐づけられる追加のバイトのコレクション。

rsaOaepParams.label パラメータはオプションです。

rsaOaepParams.name#
  • 型: <string> 'RSA-OAEP' である必要があります。

クラス: RsaPssParams#

rsaPssParams.name#
  • 型: <string> 'RSA-PSS' である必要があります。
rsaPssParams.saltLength#

使用するランダムソルトの長さ (バイト単位)。

脚注

  1. OpenSSL >= 3.0 が必要です 2 3

  2. OpenSSL >= 3.2 が必要です 2 3

  3. OpenSSL >= 3.5 が必要です 2 3 4 5 6

  4. Web Cryptography API の最新アルゴリズムを参照してください 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

  5. Web Cryptography API の安全な曲線を参照してください 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24