--- title: SubtleCrypto.deriveKey() slug: Web/API/SubtleCrypto/deriveKey tags: - API - Criptografía - Crypto - Referencia - SubtleCrypto - Web - metodo translation_of: Web/API/SubtleCrypto/deriveKey ---

{{APIRef("Web Crypto API")}}

O método SubtleCrypto.deriveKey() retorna como {{jsxref("Promise")}} de um recentemente gerado {{domxref("CryptoKey")}} derivada de uma master key e um algoritmo específico dados como parâmetro.

Sintaxe

var result = crypto.subtle.deriveKey(algorithm, masterKey, derivedKeyAlgorithm, extractable, keyUsages);

Parâmetros

Valor de retorno

Exceções

A promise é rejeitada quando uma das seguintes exceções é encontrada:

Exemplo

Aqui está um exemplo de como usar deriveKey() para criar uma Secure Remote Password (também nomeado de Proof of Secret) da password de um usuário.

// salt deve ser Uint8Array ou ArrayBuffer
var saltBuffer = Unibabel.hexToBuffer('e85c53e7f119d41fd7895cdc9d7bb9dd');

// não use métodos naïve para conversão de texto, senão caracteres
// internacionais não terão a sequência correta de byte. Use o TextEncoder quando
// possível ou então use polyfills relevantes
var passphraseKey = Unibabel.utf8ToBuffer("I hëart årt and £$¢!");

// Você deve primeiramente importar sua passphrase Uint8array em uma CryptoKey
window.crypto.subtle.importKey(
  'raw',
  passphraseKey,
  {name: 'PBKDF2'},
  false,
  ['deriveBits', 'deriveKey']
).then(function(key) {

  return window.crypto.subtle.deriveKey(
    { "name": 'PBKDF2',
      "salt": saltBuffer,
      // não seja muito ambicioso, ou pelo menos tenha em mente
      // que celulares com baixo poder de processamento vão acessar o seu app
      "iterations": 100,
      "hash": 'SHA-256'
    },
    key,

    // Nota: para essa demo nós não vamos precisar de uma cipher suite,
    // mas a API exige que a mesma seja especificada.

    // Para AES o comprimento requerido é de 128 ou 256 bits (não bytes)
    { "name": 'AES-CBC', "length": 256 },

    // Independente da resposta a key é extraível (menos seguro) ou não extraível (mais seguro),
    // quando falso, a key pode ser entregue apenas como um objeto crypto web, não inspecionado
    true,

    // esse objeto crypto web será permitido para apenas essas funções:
    [ "encrypt", "decrypt" ]
  )
}).then(function (webKey) {

  return crypto.subtle.exportKey("raw", webKey);

}).then(function (buffer) {

    var proofOfSecret = Unibabel.bufferToHex(buffer);
    // esta proof-of-secret / password remota-segura
    // pode agora ser enviada no lugar da password do usuário
});

Nota: Por conta de não haver ferramentas nativas que convertam entre Uint8Array, Unicode, hex, e base64, você provavelmente vai querer utilizar algo como o Unibabel ou Buffer para converter entre eles.

Especificações

Especificação Status Comentário
{{ SpecName('Web Crypto API', '#dfn-SubtleCrypto-method-deriveKey', 'SubtleCrypto.deriveKey()') }} {{ Spec2('Web Crypto API') }} Definição inicial.

Compatibilidade de Browser

{{ CompatibilityTable() }}

Característica Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Suporte básico {{ CompatChrome(37) }} {{CompatVersionUnknown}} {{ CompatGeckoDesktop(34) }} {{ CompatNo() }} {{ CompatUnknown() }} {{ CompatSafari(11) }}
PBKDF2 {{ CompatChrome(42) }} {{CompatUnknown}} {{ CompatGeckoDesktop(34) }} {{ CompatNo() }} {{ CompatUnknown() }} {{ CompatSafari(11) }}
HKDF-CTR {{ CompatChrome(42) }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatUnknown() }}
DH {{ CompatNo() }} {{CompatUnknown}} {{ CompatGeckoDesktop(35) }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatUnknown() }}
Característica Android Edge Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suporte básico {{CompatVersionUnknown}} {{CompatVersionUnknown}} 37 {{ CompatGeckoMobile(34) }} {{ CompatNo }} {{ CompatUnknown() }} {{ CompatNo }}
PBKDF2 {{CompatVersionUnknown}} {{CompatUnknown}} 42 {{ CompatGeckoMobile(34) }} {{ CompatNo }} {{ CompatUnknown() }} {{ CompatNo }}
HKDF-CTR {{CompatVersionUnknown}} {{CompatUnknown}} 42 {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
DH {{ CompatNo() }} {{CompatUnknown}} {{ CompatNo() }} {{ CompatGeckoMobile(35) }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}

Veja também

Dicionário:

"Key" = "Chave"

"Master key" = "Chave mestre"

"Proof-of-secret" = "Prova de segredo ou Atestado de sigilo"

"Password" = "Palavra passe ou Senha"