crypto.subtle & rsa-pss & arweave-js & arconnect

crypto.subtle

具体用法(以 RSA-PSS 为例)

(async function() {
  const rsaKey = await subtle.generateKey({
    name: 'RSA-PSS',
    modulusLength: 4096,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash:  { name: 'SHA-256' },
  }, true, ['sign', 'verify'])

  const jwk = await subtle.exportKey(
    'jwk',
    rsaKey.privateKey
  )

  const privateCryptoKey = await subtle.importKey(
    'jwk',
    jwk,
    {
        name: 'RSA-PSS',
        hash: {name: 'SHA-256'},
    },
    false,
    ['sign']
  )

  const data = 'hello world'
  const signature = await subtle.sign(
    {
        name: 'RSA-PSS',
        saltLength: 128,
    },
    privateCryptoKey,
    data
  )

  const verified = await subtle.verify(
    {
        name: 'RSA-PSS',
        saltLength: 128,
    },
    rsaKey.publicKey,
    signature,
    data
  )

  console.log('verified', verified)
})();

复制代码

参考来源webcrypto-examples

此仓库包含了所有 subtle 支持的算法 例子,包括 AES、HMAC、SHA、PBKDF2 等等,非常好用。

arweave-js

从上可知,Node 端 v15.0.0 添加了 webcrypto API(暂不稳定),打通了 web 端。

而目前 arweave-js 在 Node 端,自己实现了一个 node-driver

使用的就是 crypto-browserifypemTojwk 之类的方式,后续就没必要了,可以使用 node 这个 webcrypto 改造。

也可以减少外部模块依赖,提升安全性。

此外,还有几个问题:

  • saltLength 在 arweave 中,sign 写死了 saltLength 32 (webcrypto-driver.ts#L56),参数的 saltLength 完全没用,而在 verify 中,又验证 saltLength 32 和 0 的两种情况都认为通过,arweave-js 的开发,还是太随意了些
  • 提了好几个 issue,属于几个月都没人跟进的状态,还没 arConnect 迭代给力(虽然也是瞎几把乱写)

arConnect

  • 至于 arConnect,问题也多,首先的一点,文档也没写明白
  • 添加的 signatureencryptdecrypt 方法,原则上是可以使用 arweave-js 来做,相当于 arConnect 只是做一个钱包管理,签名、加密等等都交给 arweave-js。但是 arweave-js 自己实现的也一副鸟样,所以也没法指望 arConnect 实现多优雅。 —— 例如:crypto.subtle 的签名,在 importKey 时候,已经指定了对应的 format(例如:4096 length RSA-PSS keys)。所以在 sign 的时候,如果 key 的format 格式是 RSA-PSS SHA-256 的,是做不了 HMACECDSA 等等其他签名的。而 arConnect 还是把这些参数放出来了 signature 参数,也完全看不出来是啥,得自己看源代码
  • 错误处理没有
  • 签名、小额AR 转账,不需要用户点击按钮确认
  • 在转账 AR 时,会另外转一笔走,给他们自己项目的 PST Token 持有者
  • etc.
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享