Istniejące odpowiedzi, które wykorzystują SJCL, CryptoJS i / lub WebCrypto, niekoniecznie są błędne, ale nie są tak bezpieczne, jak można początkowo podejrzewać. Generalnie chcesz używać libsodium . Najpierw wyjaśnię dlaczego, a potem jak.
Dlaczego nie SJCL, CryptoJS, WebCrypto itp.?
Krótka odpowiedź: aby Twoje szyfrowanie było faktycznie bezpieczne, te biblioteki oczekują, że dokonasz zbyt wielu wyborów, np. Tryb szyfrowania blokowego (CBC, CTR, GCM; jeśli nie możesz powiedzieć, który z trzech wymienionych powyżej jest bezpieczny zastosowanie i pod jakimi ograniczeniami, nie powinna być obarczona tego rodzaju wyboru w ogóle ).
Jeśli nie zajmujesz stanowiska inżyniera kryptografii , istnieje duże prawdopodobieństwo, że zaimplementujesz je bezpiecznie.
Dlaczego unikać CryptoJS?
CryptoJS oferuje garść bloków konstrukcyjnych i oczekuje, że będziesz wiedział, jak z nich bezpiecznie korzystać. Nawet domyślnie działa w trybie CBC ( zarchiwizowany ).
Dlaczego tryb CBC jest zły?
Przeczytaj ten artykuł na temat luk w zabezpieczeniach AES-CBC .
Dlaczego unikać WebCrypto?
WebCrypto to potluck standard, zaprojektowany przez komitet do celów ortogonalnych do inżynierii kryptograficznej. W szczególności WebCrypto miało zastąpić Flash, a nie zapewniać bezpieczeństwa .
Dlaczego unikać SJCL?
Publiczny interfejs API i dokumentacja SJCL błaga użytkowników o szyfrowanie danych za pomocą hasła zapamiętanego przez człowieka. Rzadko, jeśli w ogóle, chcesz to robić w prawdziwym świecie.
Dodatkowo: jego domyślna liczba rund PBKDF2 jest około 86 razy mniejsza, niż chcesz . AES-128-CCM prawdopodobnie jest w porządku.
Spośród trzech powyższych opcji SJCL najrzadziej kończy się łzami. Ale są dostępne lepsze opcje.
Dlaczego Libsodium jest lepszy?
Nie musisz wybierać między menu trybów szyfrowania, funkcjami skrótu i innymi niepotrzebnymi opcjami. Nigdy nie ryzykujesz zepsucia parametrów i usunięcia wszystkich zabezpieczeń z protokołu .
Zamiast tego libsodium oferuje proste opcje dostrojone pod kątem maksymalnego bezpieczeństwa i minimalistycznych interfejsów API.
crypto_box()
/ crypto_box_open()
oferują uwierzytelnione szyfrowanie z kluczem publicznym.
- Omawiany algorytm łączy X25519 (ECDH over Curve25519) i XSalsa20-Poly1305, ale nie musisz o tym wiedzieć (ani nawet przejmować się), aby go bezpiecznie używać
crypto_secretbox()
/ crypto_secretbox_open()
oferują szyfrowanie z uwierzytelnianiem za pomocą klucza wspólnego.
- Omawiany algorytm to XSalsa20-Poly1305, ale nie musisz o tym wiedzieć / dbać
Dodatkowo libsodium ma powiązania w dziesiątkach popularnych języków programowania , więc jest bardzo prawdopodobne, że libsodium będzie działać tylko podczas próby współdziałania z innym stosem programowania. Ponadto libsodium zwykle działa bardzo szybko bez poświęcania bezpieczeństwa.
Jak korzystać z Libsodium w JavaScript?
Najpierw musisz zdecydować o jednej rzeczy:
- Czy chcesz po prostu zaszyfrować / odszyfrować dane (a może nadal w jakiś sposób bezpiecznie używać zwykłego tekstu w zapytaniach do bazy danych) i nie martwić się o szczegóły? Lub...
- Czy potrzebujesz zaimplementować określony protokół?
Jeśli wybrałeś pierwszą opcję , pobierz CipherSweet.js .
Dokumentacja jest dostępna online . EncryptedField
jest wystarczający w większości przypadków użycia, ale interfejsy API EncryptedRow
i EncryptedMultiRows
mogą być łatwiejsze, jeśli masz wiele różnych pól, które chcesz zaszyfrować.
Dzięki CipherSweet nie musisz nawet wiedzieć, czym jest nonce / IV, aby bezpiecznie go używać.
Ponadto obsługuje int
/ float
szyfrowanie bez wycieku faktów o zawartości poprzez rozmiar tekstu zaszyfrowanego.
W przeciwnym razie będziesz potrzebować sodu-plus , który jest przyjazną dla użytkownika nakładką na różne opakowania libsodium. Sodium-Plus umożliwia pisanie wydajnego, asynchronicznego kodu wieloplatformowego, który jest łatwy do audytu i uzasadnienia.
Aby zainstalować sodu-plus, po prostu uruchom ...
npm install sodium-plus
Obecnie nie ma publicznego CDN do obsługi przeglądarki. Wkrótce to się zmieni. Jednakże, można pobrać sodium-plus.min.js
z najnowszej wersji GitHub jeśli jest to potrzebne.
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());
})();
Dokumentacja sodu-plus jest dostępna na Github.
Jeśli potrzebujesz samouczka krok po kroku, w tym artykule dev.to znajdziesz to, czego szukasz.