Рейтинг:1

Где хранить соль для PBKDF2 и вектор инициализации для AES через WebCrypto

флаг in

Я хотел бы создавать безопасные заметки с помощью javascript и webcrypto.

Я нашел возможности для создания сильного ключа через ПБКДФ2 и шифровать данные через АЕС.

Вот пример того, как сгенерировать ключ через PBKDF2 в webcrypto, где требуется соль:

функция getKey (keyMaterial, соль) {
    вернуть окно.crypto.subtle.deriveKey(
      {
        "имя": "PBKDF2",
        соль: соль, 
        "итерации": 100000,
        "хэш": "SHA-256"
      },
      ключМатериал,
      { "имя": "AES-GCM", "длина": 256},
      истинный,
      ["зашифровать", "расшифровать"]
    );
  }

https://github.com/mdn/dom-examples/blob/master/web-crypto/derive-key/pbkdf2.js#L37-L50

Этот ключ используется для шифрования данных:

let keyMaterial = await getKeyMaterial();
соль = окно.crypto.getRandomValues ​​(новый Uint8Array (16));
пусть ключ = ожидание getKey(keyMaterial, соль);
iv = window.crypto.getRandomValues ​​(новый Uint8Array (12));
пусть закодировано = getMessageEncoding();

зашифрованный текст = ожидание window.crypto.subtle.encrypt(
  {
    название: "АЕС-ГЦМ",
    IV: IV
  },
  ключ,
  закодированный
);

Мне понадобится эта информация для будущей расшифровки. Я хотел бы экспортировать эти данные из браузера и расшифровать эти данные позже с предоставленным паролем.

Я хочу иметь следующий формат JSON:

данные: {
  примечания:[
        {
         зашифрованоПримечание: '..',
         IV: '..',
        }
        ]
  соль: '..'
}

Теперь я не уверен, как безопасно хранить соль и вектор инициализации? Можно ли хранить данные, как указано выше?

Рейтинг:1
флаг in

Конечно, соль и IV можно хранить как открытый текст.

Обратите внимание, что IV иногда является статическим или вычисляется из PBKDF2 (если ключ + IV не превышает размер вывода хэша). В конце концов, ключ уникален для каждой комбинации соль + пароль. Однако кажется, что вы хотите хранить несколько заметок, используя один пароль/ключ, поэтому в этом случае имеет смысл отдельный IV.

Я бы добавил номер версии в ваш протокол и убедился, что количество итераций можно настроить.Лично я бы также рассчитал значение проверки ключа для проверки пароля, иначе вам придется расшифровывать заметку только для проверки правильности пароля.

Имейте в виду, что сообщения могут быть удалены или переупорядочены даже из нескольких блоков данных (при условии одного и того же пароля) в вашей текущей схеме; шифрование защищает только отдельные сообщения.


Лично я хотел бы какую-то асимметричную криптографию для таких протоколов, но я не знаю, возможно ли это в вашем контексте. Шифрование на основе пароля — не самая надежная форма защиты.

knaccc avatar
флаг es
Пожалуйста, не могли бы вы разъяснить преимущества асимметричного шифрования для этого варианта использования?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.