このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
SubtleCrypto
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2017年9月.
* Some parts of this feature may have varying levels of support.
安全なコンテキスト用: この機能は一部またはすべての対応しているブラウザーにおいて、安全なコンテキスト (HTTPS) でのみ利用できます。
SubtleCrypto はウェブ暗号化 API のインターフェイスで、数々の低水準の暗号化関数を提供します。SubtleCrypto の機能にアクセスするには、crypto プロパティから取得したCrypto オブジェクトのsubtle プロパティを使用します。
警告:このAPIは、数多くの低レベル暗号プリミティブを提供しています。これらを悪用するのはとても簡単で、その落とし穴は非常に微妙なものです。
基本的な暗号機能を正しく使用すると想定されていても、安全な鍵管理と全体的なセキュリティシステムの設計を正しく行うのは非常に難しく、一般的にはセキュリティの専門家の領域です。
セキュリティシステムの設計と実装に誤りがあると、システムのセキュリティが完全に機能しなくなる可能性があります。
学び、実験してください。しかし、このテーマに詳しい人物が徹底的にレビューする前に、あなたの作品の安全性を保証したり、ほのめかしたりしないでください。暗号 101 コースは、安全なシステムの設計と実装するために学び始めるには最適な場所です。
In this article
インスタンスプロパティ
このインターフェイスには親インターフェイスがないので、何もプロパティを継承していません。
インスタンスメソッド
このインターフェイスには親インターフェイスがないので、何もメソッドを継承していません。
SubtleCrypto.encrypt()引数に与えられた平文テキストおよびアルゴリズム、鍵に対応する暗号化されたデータで履行される
Promiseを返します。SubtleCrypto.decrypt()引数に与えられた暗号化されたテキストおよびアルゴリズム、鍵に対応する平文データで履行される
Promiseを返します。SubtleCrypto.sign()引数に与えられたテキストおよびアルゴリズム、鍵に対応する署名で履行される
Promiseを返します。SubtleCrypto.verify()引数に与えられた署名が、同じく引数に与えられたテキストおよびアルゴリズム、鍵と一致するかどうかを示す論理値で履行される
Promiseを返します。SubtleCrypto.digest()引数に与えられたアルゴリズムとテキストから生成されたダイジェストで履行される
Promiseを返します。SubtleCrypto.generateKey()対称アルゴリズムの場合は新しく生成された
CryptoKeyで、非対称アルゴリズムの場合は新しく生成された 2 つの鍵を含むCryptoKeyPairで履行されるPromiseを返します。これらは、引数として指定されたアルゴリズム、使用法、抽出可能性と一致します。SubtleCrypto.deriveKey()引数に与えられたマスターキーと特定のアルゴリズムによりもたらされる、新たに生成された
CryptoKeyで履行されるPromiseを返します。SubtleCrypto.deriveBits()引数に与えられたマスターキーと特定のアルゴリズムによりもたらされる、新たに生成された擬似乱数のビット列を含むバッファーで履行される
Promiseを返します。SubtleCrypto.importKey()引数に与えられた書式およびアルゴリズム、生の鍵データ、使用法、抽出可能性に対応する
CryptoKeyで履行されるPromiseを返します。SubtleCrypto.exportKey()要求された書式の鍵を含むバッファーで履行される
Promiseを返します。SubtleCrypto.wrapKey()安全でない環境で使用(転送や保存)するために、ラップされた対称鍵で履行される
Promiseを返します。返されるラップされたバッファーは、引数に与えられた書式内にあり、与えられたアルゴリズムで与えられたラッピング鍵によりラップされた鍵を含みます。SubtleCrypto.unwrapKey()
SubtleCrypto の使用
この API で実装する機能は、暗号化機能と鍵管理機能の 2 つに分けることができます。
暗号化関数
これらは、システムにプライバシーや認証などのセキュリティ機能を実装するために使用することができる関数です。SubtleCrypto API は以下の暗号化関数を提供ししています。
鍵管理関数
digest() を除き、 API 内の暗号機能はすべて暗号鍵を使用しています。SubtleCrypto API では、暗号鍵はCryptoKey オブジェクトを使用して表します。署名や暗号化などの演算処理を実行するには、CryptoKey オブジェクトをsign() またはencrypt() 関数に渡します。
キーの生成と導出
generateKey() およびderiveKey() 関数は、どちらも新しいCryptoKey オブジェクトを作成します。
この違いは、generateKey() が呼び出すたびに新しい鍵を生成するのに対し、deriveKey() は最初の鍵素材から鍵を導出する点です。同じ鍵素材を 2 回に分けてderiveKey() を呼び出すと、同じ基盤値がある 2 つのCryptoKey オブジェクトを取得することができます。この例は、例えばパスワードから暗号鍵を導出し、後で同じパスワードから同じ鍵を導出してデータを復号したい場合に有益です。
鍵のインポートとエクスポート
アプリの外部で鍵を利用できるようにするには、鍵をエクスポートする必要があります。それがexportKey() です。エクスポート形式はいくつか選べます。
exportKey() の逆はimportKey() です。他のシステムから鍵をインポートすることができ、PKCS #8 やJSON Web Key のような標準形式に対応しているため、これを支援することができます。exportKey() 関数は暗号化されていない形式で鍵をエクスポートします。
鍵が機密性の高いものである場合、wrapKey() を使用してください。これは鍵をエクスポートし、別の鍵を使用して暗号化するもので、 API では「鍵ラッピング鍵」と呼ばれています。
wrapKey() の逆はunwrapKey() で、鍵を復号してからインポートします。
鍵の格納
CryptoKey オブジェクトは、構造化複製アルゴリズムを使用して格納することができます。すなわち、標準のウェブストレージ API を使用して、鍵を格納したり受け取ったりすることができます。この仕様書では、ほとんどの開発者がIndexedDB API を使用してCryptoKey オブジェクトを格納することを想定しています。
対応しているアルゴリズム
ウェブ暗号 API が提供した暗号関数は、 1 つ以上の異なる「暗号アルゴリズム」によって実行することができます。関数のalgorithm 引数は、使用するアルゴリズムを示します。アルゴリズムによっては追加の引数が必要です。このような場合、algorithm 引数は追加の引数を含めるために辞書オブジェクトになります。
下記の表は、どのアルゴリズムがどの暗号処理を運営するのに適しているかをまとめたものです。
| sign() verify() | encrypt() decrypt() | digest() | deriveBits() deriveKey() | wrapKey() unwrapKey() | |
|---|---|---|---|---|---|
| RSASSA-PKCS1-v1_5 | ✓ | ||||
| RSA-PSS | ✓ | ||||
| ECDSA | ✓ | ||||
| HMAC | ✓ | ||||
| RSA-OAEP | ✓ | ✓ | |||
| AES-CTR | ✓ | ✓ | |||
| AES-CBC | ✓ | ✓ | |||
| AES-GCM | ✓ | ✓ | |||
| SHA-1 | ✓ | ||||
| SHA-256 | ✓ | ||||
| SHA-384 | ✓ | ||||
| SHA-512 | ✓ | ||||
| ECDH | ✓ | ||||
| HKDF | ✓ | ||||
| PBKDF2 | ✓ | ||||
| AES-KW | ✓ |
仕様書
| Specification |
|---|
| Web Cryptography Level 2> # subtlecrypto-interface> |
ブラウザーの互換性
関連情報
- ウェブ暗号化 API
- SubtleCrypto の暗号以外の使用法
- ウェブセキュリティ
- プライバシー、権限、情報セキュリティについて
CryptoおよびCrypto.subtle.- Crypto 101: 暗号化の入門コースです(英語)。