WebCrypto
Obawy związane z kryptografią w javascript po stronie klienta (przeglądarki) są szczegółowo opisane poniżej. Wszystkie te obawy oprócz jednego nie dotyczą interfejsu API WebCrypto , który jest teraz dość dobrze obsługiwany .
W przypadku aplikacji offline nadal musisz zaprojektować i wdrożyć bezpieczny magazyn kluczy.
Poza tym: jeśli używasz Node.js, użyj wbudowanego Crypto API.
Kryptografia natywna-Javascript (przed WebCrypto)
Zakładam, że głównym problemem jest ktoś, kto ma fizyczny dostęp do komputera czytającego localStorage
Twoją witrynę, a chcesz, aby kryptografia zapobiegała temu dostępowi.
Jeśli ktoś ma fizyczny dostęp, jesteś również narażony na ataki inne i gorsze niż czytanie. Są to między innymi: keyloggery, modyfikacja skryptów offline, wstrzykiwanie skryptów lokalnych, zatruwanie pamięci podręcznej przeglądarki i przekierowania DNS. Te ataki działają tylko wtedy, gdy użytkownik korzysta z maszyny po tym, jak została ona przejęta. Niemniej jednak fizyczny dostęp w takim scenariuszu oznacza większe problemy.
Należy więc pamiętać, że ograniczony scenariusz, w którym lokalne kryptowaluty są cenne, to kradzież maszyny.
Istnieją biblioteki, które implementują pożądaną funkcjonalność, np. Stanford Javascript Crypto Library . Istnieją jednak nieodłączne słabości (o których mowa w linku z odpowiedzi @ ircmaxell):
- Brak entropii / generowania liczb losowych;
- Brak bezpiecznego magazynu kluczy, tj. Klucz prywatny musi być chroniony hasłem, jeśli jest przechowywany lokalnie lub na serwerze (co blokuje dostęp offline);
- Brak bezpiecznego wymazywania;
- Brak charakterystyk czasowych.
Każda z tych słabości odpowiada kategorii kompromisów kryptograficznych. Innymi słowy, chociaż możesz mieć „krypto” z nazwy, będzie ono znacznie poniżej rygoru, do którego aspiruje się w praktyce.
Mimo wszystko ocena aktuarialna nie jest tak banalna, jak „Kryptowaluta w Javascript jest słaba, nie używaj jej”. To nie jest aprobata, ściśle zastrzeżenie i wymaga pełnego zrozumienia ujawnienia powyższych słabości, częstotliwości i kosztu wektorów, z którymi się spotykasz, oraz zdolności do łagodzenia lub ubezpieczenia w przypadku awarii: krypto JavaScript, w pomimo swoich słabości może zmniejszyć Twoje narażenie, ale tylko przeciwko złodziejom o ograniczonych możliwościach technicznych. Należy jednak założyć, że krypto JavaScript nie ma wartości w stosunku do zdeterminowanego i zdolnego napastnika, który atakuje te informacje. Niektórzy uznaliby za mylące nazywanie danych „zaszyfrowanymi”, skoro wiadomo, że tak wiele słabych punktów jest nieodłącznych dla implementacji. Innymi słowy, możesz nieznacznie zmniejszyć swoją ekspozycję techniczną, ale zwiększysz swoją ekspozycję finansową w wyniku ujawnienia. Oczywiście każda sytuacja jest inna - a analiza redukcji technicznej ekspozycji na ekspozycję finansową jest nietrywialna. Oto przykładowa analogia:Niektóre banki wymagają słabych haseł , pomimo nieodłącznego ryzyka, ponieważ ich narażenie na straty wynikające ze słabych haseł jest mniejsze niż koszty obsługi silnych haseł dla użytkownika końcowego.
🔥 Jeśli przeczytałeś ostatni akapit i pomyślałeś: „Jakiś facet w Internecie imieniem Brian mówi, że mogę używać kryptografii Javascript”, nie używaj kryptografii Javascript.
W przypadku użycia opisanym w pytaniu wydaje się, że bardziej sensowne byłoby zaszyfrowanie lokalnej partycji lub katalogu domowego przez użytkowników i użycie silnego hasła. Ten rodzaj zabezpieczeń jest ogólnie dobrze przetestowany, powszechnie zaufany i powszechnie dostępny.