aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/subtlecrypto
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
commit33058f2b292b3a581333bdfb21b8f671898c5060 (patch)
tree51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/api/subtlecrypto
parent8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff)
downloadtranslated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2
translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip
initial commit
Diffstat (limited to 'files/zh-cn/web/api/subtlecrypto')
-rw-r--r--files/zh-cn/web/api/subtlecrypto/decrypt/index.html94
-rw-r--r--files/zh-cn/web/api/subtlecrypto/encrypt/index.html249
-rw-r--r--files/zh-cn/web/api/subtlecrypto/index.html334
3 files changed, 677 insertions, 0 deletions
diff --git a/files/zh-cn/web/api/subtlecrypto/decrypt/index.html b/files/zh-cn/web/api/subtlecrypto/decrypt/index.html
new file mode 100644
index 0000000000..2f303bda6c
--- /dev/null
+++ b/files/zh-cn/web/api/subtlecrypto/decrypt/index.html
@@ -0,0 +1,94 @@
+---
+title: SubtleCrypto.decrypt()
+slug: Web/API/SubtleCrypto/decrypt
+translation_of: Web/API/SubtleCrypto/decrypt
+---
+<p>{{APIRef("Web Crypto API")}}</p>
+
+<p><code><strong>SubtleCrypto.decrypt()</strong></code> 以加密数据、算法和密钥为参数返回一个包含明文的 {{jsxref("Promise")}} 对象。</p>
+
+<h2 id="语法">语法</h2>
+
+<pre class="syntaxbox">var <em>result</em> = crypto<code>.subtle.decrypt(<em>algorithm</em>, <em>key</em>, <em>data</em>)</code>;
+</pre>
+
+<h3 id="属性">属性</h3>
+
+<ul>
+ <li><em><code>algorithm</code></em> 是一个对象,用于指定解密函数及其参数。当没有参数时,<em>algorithm</em> 也可以是包含了算法名称的 {{domxref("DOMString")}} 对象。支持的值<a href="https://www.w3.org/TR/WebCryptoAPI/#algorithm-overview">¹</a> 如下:
+
+ <ul>
+ <li><code>{"name": "<a href="https://www.w3.org/TR/WebCryptoAPI/#dfn-AesCbcParams">AES-CBC</a>", iv}</code> <code><em>iv</em></code> 与 {{domxref("SubtleCrypto.encrypt()")}} 中描述的相同。</li>
+ <li><code>{"name": "<a href="https://www.w3.org/TR/WebCryptoAPI/#dfn-AesCtrParams">AES-CTR</a>", counter, length}</code> <code><em>counter</em></code> 和<code><em>length</em></code> 与 {{domxref("SubtleCrypto.encrypt()")}} 中描述的相同</li>
+ <li><code>{"name": "<a href="https://www.w3.org/TR/WebCryptoAPI/#dfn-AesGcmParams">AES-GCM</a>", iv[, additionalData, tagLength]}</code> <code><em>iv</em></code>, <code><em>additionalData</em></code>和 <code><em>tagLength</em></code> 与 {{domxref("SubtleCrypto.encrypt()")}} 中描述的相同。</li>
+ <li><code>{"name": "<a href="https://www.w3.org/TR/WebCryptoAPI/#dfn-RsaOaepParams">RSA-OAEP</a>"[, label]}</code> <code><em>label</em></code> 与 {{domxref("SubtleCrypto.encrypt()")}} 中描述的相同。</li>
+ </ul>
+ </li>
+ <li><code><em>key</em></code> 是一个包含了密钥的 {{domxref("CryptoKey")}} 对象,用于解密。</li>
+ <li><em><code>data</code></em> 是一个包含了待解密的密文的 {{domxref("BufferSource")}} 对象。</li>
+</ul>
+
+<h3 id="返回值">返回值</h3>
+
+<ul>
+ <li><code><em>result</em></code> 是一个 {{jsxref("Promise")}} 对象,它会返回由{{glossary("ciphertext")}} 解密的得来的 {{glossary("plaintext")}}。</li>
+</ul>
+
+<h3 id="异常">异常</h3>
+
+<p>Promise 将会在以下的异常被触发时返回 rejected:</p>
+
+<dl>
+ <dt>InvalidAccessError</dt>
+ <dd>当提供的密钥无法执行请求的操作时(如:解密算法无效,或对指定的解密算法提供了无效的密钥)。</dd>
+ <dt>OperationError</dt>
+ <dd>因特定的操作原因导致操作失败时(如:算法的参数大小无效,或解密结果失败)。</dd>
+</dl>
+
+<h2 id="实例">实例</h2>
+
+<pre class="brush: js">const decryptText = async (ctBuffer, iv, password) =&gt; {
+    const pwUtf8 = new TextEncoder().encode(password);
+    const pwHash = await crypto.subtle.digest('SHA-256', pwUtf8);
+
+    const alg = { name: 'AES-GCM', iv: iv };
+    const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['decrypt']);
+
+    const ptBuffer = await crypto.subtle.decrypt(alg, key, ctBuffer);
+
+    const plaintext = new TextDecoder().decode(ptBuffer);
+
+    return plaintext;
+}</pre>
+
+<p><code><em>iv</em></code> 的含义在 {{domxref("SubtleCrypto.encrypt()")}} 中可以找到。<code><em>ctBuffer</em></code> 是 {{domxref("SubtleCrypto.encrypt()")}} 返回的密文。</p>
+
+<h2 id="规范">规范</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Specification</th>
+ <th scope="col">Status</th>
+ <th scope="col">Comment</th>
+ </tr>
+ <tr>
+ <td>{{ SpecName('Web Crypto API', '#SubtleCrypto-method-decrypt', 'SubtleCrypto.decrypt()') }}</td>
+ <td>{{ Spec2('Web Crypto API') }}</td>
+ <td>Initial definition.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="浏览器支持">浏览器支持</h2>
+
+
+
+<p>{{Compat("api.SubtleCrypto.decrypt")}}</p>
+
+<h2 id="另请参见">另请参见</h2>
+
+<ul>
+ <li>{{domxref("Crypto")}} 与 {{domxref("Crypto.subtle")}}。</li>
+ <li>{{domxref("SubtleCrypto")}} 包含了该接口。</li>
+</ul>
diff --git a/files/zh-cn/web/api/subtlecrypto/encrypt/index.html b/files/zh-cn/web/api/subtlecrypto/encrypt/index.html
new file mode 100644
index 0000000000..a135fe54ff
--- /dev/null
+++ b/files/zh-cn/web/api/subtlecrypto/encrypt/index.html
@@ -0,0 +1,249 @@
+---
+title: SubtleCrypto.encrypt()
+slug: Web/API/SubtleCrypto/encrypt
+tags:
+ - API
+ - Crypto
+ - 加密
+translation_of: Web/API/SubtleCrypto/encrypt
+---
+<p>{{APIRef("Web Crypto API")}}</p>
+
+<p><code><strong>SubtleCrypto.encrypt()</strong></code> 方法以算法、密钥、明文为参数返回一个包含加密数据的 {{jsxref("Promise")}} 对象。</p>
+
+<h2 id="语法">语法</h2>
+
+<pre class="syntaxbox">var <em>result</em> = <em>crypto</em><code>.encrypt(<em>algo</em>, <em>key</em>, <em>cleartext</em>)</code>;
+</pre>
+
+<h3 id="参数">参数</h3>
+
+<ul>
+ <li><em><code>algo</code></em> 是一个使用加密函数的对象或者 {{domxref("DOMString")}},后者是 <code>{"name": algo}</code> 的缩写。支持的值是:
+
+ <ul>
+ <li><code>{"name": "AES-CBC", iv}</code> <code><em>iv</em></code> 是具有16个随机字节的 {{jsxref("ArrayBuffer")}} 或 {{jsxref("ArrayBufferView")}}  (这些应该由 {{domxref("RandomSource.getRandomValues()")}} 生成)。</li>
+ <li><code>{"name": "AES-CTR", counter, length}</code></li>
+ <li><code>{"name": "AES-GCM", iv, additionalData, tagLength}</code> (<em><code>additionalData</code></em> 和 <code><em>tagLength</em></code> 是可选的)</li>
+ <li><code>{"name": "RSA-OAEP", label}</code> (<code><em>label</em></code> 是可选的)</li>
+ </ul>
+ </li>
+ <li><code><em>key</em></code> 是一个包含签名密钥的 {{domxref("CryptoKey")}}。</li>
+ <li><em><code>cleartext </code></em><code>是一个包含需要加密的明文</code> {{jsxref("ArrayBuffer")}} 或者 {{jsxref("ArrayBufferView")}} 对象。</li>
+</ul>
+
+<h3 id="返回值">返回值</h3>
+
+<ul>
+ <li><font face="Consolas, Liberation Mono, Courier, monospace">返回值是一个 </font>{{jsxref("Promise")}} 对象,返回一个由 {{glossary("cleartext")}} 加密生成的 {{glossary("ciphertext")}} 的 {{jsxref("ArrayBuffer")}}。</li>
+</ul>
+
+<h3 id="异常">异常</h3>
+
+<p>当遇到以下异常时,promise 将会返回一次错误(reject):</p>
+
+<dl>
+ <dt>InvalidAccessError</dt>
+ <dd>当针对提供的 key 值执行的操作无效时(例如加密算法或者 key 值无效),将会抛出该错误。</dd>
+</dl>
+
+<dl>
+ <dt>OperationError</dt>
+ <dd>发生于由于特定于操作的原因使得操作失败时,例如算法参数的大小无效,或者 AES-GCM 明文长度超过 2³⁹−256 字节。</dd>
+</dl>
+
+<h2 id="支持的算法">支持的算法</h2>
+
+<p>Crypto 接口提供了支持 <code>encrypt()</code> 和 <code>decrypt()</code> 操作的四种算法。</p>
+
+<p>其中的 RSA-OAEP 算法是一种非对称加密的公钥密码({{Glossary("public-key cryptography", "public-key cryptosystem")}})。</p>
+
+<p>其它三种算法则都是对称密钥加密({{Glossary("Symmetric-key cryptography", "symmetric algorithms")}}),并且它们都是基于同一种基础加密,即 AES (Advanced Encryption Standard)。它们不同之处在于分组加密的操作方式({{Glossary("Block cipher mode of operation", "mode")}})。Crypto 接口支持以下三种 AES 加密类型:</p>
+
+<ul>
+ <li>CTR (Counter Mode)</li>
+ <li>CBC (Cipher Block Chaining)</li>
+ <li>GCM (Galois/Counter Mode)</li>
+</ul>
+
+<p>这里强烈建议使用<em><strong>认证加密</strong></em>(<em>authenticated encryption</em>),它可以检测密文是否已被攻击者篡改。使用认证也可以避免<em>选择密文攻击</em>(<em>chosen-ciphertext</em> attacks),即攻击者可以请求系统解密任意的消息,然后使用解密结果来倒推出关于密钥的一些信息。虽然 CTR 和 CBC 模式可以添加认证,但是它们默认不提供该操作,并且在手动实现它们的时候,很同意犯一些微小但严重的错误。GCM 不支持内置的认证,由于这个原因,常常推荐使用另外两种  AES 加密算法。</p>
+
+<h3 id="RSA-OAEP">RSA-OAEP</h3>
+
+<p>关于 RSA-OAEP 公钥加密算法的规范位于 <a href="https://tools.ietf.org/html/rfc3447">RFC 3447</a>。</p>
+
+<h3 id="AES-CTR">AES-CTR</h3>
+
+<p>使用 Counter 模式的 AES 算法,相关规范位于 <a href="https://csrc.nist.gov/publications/detail/sp/800-38a/final">NIST SP800-38A</a>。</p>
+
+<h3 id="AES-CBC">AES-CBC</h3>
+
+<p>使用 Cipher Block Chaining 模式的 AES 算法,规范位于<a href="https://csrc.nist.gov/publications/detail/sp/800-38a/final">NIST SP800-38A</a>。</p>
+
+<h3 id="AES-GCM">AES-GCM</h3>
+
+<p>使用 Galois/Counter 模式的 AES 算法,规范位于 <a href="https://csrc.nist.gov/publications/detail/sp/800-38d/final">NIST SP800-38D</a>。</p>
+
+<p>这种模式与上面的模式不同之处在于,GCM 是一种 "认证(authenticated)" 模式,意思就是它包含了检测密文是否未被攻击者篡改的功能。</p>
+
+<h2 id="示例">示例</h2>
+
+<div class="blockIndicator note">
+<p><strong>注意</strong>: 你可以在 GitHub 尝试这个示例(<a href="https://mdn.github.io/dom-examples/web-crypto/encrypt-decrypt/index.html">try the working examples</a>)。</p>
+</div>
+
+<h3 id="RSA-OAEP_2">RSA-OAEP</h3>
+
+<p>以下代码获取文本框中的内容,编码后进行加密,使用的算法为 RSA-OAEP。可以在 GitHub 查看完整代码:<a href="https://github.com/mdn/dom-examples/blob/master/web-crypto/encrypt-decrypt/rsa-oaep.js" rel="noopener">See the complete code on GitHub</a>。</p>
+
+<pre>function getMessageEncoding() {
+ const messageBox = document.querySelector(".rsa-oaep #message");
+ let message = messageBox.value;
+ let enc = new TextEncoder();
+ return enc.encode(message);
+}
+
+function encryptMessage(publicKey) {
+ let encoded = getMessageEncoding();
+ return window.crypto.subtle.encrypt(
+ {
+ name: "RSA-OAEP"
+ },
+ publicKey,
+ encoded
+ );
+}</pre>
+
+<h3 id="AES-CTR_2">AES-CTR</h3>
+
+<p>以下代码同样获取文本框内容,进行编码后使用 AES 的 CTR 模式加密,完整代码:<a href="https://github.com/mdn/dom-examples/blob/master/web-crypto/encrypt-decrypt/aes-ctr.js" rel="noopener">See the complete code on GitHub</a>。</p>
+
+<pre>function getMessageEncoding() {
+ const messageBox = document.querySelector(".aes-ctr #message");
+ let message = messageBox.value;
+ let enc = new TextEncoder();
+ return enc.encode(message);
+}
+
+function encryptMessage(key) {
+ let encoded = getMessageEncoding();
+ // counter will be needed for decryption
+ counter = window.crypto.getRandomValues(new Uint8Array(16));
+ return window.crypto.subtle.encrypt(
+ {
+ name: "AES-CTR",
+ counter,
+ length: 64
+ },
+ key,
+ encoded
+ );
+}
+</pre>
+
+<pre>let iv = new Uint8array(16);
+let key = new Uint8array(16);
+let data = new Uint8array(12345);
+//crypto functions are wrapped in promises so we have to use await and make sure the function that
+//contains this code is an async function
+//encrypt function wants a cryptokey object
+const key_encoded = await crypto.subtle.importKey( "raw", key.buffer, 'AES-CTR' , false, ["encrypt", "decrypt"]);
+const encrypted_content = await window.crypto.subtle.encrypt(
+ {
+ name: "AES-CTR",
+ counter: iv,
+ length: 128
+ },
+ key_encoded,
+ data
+ );
+
+//Uint8array
+console.log(encrypted_content);</pre>
+
+<h3 id="AES-CBC_2">AES-CBC</h3>
+
+<p>使用 AES 的 CBC 模式加密,完整代码:<a href="https://github.com/mdn/dom-examples/blob/master/web-crypto/encrypt-decrypt/aes-cbc.js" rel="noopener">See the complete code on GitHub</a>。</p>
+
+<pre>function getMessageEncoding() {
+ const messageBox = document.querySelector(".aes-cbc #message");
+ let message = messageBox.value;
+ let enc = new TextEncoder();
+ return enc.encode(message);
+}
+
+function encryptMessage(key) {
+ let encoded = getMessageEncoding();
+ // iv will be needed for decryption
+ iv = window.crypto.getRandomValues(new Uint8Array(16));
+ return window.crypto.subtle.encrypt(
+ {
+ name: "AES-CBC",
+ iv
+ },
+ key,
+ encoded
+ );
+}</pre>
+
+<h3 id="AES-GCM_2">AES-GCM</h3>
+
+<p>使用 AES 的 GCM 模式加密,完整代码:<a href="https://github.com/mdn/dom-examples/blob/master/web-crypto/encrypt-decrypt/aes-gcm.js" rel="noopener">See the complete code on GitHub</a>。</p>
+
+<pre>function getMessageEncoding() {
+ const messageBox = document.querySelector(".aes-gcm #message");
+ let message = messageBox.value;
+ let enc = new TextEncoder();
+ return enc.encode(message);
+}
+
+function encryptMessage(key) {
+ let encoded = getMessageEncoding();
+ // iv will be needed for decryption
+ iv = window.crypto.getRandomValues(new Uint8Array(12));
+ return window.crypto.subtle.encrypt(
+ {
+ name: "AES-GCM",
+ iv: iv
+ },
+ key,
+ encoded
+ );
+}</pre>
+
+
+
+<h2 id="规范">规范</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Specification</th>
+ <th scope="col">Status</th>
+ <th scope="col">Comment</th>
+ </tr>
+ <tr>
+ <td>{{ SpecName('Web Crypto API', '#dfn-SubtleCrypto-method-encrypt', 'SubtleCrypto.encrypt()') }}</td>
+ <td>{{ Spec2('Web Crypto API') }}</td>
+ <td>Initial definition.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="浏览器兼容性">浏览器兼容性</h2>
+
+<div class="hidden">
+<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
+</div>
+
+<p>{{Compat("api.SubtleCrypto.encrypt")}}</p>
+
+<h2 id="另见">另见</h2>
+
+<ul>
+ <li>{{domxref("SubtleCrypto.decrypt()")}}.</li>
+ <li><a href="https://tools.ietf.org/html/rfc3447">RFC 3447</a> specifies RSAOAEP.</li>
+ <li><a href="https://csrc.nist.gov/publications/detail/sp/800-38a/final">NIST SP800-38A</a> specifies CTR mode.</li>
+ <li><a href="https://csrc.nist.gov/publications/detail/sp/800-38a/final">NIST SP800-38A</a> specifies CBC mode.</li>
+ <li><a href="https://csrc.nist.gov/publications/detail/sp/800-38d/final">NIST SP800-38D</a> specifies GCM mode.</li>
+</ul>
diff --git a/files/zh-cn/web/api/subtlecrypto/index.html b/files/zh-cn/web/api/subtlecrypto/index.html
new file mode 100644
index 0000000000..24dec9a283
--- /dev/null
+++ b/files/zh-cn/web/api/subtlecrypto/index.html
@@ -0,0 +1,334 @@
+---
+title: SubtleCrypto
+slug: Web/API/SubtleCrypto
+tags:
+ - 加密
+translation_of: Web/API/SubtleCrypto
+---
+<p>{{APIRef("Web Crypto API")}}</p>
+
+<p>基于<a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API">Web Crypto API</a>的<strong>SubtleCrypto</strong> 接口提供了许多底层加密功能。它通过窗口上下文提供可用的{{domxref("Crypto.subtle")}} 属性来访问(通过{{domxref("Window.crypto")}})。</p>
+
+<div class="warning">
+<p>注意: 此API提供了许多底层加密源语。滥用他们很容易陷入微妙的陷阱中。</p>
+
+<p>即使你正确的使用基础加密方法,也很难设计一套正确的安全密钥管理及整体安全设计方案,这些往往是安全专家的领域。</p>
+
+<p>错误的安全系统设计和实现会使系统的安全性完全失效</p>
+
+<p><strong>如果你不知道此API能为你提供什么,则不应该使用该API</strong></p>
+</div>
+
+<h2 id="概览">概览</h2>
+
+<p>我们可以将此API的功能分为两类:加密功能和密钥管理功能。</p>
+
+<h3 id="加密功能">加密功能</h3>
+
+<p>这些函数你可以用来实现系统中的隐私和身份验证等安全功能。<strong>SubtleCrypto </strong>API提供了如下加密函数:</p>
+
+<p>* <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign">sign()</a></code> 、 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify">verify()</a></code>: 创建和验证数字签名。<br>
+ * <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt">encrypt()</a></code> and <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/decrypt">decrypt()</a></code>: 加密和解密数据。<br>
+ * <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest">digest()</a></code>: create a fixed-length, collision-resistant digest of some data.</p>
+
+<h3 id="密钥管理功能">密钥管理功能</h3>
+
+<p>除了 <code>digest()</code>,在<strong>SubtleCrypto </strong>API中所有加密功能都会使用密钥,并使用CryptoKey对象表示加密密钥。要执行签名和加密操作, 请将 <code>CryptoKey</code> 对象传参给 <code>sign()</code> 或 <code>encrypt()</code> 函数.</p>
+
+<h4 id="生成和派生密钥"><strong>生成和派生密钥</strong></h4>
+
+<p><code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey">generateKey()</a></code> 和 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey">deriveKey()</a></code> 函数都可以创建一个新的 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/CryptoKey">CryptoKey</a></code> 对象。</p>
+
+<p>不同之处在于 <code>generateKey()</code> 每次都会生成一个新的键值对, 而 <code>deriveKey()</code> 通过从基础密钥资源中生成一个新的密钥。如果为两个独立的<code>deriveKey()</code>提供相同的基础密钥资源,那么你会获得两个具有相同基础值的 <code>CryptoKey</code> 对象。如果你想通过密码派生加密密钥,然后从相同的密码派生相同的密钥以解密数据,那么这将会非常有用。</p>
+
+<h4 id="导入和导出密钥">导入和导出密钥</h4>
+
+<p>要在应用程序外部使密钥可用,您需要导出密钥,<code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey">exportKey()</a> </code>可以为你提供该功能。你可以选择多种导出格式。</p>
+
+<p><code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey">importKey()</a></code>与 <code>exportKey()</code> 刚好相反。你可以从其他系统导入密钥,并且支持像 <a href="https://tools.ietf.org/html/rfc5208">PKCS #8</a> 和 <a href="https://tools.ietf.org/html/rfc7517">JSON Web Key</a> 这样可以帮助你执行此操作的标准格式。<code>exportKey()</code> 函数以非标准格式导出密钥。</p>
+
+<p>如果密钥是敏感的,你需要使用 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/wrapKey">wrapKey()</a></code>, 该函数导出密钥并且使用另外一个密钥加密它。</p>
+
+<p><code><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/unwrapKey">unwrapKey()</a><font face="Arial, x-locale-body, sans-serif"><span style="background-color: #ffffff;">与</span></font></code><code>wrapKey()</code>相反,该函数解密密钥后导入解密的密钥</p>
+
+<h4 id="存储密钥">存储密钥</h4>
+
+<p><code>CryptoKey</code>对象可以通过 <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm">structured clone algorithm</a></code>来存储,这意味着你可以通过web storage APIs来存储和获取他们。更为规范的方式是通过使用<code><a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API">IndexedDB API</a></code> 来存储<code>CryptoKey</code>对象。</p>
+
+<h3 id="支持的算法">支持的算法</h3>
+
+<p><code>Web Crypto API</code>提供的加密函数可以由一个或多个不同的加密算法执行:</p>
+
+<p>函数可以通过参数来指定使用的算法。一些算法需要额外的参数,在这些情况下通过将算法参数作为对象字典传入额外的参数中实现。</p>
+
+<p>下表总结了哪些算法适用于哪些加密操作:</p>
+
+<table>
+ <thead>
+ <tr>
+ <th scope="row"> </th>
+ <th scope="col">
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/sign">sign()</a></p>
+
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify">verify()</a></p>
+ </th>
+ <th scope="col">
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt">encrypt()</a></p>
+
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/decrypt">decrypt()</a></p>
+ </th>
+ <th scope="col"><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest">digest()</a></th>
+ <th scope="col">
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits">deriveBits()</a></p>
+
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey">deriveKey()</a></p>
+ </th>
+ <th scope="col">
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/wrapKey">wrapKey()</a></p>
+
+ <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/unwrapKey">unwrapKey()</a></p>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th scope="row">RSASSA-PKCS1-v1_5</th>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">RSA-PSS</th>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">ECDSA</th>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">HMAC</th>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">RSA-OAEP</th>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ </tr>
+ <tr>
+ <th scope="row">AES-CTR</th>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ </tr>
+ <tr>
+ <th scope="row">AES-CBC</th>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ </tr>
+ <tr>
+ <th scope="row">AES-GCM</th>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ </tr>
+ <tr>
+ <th scope="row">SHA-1</th>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">SHA-256</th>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">SHA-384</th>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">SHA-512</th>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">ECDH</th>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">HKDF</th>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">PBKDF2</th>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <th scope="row">AES-KW</th>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td>✓</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="属性">属性</h2>
+
+<p><em>此接口既不继承也不实现任何属性。</em></p>
+
+<h2 id="方法">方法</h2>
+
+<p><em>此接口不继承任何方法。</em></p>
+
+<dl>
+ <dt>{{domxref("SubtleCrypto.encrypt()")}}</dt>
+ <dd><code>以算法、密钥、</code>明文<code>为参数,返回一个包含加密数据的 </code>{{jsxref("Promise")}}对象。</dd>
+ <dt>{{domxref("SubtleCrypto.decrypt()")}}</dt>
+ <dd><code>以算法、密钥、</code>明文<code>为参数,返回一个包含解密数据的 </code>{{jsxref("Promise")}}对象。</dd>
+ <dt>{{domxref("SubtleCrypto.sign()")}}</dt>
+ <dd>以文本、算法和密码为参数,返回一个包含签名的 {{jsxref("Promise")}}。</dd>
+ <dt>{{domxref("SubtleCrypto.verify()")}}</dt>
+ <dd>以签名、与之匹配的文本、算法、密码为参数,验证签名的真实性,返回一个包含布尔型的 {jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.digest()")}}</dt>
+ <dd>以生成摘要的算法和文本作为参数,返回一个包含数据摘要的 {{jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.generateKey()")}}</dt>
+ <dd>以给出的用法和返可提取性作为参数,返回一个包含用于对称算法的新生成的 {{domxref("CryptoKey")}} 或者包含两个新的生成的密钥用于非对称加密的 {{domxref("CryptoKeyPair")}} 的 {{jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.deriveKey()")}}</dt>
+ <dd>以从 master key 派生出来的密钥和特定的算法作为参数,返回一个包含新生成的 {{domxref("CryptoKey")}}  的 {{jsxref("Promise")}}对象。</dd>
+ <dt>{{domxref("SubtleCrypto.deriveBits()")}}</dt>
+ <dd>以从 master key 派生出来的密钥和特定的算法作为参数,返回一个包含新生成的伪随机字节的 Buffer的 {{jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.importKey()")}}</dt>
+ <dd>以格式、算法、原始密钥数据、用途和可提取性作为参数,返回一个包含 {{domxref("CryptoKey")}} 的 {{jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.exportKey()")}}</dt>
+ <dd>返回一个包含所请求格式的密钥的 Buffer 的 {{jsxref("Promise")}} 对象。</dd>
+ <dt>{{domxref("SubtleCrypto.wrapKey()")}}</dt>
+ <dd>返回一个包含在不安全环境中使用(传输,存储)的包裹对称密钥的 {{jsxref("Promise")}} 对象。返回的被包裹的缓冲数据是按照参数中给出的格式的,包含使用给定算法的给予包装密钥包裹的密钥。</dd>
+ <dt>{{domxref("SubtleCrypto.unwrapKey()")}}</dt>
+ <dd>返回一个包含对应于参数中给出的包裹密钥的 {{domxref("CryptoKey")}} 的 {{jsxref("Promise")}} 对象。</dd>
+</dl>
+
+<h2 id="规范">规范</h2>
+
+<table class="standard-table">
+ <tbody>
+ <tr>
+ <th scope="col">Specification</th>
+ <th scope="col">Status</th>
+ <th scope="col">Comment</th>
+ </tr>
+ <tr>
+ <td>{{ SpecName('Web Crypto API', '#subtlecrypto-interface', 'SubtleCrypto') }}</td>
+ <td>{{ Spec2('Web Crypto API') }}</td>
+ <td>Initial definition.</td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="浏览器支持">浏览器支持</h2>
+
+<p>{{ CompatibilityTable() }}</p>
+
+<div id="compat-desktop">
+<table class="compat-table">
+ <tbody>
+ <tr>
+ <th>Feature</th>
+ <th>Chrome</th>
+ <th>Firefox (Gecko)</th>
+ <th>Internet Explorer</th>
+ <th>Opera</th>
+ <th>Safari</th>
+ </tr>
+ <tr>
+ <td>Basic support</td>
+ <td>{{ CompatChrome(37) }}</td>
+ <td>{{ CompatGeckoDesktop(34) }}</td>
+ <td>{{ CompatNo() }}</td>
+ <td>{{ CompatUnknown() }}</td>
+ <td>{{ CompatNo }}</td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<div id="compat-mobile">
+<table class="compat-table">
+ <tbody>
+ <tr>
+ <th>Feature</th>
+ <th>Android</th>
+ <th>Chrome for Android</th>
+ <th>Firefox Mobile (Gecko)</th>
+ <th>IE Mobile</th>
+ <th>Opera Mobile</th>
+ <th>Safari Mobile</th>
+ </tr>
+ <tr>
+ <td>Basic support</td>
+ <td>37</td>
+ <td>{{ CompatChrome(37) }}</td>
+ <td>{{ CompatGeckoMobile(34) }}</td>
+ <td>{{ CompatNo }}</td>
+ <td>{{ CompatUnknown() }}</td>
+ <td>{{ CompatNo }}</td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<h2 id="另见">另见</h2>
+
+<ul>
+ <li>{{domxref("Crypto")}} 和 {{domxref("Crypto.subtle")}}.</li>
+ <li><a href="https://www.crypto101.io/">Crypto 101</a>: an introductory course on cryptography.</li>
+</ul>