Існуючі відповіді, які використовують SJCL, CryptoJS та / або WebCrypto, не обов'язково помиляються, але вони не такі безпечні, як ви могли спочатку підозрювати. Як правило, ви хочете використовувати лібсодіум . Спочатку я поясню, чому, потім як.
Чому б не SJCL, CryptoJS, WebCrypto тощо?
Коротка відповідь: для того, щоб ваше шифрування було фактично захищеним, ці бібліотеки очікують, що ви зробите занадто багато варіантів, наприклад, режим блокового шифрування (CBC, CTR, GCM; якщо ви не можете сказати, для кого із трьох, що я тільки перерахував, безпечно використання і під які обмеження, ви не повинні бути обтяжені такого роду вибору взагалі ).
Якщо ваша посада не є інженером криптографії , шанси складені проти вас, щоб її надійно реалізувати.
Чому слід уникати CryptoJS?
CryptoJS пропонує кілька будівельних блоків і очікує, що ви знаєте, як їх безпечно використовувати. Це навіть за замовчуванням у режимі CBC ( заархівовано ).
Чому режим CBC поганий?
Прочитайте цю інформацію про вразливості AES-CBC .
Чому слід уникати WebCrypto?
WebCrypto - стандарт potluck, розроблений комітетом, для цілей, ортогональних для криптографії. Зокрема, WebCrypto повинен був замінити Flash, а не забезпечити безпеку .
Чому слід уникати SJCL?
Публічний API та документація SJCL просять користувачів зашифрувати дані за допомогою запам'ятовуваного людиною пароля. Це рідко, якщо взагалі, те, що ви хочете робити в реальному світі.
Додатково: за замовчуванням PBKDF2 кругле число приблизно в 86 разів менше, ніж ви хочете . AES-128-CCM, напевно, добре.
З трьох вищезазначених варіантів SJCL є найменшою ймовірністю закінчитися сльозами. Але є кращі варіанти.
Чому лібсодіум краще?
Вам не потрібно вибирати між меню режимів шифрування, хеш-функцій та іншими непотрібними параметрами. Ви ніколи не ризикуєте перекрутити свої параметри і видалити всю безпеку з протоколу .
Натомість libsodium просто надає прості параметри, налаштовані на максимальну безпеку та мінімалістичний API.
crypto_box()
/ crypto_box_open()
пропонувати аутентифіковане шифрування відкритого ключа.
- Розглянутий алгоритм поєднує X25519 (ECDH над Curve25519) та XSalsa20-Poly1305, але вам не потрібно знати (або навіть дбати) про це, щоб безпечно його використовувати
crypto_secretbox()
/ crypto_secretbox_open()
запропонувати шифроване автентичне використання спільного ключа.
- Розглянутий алгоритм XSalsa20-Poly1305, але вам не потрібно знати / доглядати
Крім того, libsodium має прив’язки до десятків популярних мов програмування , тому велика ймовірність, що libsodium буде просто працювати при спробі взаємодіяти з іншим стеком програмування. Крім того, лібсодіум, як правило, дуже швидко, не приносячи шкоди безпеці.
Як користуватися Libsodium в JavaScript?
Спочатку потрібно вирішити одне:
- Ви просто хочете зашифрувати / розшифрувати дані (а може, все ще якось надійно використовувати відкритий текст у запитах до бази даних) і не турбуватися про деталі? Або ...
- Чи потрібно реалізувати конкретний протокол?
Якщо ви вибрали перший варіант , знайдіть CipherSweet.js .
Документація доступна в Інтернеті . EncryptedField
достатньо для більшості випадків використання, але API EncryptedRow
та EncryptedMultiRows
API можуть бути простішими, якщо у вас є багато різних полів, які ви хочете зашифрувати.
З CipherSweet вам не потрібно навіть знати, що nonce / IV це безпечне використання.
Крім того, це обробляє int
/ float
шифрує без витоків фактів щодо вмісту через розмір шифротексту.
В іншому випадку ви захочете натрій плюс , який є зручним для користувачів для різних обгортків з лібсодію. Sodium-Plus дозволяє писати виконавський, асинхронний, кросплатформенний код, який легко перевіряти та міркувати.
Щоб встановити натрій плюс, просто запустіть ...
npm install sodium-plus
Наразі не існує публічного CDN для підтримки браузера. Це незабаром зміниться. Однак ви можете взяти sodium-plus.min.js
з останнього випуску Github, якщо вам це потрібно.
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
Документація щодо натрію плюс доступна на Github.
Якщо ви хочете покроковий посібник, ця стаття про розробку містить те, що ви шукаєте.