Я хотел бы создавать безопасные заметки с помощью 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: '..',
}
]
соль: '..'
}
Теперь я не уверен, как безопасно хранить соль и вектор инициализации? Можно ли хранить данные, как указано выше?