crypto.subtle
- Web 端详见: SubtleCrypto
- 另外,在调研过程中,也发现,实际上 Node 在 15.x 的版本,增加了 crypto.webcrypto
具体用法(以 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-browserify 和 pemTojwk
之类的方式,后续就没必要了,可以使用 node 这个 webcrypto
改造。
也可以减少外部模块依赖,提升安全性。
此外,还有几个问题:
- saltLength 在 arweave 中,sign 写死了 saltLength 32 (webcrypto-driver.ts#L56),参数的 saltLength 完全没用,而在 verify 中,又验证 saltLength 32 和 0 的两种情况都认为通过,
arweave-js
的开发,还是太随意了些 - 提了好几个 issue,属于几个月都没人跟进的状态,还没 arConnect 迭代给力(虽然也是瞎几把乱写)
arConnect
- 至于 arConnect,问题也多,首先的一点,文档也没写明白
- 添加的
signature
、encrypt
、decrypt
方法,原则上是可以使用arweave-js
来做,相当于 arConnect 只是做一个钱包管理,签名、加密等等都交给arweave-js
。但是arweave-js
自己实现的也一副鸟样,所以也没法指望 arConnect 实现多优雅。 —— 例如:crypto.subtle
的签名,在 importKey 时候,已经指定了对应的 format(例如:4096 length RSA-PSS keys)。所以在 sign 的时候,如果 key 的format 格式是 RSA-PSS SHA-256 的,是做不了HMAC
、ECDSA
等等其他签名的。而 arConnect 还是把这些参数放出来了 signature 参数,也完全看不出来是啥,得自己看源代码 - 错误处理没有
- 签名、小额AR 转账,不需要用户点击按钮确认
- 在转账 AR 时,会另外转一笔走,给他们自己项目的 PST Token 持有者
- etc.
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END