crypto.subtle.deriveKey 总是 returns 未定义
crypto.subtle.deriveKey always returns undefined
这个问题的背景如下 - 我正在使用 C# 在服务器上生成一些加密数据,使用密码来加密数据。我现在正尝试使用 WebCrypto API 在客户端上解密,但对 deriveKey 的调用始终 returns 未定义(无错误)。我尝试按如下方式创建 MCVE:
window.crypto.subtle.importKey(
'raw',
new TextEncoder().encode('passphrase'),
{
'name': 'PBKDF2'
},
false,
['deriveBits', 'deriveKey']
)
.then((baseKey) => {
console.dir(baseKey) // This looks ok!
window.crypto.subtle.deriveKey({
'name': 'PBKDF2',
salt: new TextEncoder().encode('my_salt'),
iterations: 100000,
hash: 'SHA-256'
},
baseKey,
{
'name': 'AES-GCM',
iv: new TextEncoder().encode('iv_from_server'),
length: 256
},
true,
['decrypt'])
})
.then((key2) => {
console.log('generated new key')
console.dir(key2) // This is always undefined
})
.catch((error) => console.dir(error))
我试过调整一些参数但无济于事。它确实需要使用 PBKDF2 和 AES-GCM 来匹配服务器。我不知道我是否正在尝试做那些算法不支持的事情,或者我是否有其他错误....
你变得不确定,因为你没有return之前承诺的任何东西。如果您在调用 deriveKey 之前放置 return,它会解决您的问题。这是您的修复代码:
window.crypto.subtle.importKey(
'raw',
new TextEncoder().encode('passphrase'),
{
'name': 'PBKDF2'
},
false,
['deriveBits', 'deriveKey']
)
.then((baseKey) => {
console.dir(baseKey) // This looks ok!
// ADD A RETURN TO RESOLVE WITH THE KEY IN THE NEXT PROMISE:
return window.crypto.subtle.deriveKey({
'name': 'PBKDF2',
salt: new TextEncoder().encode('my_salt'),
iterations: 100000,
hash: 'SHA-256'
},
baseKey,
{
'name': 'AES-GCM',
iv: new TextEncoder().encode('iv_from_server'),
length: 256
},
true,
['decrypt'])
})
.then((key2) => {
console.log('generated new key')
console.dir(key2) // NOW IT WORKS
})
.catch((error) => console.dir(error))
这个问题的背景如下 - 我正在使用 C# 在服务器上生成一些加密数据,使用密码来加密数据。我现在正尝试使用 WebCrypto API 在客户端上解密,但对 deriveKey 的调用始终 returns 未定义(无错误)。我尝试按如下方式创建 MCVE:
window.crypto.subtle.importKey(
'raw',
new TextEncoder().encode('passphrase'),
{
'name': 'PBKDF2'
},
false,
['deriveBits', 'deriveKey']
)
.then((baseKey) => {
console.dir(baseKey) // This looks ok!
window.crypto.subtle.deriveKey({
'name': 'PBKDF2',
salt: new TextEncoder().encode('my_salt'),
iterations: 100000,
hash: 'SHA-256'
},
baseKey,
{
'name': 'AES-GCM',
iv: new TextEncoder().encode('iv_from_server'),
length: 256
},
true,
['decrypt'])
})
.then((key2) => {
console.log('generated new key')
console.dir(key2) // This is always undefined
})
.catch((error) => console.dir(error))
我试过调整一些参数但无济于事。它确实需要使用 PBKDF2 和 AES-GCM 来匹配服务器。我不知道我是否正在尝试做那些算法不支持的事情,或者我是否有其他错误....
你变得不确定,因为你没有return之前承诺的任何东西。如果您在调用 deriveKey 之前放置 return,它会解决您的问题。这是您的修复代码:
window.crypto.subtle.importKey(
'raw',
new TextEncoder().encode('passphrase'),
{
'name': 'PBKDF2'
},
false,
['deriveBits', 'deriveKey']
)
.then((baseKey) => {
console.dir(baseKey) // This looks ok!
// ADD A RETURN TO RESOLVE WITH THE KEY IN THE NEXT PROMISE:
return window.crypto.subtle.deriveKey({
'name': 'PBKDF2',
salt: new TextEncoder().encode('my_salt'),
iterations: 100000,
hash: 'SHA-256'
},
baseKey,
{
'name': 'AES-GCM',
iv: new TextEncoder().encode('iv_from_server'),
length: 256
},
true,
['decrypt'])
})
.then((key2) => {
console.log('generated new key')
console.dir(key2) // NOW IT WORKS
})
.catch((error) => console.dir(error))