WebCrypto:Safari无法导出密钥(),并且promise似乎永远不会解决/失败
WebCrypto: Safari cannot exportKey() and promise seems to never resolve/fail
我正在创建一个keyPair,然后使用Web Crypto API:从keyPair导出密钥
var log = console.log.bind(console);
var subtleCrypto = null;
if ( window.crypto ) {
subtleCrypto = window.crypto.subtle || window.crypto.webkitSubtle;
}
if ( window.msCrypto ) {
subtleCrypto = window.msCrypto.subtle
}
subtleCrypto.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]), // 24 bit representation of 65537
hash: {name: "SHA-256"}
},
true, // can extract it later if we want
["sign", "verify"]
).then(function(keyPair){
log('Exporting from keyPair', keyPair)
subtleCrypto.exportKey('pkcs8', keyPair.privateKey).then(function(pkcs8) {
log('Exported keypair!', pkcs8)
}, function(reason) {
log('Couldnt export keypair', reason)
})
}, function(reason){
log('could not generate key', reason)
})
在Chrome和Firefox上,代码运行良好,打印:
"Exporting from keyPair" Object { privateKey: CryptoKey, publicKey: CryptoKey }
"Exported keypair!" ArrayBuffer { byteLength: 1218 }
然而,在Safari上它失败了,只打印:
Exporting from keyPair KeyPair
然后什么都不做如何在Safari上导出密钥
Webkit当前无法将密钥导出为"pkcs8"或"spki"(由https://bugs.webkit.org/show_bug.cgi?id=129978)。
解决这个问题的方法是将其导出为"jwk",然后通过提取各个部分并在ASN.1中编码来转换生成的密钥。可以在webcrypto填充程序项目中找到如何做到这一点的示例,您可以直接使用该项目,而不必自己动手,尽管它不适用于Webkit上的RSA-OAEP+SHA-256或AES-GCM。
WebCrypto的Safari实现以及Edge实现目前存在许多问题。
因此,我们实现了这个库来掩盖这些差异,您可以在这里找到它:https://github.com/PeculiarVentures/webcrypto-liner/blob/master/BrowserSupport.md
在这种特殊情况下,正如前面的响应所说的Safari不实现PKCS8格式化。
如果您需要PKCS8格式,请查看此函数:https://github.com/PeculiarVentures/pkijs-es6/blob/62bbedea4cd3b60debbdc309bc48b5c188f4504e/src/CryptoEngine.js#L438-L532
相关文章:
- 使用promise和mongoose对文档进行排序
- 测试Angular Service解决错误回调中的promise
- 节点协同与生成器和Promise并行流量控制
- 根据是否解析了 Promise 从函数返回值
- 将一个方法转换为promise:Nodejs
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- 成功回调永远不会被JSONP请求调用
- js promise没有正确关闭
- Angularjs使用“;这个“;promise内的关键字回调
- AngularJS和promise值在调用本地函数时的效果-未定义
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 以同步方式获取Javascript Promise的值
- NodeJS和pg promise,捕获PostgreSQL异常
- AngularJS使用http进行promise处理
- Angular promise return"未定义的“;值.NET MVC
- Promise函数在.then之后未运行函数化
- 如何为javascript promise进行阻塞并返回解析结果
- 将其中一个异步方法重写为使用promise的方法
- Jquery上的Promise回调在空响应时永远不会运行
- WebCrypto:Safari无法导出密钥(),并且promise似乎永远不会解决/失败