1

我正在使用带有以下代码的浏览器加密 API生成和导出 JSON Web 密钥 (jwk)(请参阅RFC 7517 ) (感谢GitHub 上这个出色的 webCrypto 示例页面):

async function makeKey(){
  const key = await window.crypto.subtle.generateKey(
    { name: "AES-CTR", length: 128 },
    false,
    ["encrypt", "decrypt"]
  )
  return window.crypto.subtle.exportKey("jwk", key)
}

我得到的是一个带有许多属性的 JSON 对象,与MDN 文档中的非常相似,看起来像这样:

{
  alg: "A256CTR",
  ext: true,
  k: "...", //the actual key, a random string of characters
  key_ops: undefined,
  kty: "oct"
}

所有上述属性都在上面链接的 RFC 中定义,除了ext. 我查看了许多来源(包括但不仅是 MDN 和 RFC),但似乎找不到定义。虽然一切都很好,只是按照上面的定义保留它,但我更愿意(特别是对于类似的东西crypto)知道一切都是为了什么。那么,extjwk 属性的目的是什么?

4

1 回答 1

1

我终于在w3 webCrypto API 文档中找到了对此的参考。

它是对 jwk 规范的扩展。JsonWebKey 字典的第 15 节有以下定义:

dictionary JsonWebKey {
  // The following fields are defined in Section 3.1 of JSON Web Key
  DOMString kty;
  DOMString use;
  sequence<DOMString> key_ops;
  DOMString alg;

  // The following fields are defined in JSON Web Key Parameters Registration
  boolean ext;

  // The following fields are defined in Section 6 of JSON Web Algorithms
  DOMString crv;
  DOMString x;
  DOMString y;
  DOMString d;
  DOMString n;
  DOMString e;
  DOMString p;
  DOMString q;
  DOMString dp;
  DOMString dq;
  DOMString qi;
  sequence<RsaOtherPrimesInfo> oth;
  DOMString k;
};

这导致了JSON Web Key Parameters Registration部分,该部分将其定义为缩写extractable,从文档其余部分的上下文中,指示是否可以导出密钥。

鉴于 jwt 是通过导出它生成的,这将始终true适用于由此生成的任何密钥,但是false在导入密钥之前将其设置为会阻止它被重新导出。

于 2020-01-24T13:26:43.187 回答