请问如何为Web Crypto生成的密钥设置种子,熵或默认字符串,以使其具有确定性

nic*_*way 6 javascript cryptography webcrypto-api

很难为javascript中的Web Crypto API设置熵或种子。

为什么会这样呢?这会使开发人员感到困难吗?

设置种子可让您确定地运行样本数据。Web Crypto API也恰好被烘焙到我正在使用的库中。我尝试实现的库的这一功能也几乎被放弃了,因为这个问题有多难。

小智 0

我不能 100% 确定实际问题是什么,所以我提供一个通用答案。

您可以使用 HDKF 密钥 ( https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#hkdf ) 作为高熵基本密钥来派生其他密钥。

从https://github.com/mdn/dom-examples/blob/main/web-crypto/derive-key/hkdf.js复制粘贴

  async function deriveSharedSecret(privateKey, publicKey) {
    const secret = await window.crypto.subtle.deriveBits(
      { name: "ECDH", public: publicKey },
      privateKey,
      384
    );

    return window.crypto.subtle.importKey(
      "raw",
      secret,
      { name: "HKDF" },
      false,
      ["deriveKey"]
    );
  }
Run Code Online (Sandbox Code Playgroud)

您将注意到私钥和公钥对作为deriveSharedSecret 的输入。ECDH 是生成该对的一种方法。请参阅https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits。如果您的代码是在安全服务器环境上运行的服务,您可以生成并导出密钥(请参阅https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey)作为您的构建或设置过程,并在服务启动时将其加载到您的服务中(请参阅https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey)。这样,初始的高熵密钥将是确定性的。

您应该根据您的安全需求设计您的 WebCrypto 密钥用法(算法和流程)。

HDKF 的好处之一是它在派生子密钥时支持可选的非秘密盐。这可用于为每个会话或每个目的或两者生成盐,从而为应用程序内每个用例的高熵基本密钥添加一定程度的随机性。请参阅https://datatracker.ietf.org/doc/html/rfc5869#section-3.1

高熵基本密钥应被视为绝密。不应将其保存到版本控制中或读取不安全的存储桶。它不应该是任何客户端应用程序的一部分。它可以从安全存储加载,例如 AWS Secrets。