Jestem zainteresowany zbudowaniem małej aplikacji do użytku osobistego, która będzie szyfrować i odszyfrowywać informacje po stronie klienta za pomocą JavaScript. Zaszyfrowane informacje będą przechowywane w bazie danych na serwerze, ale nigdy w wersji odszyfrowanej.
Nie musi to być super bezpieczne, ale chciałbym użyć obecnie nieprzerwanego algorytmu.
Idealnie byłbym w stanie zrobić coś takiego
var gibberish = encrypt(string, salt, key);
aby wygenerować zakodowany ciąg i coś podobnego
var sensical = decrypt(gibberish, key);
aby później zdekodować.
Do tej pory widziałem to: http://bitwiseshiftleft.github.io/sjcl/
Jakieś inne biblioteki, którym powinienem zajrzeć?
encryption
javascript
jeremiahs
źródło
źródło
Odpowiedzi:
źródło
A co z CryptoJS ?
To solidna biblioteka kryptograficzna z wieloma funkcjami. Implementuje hashery, HMAC, PBKDF2 i szyfry. W tym przypadku potrzebne są szyfry. Zapoznaj się z poradnikiem szybkiego startu na stronie głównej projektu.
Możesz zrobić coś takiego z AES:
Jeśli chodzi o bezpieczeństwo, w momencie pisania algorytmu AES uważam, że jest nieprzerwany
Edytować :
Wydaje się, że internetowy adres URL nie działa i możesz użyć pobranych plików do szyfrowania z poniższego linku i umieścić odpowiednie pliki w folderze głównym aplikacji.
https://code.google.com/archive/p/crypto-js/downloads
lub używał innego CDN, takiego jak https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
źródło
Stworzyłem niezabezpieczone, ale proste narzędzie do szyfrowania / odszyfrowywania tekstu. Brak zależności z żadną zewnętrzną biblioteką.
To są funkcje
Możesz ich używać w następujący sposób:
źródło
let
. 😒︎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.crypto_secretbox()
/crypto_secretbox_open()
oferują szyfrowanie z uwierzytelnianiem za pomocą klucza wspólnego.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:
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 APIEncryptedRow
iEncryptedMultiRows
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 ...
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.Dokumentacja sodu-plus jest dostępna na Github.
Jeśli potrzebujesz samouczka krok po kroku, w tym artykule dev.to znajdziesz to, czego szukasz.
źródło
Nowoczesne przeglądarki obsługują teraz
crypto.subtle
API, które zapewnia natywne funkcje szyfrowania i deszyfrowania (nie mniej asynchroniczne!) Przy użyciu jednej z następujących metod: AES-CBC, AES-CTR, AES-GCM lub RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
źródło
Przed wdrożeniem któregokolwiek z nich, zapoznaj się z odpowiedzią Scotta Arciszewskiego .
Chcę, abyś był bardzo ostrożny z tym, co mam zamiar udostępnić, ponieważ mam niewielką lub żadną wiedzę na temat bezpieczeństwa (istnieje duże prawdopodobieństwo, że nadużywam poniższego interfejsu API), więc byłbym bardziej niż mile widziany, aby zaktualizować tę odpowiedź z pomocą społeczności .
Jak @richardtallent wspomniał w swojej odpowiedzi , istnieje wsparcie dla Web Crypto API, więc w tym przykładzie zastosowano standard. W chwili pisania tego tekstu na świecie obsługiwanych jest 95,88% przeglądarek .
Zamierzam udostępnić przykład za pomocą Web Crypto API
Zanim przejdziemy dalej, zwróć uwagę ( cytat z MDN ):
Bardzo szanuję bezpieczeństwo, a nawet pogrubiłem dodatkowe części z MDN ... Zostałeś ostrzeżony
teraz, do rzeczywistego przykładu ...
JSFiddle:
Znaleziono tutaj: https://jsfiddle.net/superjose/rm4e0gqa/5/
Uwaga:
Zwróć uwagę na użycie
await
słów kluczowych. Użyj go wewnątrzasync
funkcji lub użyj.then()
i.catch()
.Wygeneruj klucz:
Zaszyfruj:
Odszyfruj
Konwersja ArrayBuffer tam iz powrotem z String (Gotowe w TypeScript):
Więcej przykładów znajdziesz tutaj (nie jestem właścicielem): // https://github.com/diafygi/webcrypto-examples
źródło
CryptoJS nie jest już obsługiwany. Jeśli chcesz nadal z niego korzystać, możesz przełączyć się na ten adres URL:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
źródło
Użyj SimpleCrypto
Używanie encrypt () i decrypt ()
źródło
Proste funkcje,
źródło