Szyfrowanie JavaScript AES [zamknięte]

109

Czy jest dostępna biblioteka obsługująca 256-bitowe szyfrowanie AES w JavaScript?

koder
źródło
Oto, czego potrzebujesz do szyfrowania AES przy użyciu crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt („Message”, „Passphrase”); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), „Passphrase”); console.log („Encrypted:”, encryptedAES.toString ()); console.log ( „Decrypted:”, decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das,

Odpowiedzi:

66

JSAES to potężna implementacja AES w JavaScript. http://point-at-infinity.org/jsaes/

ukośnik odwrotny17
źródło
32
JSAES jest objęty licencją GNU GPL - dlatego nie można go używać w niektórych projektach.
Robert
11
Jest to teraz całkiem przydatne i bogate w funkcje code.google.com/p/crypto-js
David Kierans
2
@HappyDeveloper Cóż, nie. Nie wiń za to licencji. Autor wybrał złą licencję, ponieważ GPL nie jest odpowiednia dla bibliotek.
inta
4
Jest „bezpłatny w użyciu”, ale nie możesz go używać, jeśli chcesz wydać wynikowy produkt na warunkach innych niż GPL.
Curtis,
3
JSAES to dobry punkt wyjścia, ale można go używać tylko do szyfrowania 16 bajtów danych. Jeśli chcesz zaszyfrować większy blok danych, musisz go samodzielnie rozszerzyć o zaimplementowanie wektora inicjalizacji, trybu szyfrowania (CBC lub inny ...), padding.
Paolo
35

Oto strona demonstracyjna, która używa slowAES.

slowAES był łatwy w użyciu. Logicznie zaprojektowane. Rozsądne opakowanie OO. Obsługuje pokrętła i dźwignie, takie jak tryb IV i szyfrowania. Dobra kompatybilność z .NET / C #. Imię jest żartobliwe; nazywa się to „ powolnym AES”, ponieważ nie jest zaimplementowane w C ++. Ale w moich testach nie było to niepraktycznie wolne.

Brakuje trybu EBC. Brakuje również trybu CTR, chociaż myślę, że można by go łatwo zbudować, mając tryb EBC.

Skupia się wyłącznie na szyfrowaniu. Miłym uzupełnieniem klasa robi RFC2898 zgodny ze hasło oparte uzyskiwania klucza, w JavaScripcie, jest dostępny od Anandam . Ta para bibliotek działa dobrze z analogicznymi klasami .NET. Dobra współpraca. Chociaż, w przeciwieństwie do SlowAES, Javascript PBKDF2 jest zauważalnie wolniejszy niż klasa Rfc2898DeriveBytes podczas generowania kluczy.

Nic dziwnego, że technicznie interop jest dobry, ale kluczową kwestią dla mnie był model przyjęty przez SlowAES, który jest znajomy i łatwy w użyciu. Zauważyłem, że niektóre inne biblioteki JavaScript dla AES są trudne do zrozumienia i użycia. Na przykład w niektórych z nich nie mogłem znaleźć miejsca na ustawienie IV lub trybu (CBC, ECB itp.). Nie było tam, gdzie się spodziewałem. SlowAES nie był taki. Nieruchomości były dokładnie tam, gdzie się spodziewałem. Było mi to łatwe, ponieważ znałem modele programowania kryptograficznego Java i .NET.

PBKDF2 Anandama nie było na tym poziomie. Obsługuje tylko jedno wywołanie funkcji DeriveBytes, więc jeśli potrzebujesz wyprowadzić zarówno klucz, jak i IV z hasła, ta biblioteka nie będzie działać bez zmian. Niewielka modyfikacja i działa dobrze w tym celu.

EDYCJA : Złożyłem przykład pakowania SlowAES i zmodyfikowanej wersji PBKDF2 Anandama do składników skryptów systemu Windows. Użycie tego AES z kluczem pochodnym hasła zapewnia dobrą współpracę z klasą .NET RijndaelManaged.

EDIT2 : strona demonstracyjna pokazuje, jak używać tego szyfrowania AES ze strony internetowej. Korzystanie z tych samych danych wejściowych (iv, klawisz, tryb itp.), Które są obsługiwane w .NET, zapewnia dobrą współpracę z klasą Rijndael .NET. Możesz zrobić „wyświetl źródło”, aby pobrać javascript dla tej strony.

EDIT3
późny dodatek: kryptografia JavaScript uznana za szkodliwą. Warto przeczytać.

Ser
źródło
1
Widzę jeden ważny przypadek użycia - aplikację HTML 5, w której wszystkie pliki są przechowywane lokalnie. Jeśli lokalne pliki mogą zostać przejęte, to i tak jest to skazane na porażkę ;-).
Nux,
8
o linku edit3 to kupa artykułu ... połowa stwierdzeń jest całkowicie fałszywa!
mmm
2
Problem z kluczem losowym można rozwiązać, zmuszając użytkownika do poruszania myszą i wprowadzania klawiszy jako prawdziwego generatora losowego.
mmm,
2
Wydaje się, że łącze do strony demonstracyjnej jest uszkodzone.
Sean
26

Podczas moich poszukiwań szyfrowania AES znalazłem to od niektórych studentów ze Standford. Twierdzi, że jest najszybszy. Obsługuje szyfrowanie CCM, OCB, GCM i Block. http://crypto.stanford.edu/sjcl/

Danny C.
źródło
o tym właśnie mówię!
mmm
5
Brakuje dokumentacji i jest ona trudna w użyciu. Jak zmienić długość klucza? Polowałem wokół doktorów i nie mogłem tego rozgryźć w rozsądnym czasie. Również gdy coś zaszyfrujesz, otrzymasz tablicę par klucz-wartość, ale dokumentacja wydaje się tego nie wyjaśniać. Skończyło się na korzystaniu z ruchomej biblioteki typów.
CpnCrunch
I to nie jest asynchroniczne, więc jeśli szyfrujesz lub odszyfrowujesz jakiś dłuższy ciąg, na przykład za pomocą AES-CBC, to blokuje interfejs użytkownika
rsz
12

Wyszukiwanie w Google „JavaScript AES” znalazło kilka przykładów. Pierwsza, która się pojawiła, ma na celu wyjaśnienie algorytmu, a także rozwiązanie:

Movable Type Scripts: AES

Samir Talwar
źródło
1
Nie mogłem wymyślić, jak ustawić kroplówkę w tej bibliotece. Nie jest też zbyt OO.
Cheeso
Odpowiednikiem IV w trybie licznika jest liczba jednorazowa. Ta implementacja została przeformułowana, aby była bardziej OO. Obejmuje tylko tryb pracy licznika (CTR).
ChrisV
Działa to całkiem dobrze, z wyjątkiem tego, że nie ma żadnego trybu EBC.
CpnCrunch
10

Ten post jest już stary, ale crypto-js może być teraz najbardziej kompletną biblioteką szyfrowania javascript.

CryptoJS to zbiór algorytmów kryptograficznych zaimplementowanych w JavaScript. Zawiera następujące szyfry: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop i hashers: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 z 224, 256, 384 lub 512 bitami.

Możesz zajrzeć do ich Przewodnika Szybki start, który jest również odniesieniem do następującego portu node.js.

node-cryptojs-aes jest portem node.js dla crypto-js

Marcz
źródło
1
Niestety brakuje dokumentacji. Wydaje się, że ma tylko przewodnik „Szybki start”. Gdzie jest pełna dokumentacja? Mówi, że obsługuje wiele długości kluczy, ale nie ma dokumentacji, jak to zrobić.
CpnCrunch
@CpnCrunch: pełna dokumentacja API nie jest dostępna online, ale kod w postaci pełnych komentarzy API JavaDoc. I możesz to wygenerować. Przeczytaj komentarze na temat źródła cipher-core.js, aby znaleźć rozmiar klucza cipher i rozmiar IV.
marcz
dziwne, kiedy
szyfruję
Istnieją pewne konflikty z powodu użycia openssl
Vlad
9

Niedawno musiałem wykonać pewną interoperacyjność szyfrowania / deszyfrowania między javascript i python.

Konkretnie...

1) Używanie AES do szyfrowania w javascript i deszyfrowania w pythonie (Google App Engine) 2) Używanie RSA do szyfrowania w javascript i deszyfrowania w pythonie (Google App Engine) 3) Używanie pycrypto

Znalazłem wiele różnych wersji RSA i AES krążących po sieci i wszystkie różniły się podejściem, ale nie znalazłem dobrego przykładu interoperacyjności JavaScript i Python od końca do końca.

W końcu po wielu próbach i błędach udało mi się stworzyć coś, co odpowiadało moim potrzebom.

W każdym razie podałem przykład js / webapp rozmawiającego z serwerem Pythona hostowanym przez silnik aplikacji Google, który używa AES oraz klucza publicznego i klucza prywatnego RSA.

Pomyślałem, że umieściłbym to tutaj za pomocą linku, na wypadek gdyby przydało się to innym, którzy muszą osiągnąć to samo.

http://www.ipowow.com/files/aesrsademo.tar.gz

i zobacz demo na rsa-aes-demo DOT appspot DOT com

edycja: spójrz na wyjście konsoli przeglądarki, a także wyświetl źródło, aby uzyskać wskazówki i przydatne wiadomości dotyczące tego, co się dzieje w wersji demonstracyjnej

edycja: zaktualizowano bardzo stary i nieistniejący link do źródła, na które teraz wskazuje

https://sestertii.com/files/aesrsademo.tar.gz

David Kierans
źródło
1
Dziękuję bardzo za to! Za całe życie nie mogłem zmusić mojego javascript aes do rozmowy z moim pythonem aes.
Spike
1
Całą noc (z pycrypto i innymi) próbowałem zrobić to, co twój kod pomógł mi osiągnąć w 10 minut. Dziękuję bardzo!
Remy Vanherweghem
1
Z jakiegoś powodu RSA działa łatwo, ale AES to królewski ból. Dziękuję Ci za to!!!
szybowiec
1
link ... nie został znaleziony!
machineaddict
7

Sądząc z własnego doświadczenia, asmcrypto.js zapewnia najszybszą implementację AES w JavaScript (szczególnie w Firefoksie, ponieważ może tam w pełni wykorzystać asm.js).

Z pliku readme:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Edytować: Web Cryptography API jest obecnie realizowany w większości przeglądarek i powinny być wykorzystywane jako podstawowe rozwiązanie, jeśli zależy Ci na wydajności. Należy pamiętać, że IE11 zaimplementował wcześniejszą wersję roboczą standardu, która nie zawierała obietnic.

Kilka przykładów można znaleźć tutaj:

Joel Richard
źródło
Uzyskuję około 8 MiB / s z CryptoJS. Ciekawe, jak to zadziała.
Lodewijk
3

Wypróbuj asmcrypto.js - to naprawdę szybkie.

PS: Jestem autorem i mogę odpowiedzieć na Twoje pytania. Chętnie też otrzymam opinię :)

vibornoff
źródło
asmcrypto.js jest fajny, ale na IE10 nie działa dobrze. czasami zawiesza przeglądarkę na dłużej niż 1 minutę lub na co najmniej 45 sekund. Poza tym nie rozumiem, dlaczego musisz zastąpić globalną funkcję Math? jest wiele bibliotek, które używają tego.
decho
2
Czy mógłbyś skomentować, w jaki sposób masz pewność, że działa poprawnie? IOW: Skąd wiesz, że poprawnie zaimplementowałeś AES?
Lodewijk
Wydajność IE10 jest słaba, ponieważ w ogóle nie optymalizuje asm.js. Ma również nieco inne wzory JIT. Sprawienie, by kod działał dobrze w IE, powoduje również, że jest on do bani w Chrome i FF. Przypuśćmy, że mam dobry wybór. W sprawie Math.random odbyła się długa dyskusja . Krótko mówiąc, jest to potrzeba zapobiegania wyciekowi surowych danych wyjściowych Math.random (co teoretycznie może obniżyć bezpieczeństwo PRNG).
vibornoff
1

Jeśli próbujesz użyć javascript, aby uniknąć używania SSL, pomyśl jeszcze raz. Istnieje wiele środków zaradczych, ale tylko SSL zapewnia bezpieczną komunikację. Biblioteki szyfrujące Javascript mogą pomóc w walce z pewnym zestawem ataków, ale nie są prawdziwym atakiem typu man-in-the-middle.

Jeśli szukasz SSL dla wyszukiwarki aplikacji Google w domenie niestandardowej, zajrzyj na wwwizer.com .

Poniższy post wyjaśnia, jak stworzyć próbę bezpiecznej komunikacji za pomocą javascript i jak to zrobić źle: Użyj modułu szyfrowania JavaScript zamiast SSL / HTTPS

speedplane
źródło
1
Nie jestem pewien, dlaczego uznano to za niepamięć, ponieważ jest to bardzo dobry punkt, który każdy, kto myśli o wdrożeniu szyfrowania javascript, musi przynajmniej wziąć pod uwagę. Głosowano za.
Jules
Korzystanie z szyfrowania po stronie klienta w celu uniknięcia SSL to stary punkt, który niektórzy twierdzą, że mu się to sprzeciwi: w rzeczywistości może zwiększyć bezpieczeństwo HTTPS, uniknąć pasywnych ataków lub być używany w pobranych aplikacjach i rozszerzeniach przeglądarek. Po prostu widziałem, że raz był używany nieprawidłowo (moja uczelnia, ale już to naprawili) i wiele razy używany poprawnie (na przykład kryptokat).
Gustavo Rodrigues