crypto.subtle.deriveKey всегда возвращает undefined

Предыстория этого вопроса такова: я генерирую некоторые зашифрованные данные на сервере на C#, используя парольную фразу для шифрования данных. Сейчас я пытаюсь расшифровать на клиенте с помощью API WebCrypto, но вызов deriveKey всегда возвращает undefined (без ошибок). Я пытался создать 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. Я не знаю, пытаюсь ли я сделать что-то, что не поддерживается этими алгоритмами, или у меня что-то еще не так...

1 ответ

Решение

Вы получаете undefined, потому что не возвращаете ничего из предыдущего обещания. Если вы поместите return перед вызовом deriveKey, это решит вашу проблему. Вот ваш код с исправлением:

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))
Другие вопросы по тегам