【问题标题】:Javascript crypto.subtle.generateKey gives still the same key?Javascript crypto.subtle.generateKey 仍然提供相同的密钥?
【发布时间】:2017-08-26 06:38:29
【问题描述】:

我有以下 javascript。它应该生成一个 ECDSA 公钥-私钥对,并将 BASE64 编码的公钥作为字符串打印到控制台。我希望它在每次重新加载时生成一个新密钥。但它总是打印相同的,我不明白为什么。它是否一直在生成相同的密钥?如何获取新密钥?

JSfiddle:https://jsfiddle.net/35bk4maw/

window.crypto.subtle.generateKey(
   {
      name: "ECDSA",
      namedCurve: "P-256", //can be "P-256", "P-384", or "P-521"
   },
   true, //whether the key is extractable (i.e. can be used in exportKey)
   ["sign", "verify"] //can be any combination of "sign" and "verify"
)
.then(function(key)
{
   window.crypto.subtle.exportKey(
       "spki", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only)
       key.publicKey //can be a publicKey or privateKey, as long as extractable was true
    ).then(function(keydata)
    {
        // this always prints something like "A21ixmVqdCBccnOheQJ1cmNlcl0="
        // I would expect it to print different string on each reload!
        console.log(btoa(keydata));
    })
     .catch(function(err){ console.error(err); });
}).catch(function(err){ console.error(err); });

【问题讨论】:

    标签: javascript cryptography


    【解决方案1】:

    最后我发现了问题所在,所以我会回答我自己的问题。 问题是当调用 btoa(keydata) 时,它不理解 ArrayBuffer 参数,所以它计算 BASE64 的 keydata 转换为字符串。并且任何转换为​​字符串的 ArrayBuffer 始终是“[ArrayBuffer Object]”。因此这个字符串的base64编码结果总是W29iamVjdCBBcnJheUJ1ZmZlcl0=

    所以为了让我以某种可读的形式打印 ArrayBuffer 内容,我需要使用不同的方式对其进行编码,这个答案帮助我只打印公钥的 HEX: Javascript ArrayBuffer to Hex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多