Как установить длину с помощью Web Crypto API SubtleCrypto.deriveKey () для PBKDF2 - PullRequest
0 голосов
/ 12 июня 2018

Согласно doc простой пример получения пароля с использованием PBKDF2 -

  return window.crypto.subtle.importKey(
    'raw', 
    encoder.encode(password), 
    {name: 'PBKDF2'}, 
    false, 
    ['deriveBits', 'deriveKey']
  ).then(function(key) {
    return window.crypto.subtle.deriveKey(
      { "name": 'PBKDF2',
        "salt": encoder.encode(salt),
        "iterations": iterations,
        "hash": 'SHA-256'
      },
      key,
      { "name": 'AES-CTR', "length": 128 }, //api requires this to be set
      true, //extractable
      [ "encrypt", "decrypt" ] //allowed functions
    )
  }).then(function (webKey) {
    return crypto.subtle.exportKey("raw", webKey);
  })

. Как видно, API позволяет выбирать:

  • функция получения ключа (и ее основной хеш)
  • соль
  • итерации
  • материал необработанного ключа (т. е. пароль)

Однако до сих поркак я вижу, вариантов выбора длины нет. кажется , что параметр набора шифров { "name": 'AES-CTR', "length": 128 } влияет на длину выхода, но вы можете выбрать только 16 и 32 байта.

Например, с 10 000 раундов, соль: «соль», пароль: «ключевой материал» со 128 это приведет к следующим 16 байтам:

26629f0e2b7b14ed4b84daa8071c648c

, тогда как с { "name": 'AES-CTR', "length": 256 } вы получите

26629f0e2b7b14ed4b84daa8071c648c648d2cce067f93e2c5bde0c620030521

Как мне установить длину выхода отдельноот 16 или 32 байта?Должен ли я урезать это сам?

1 Ответ

0 голосов
/ 18 июня 2018
Функция

diverveKey с опцией алгоритма AES возвращает ключ AES .Возможные параметры длины ключа AES следующие (в биты ):

  • 128
  • 192
  • 256

Таким образом, вы можете выбирать только из них при использовании шифра AES.На мой взгляд, это плохая идея изменить ключ, сгенерированный из функции diverveKey .Прежде всего, вы нарушите стандарт алгоритма, а также в будущем у вас возникнут проблемы с использованием усеченных ключей.

Но если вы хотите просто использовать PBKDF2 и получить бит изпароль, вы можете использовать функцию diverveBits .Вот пример:

window.crypto.subtle.deriveBits(
        {
            name: "PBKDF2",
            salt: window.crypto.getRandomValues(new Uint8Array(16)),
            iterations: 50000,
            hash: {name: "SHA-256"}, // can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
        },
        key, //your key from generateKey or importKey
        512 //the number of bits you want to derive, values: 8, 16, 32, 64, 128, 512, 1024, 2048
    )
    .then(function(bits){
        //returns the derived bits as an ArrayBuffer
        console.log(new Uint8Array(bits));
    })
    .catch(function(err){
        console.error(err);
    });

Дополнительные примеры здесь - https://github.com/diafygi/webcrypto-examples#pbkdf2---derivekey.

Кроме того, я проверил возможные значения для производных битов, и они имеют степень 2 (от8 до 2048).

Надеюсь, это поможет вам.Помните, что если вы хотите просто использовать шифр AES, лучше используйте значения по умолчанию и функцию diverveKey .

...