2009-04-27 10 views
91

Czy jest dostępna biblioteka do szyfrowania AES 256-bitowego w JavaScript?JavaScript AES encryption

+0

Oto, co trzeba dla szyfrowania AES przy użyciu crypto-js

Odpowiedz

59

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

+26

JSAES jest objęty licencją GNU GPL - w związku z tym nie nadaje się do niektórych projektów. – Robert

+0

Jak mogę określić "tryb pracy" i IV? Nie wygląda na to, że to opcja. –

+11

To jest teraz bardzo przydatne i bogate w funkcje http://code.google.com/p/crypto-js/ –

12

Googling "JavaScript AES" znalazł kilka przykładów. Pierwszy z nich, który pojawił się przeznaczony jest do wyjaśnienia algorytmu jak również dostarczenie rozwiązania:

Movable Type Scripts: AES

+1

Nie mogłem wymyślić, jak ustawić IV w tej bibliotece. Również nie jest bardzo OO. – Cheeso

+0

Odpowiednikiem IV w trybie licznika jest jednorazowość. Ta implementacja została przeformułowana tak, aby była bardziej OO. Obejmuje on tylko tryb licznika (CTR). – ChrisV

+0

To działa całkiem dobrze, z tym że nie ma żadnego trybu EBC. – CpnCrunch

35

Oto a demonstration page używający slowAES.

slowAES był łatwy w użyciu. Logicznie zaprojektowany. Rozsądne opakowanie OO. Obsługuje pokrętła i dźwignie, takie jak tryb IV i szyfrowania. Dobra kompatybilność z .NET/C#. Ta nazwa to język w policzek; nazywa się "powolny AES", ponieważ nie jest zaimplementowany w C++. Ale w moich testach nie było to niepraktycznie powolne.

Brakuje trybu EBC. Brakuje również trybu CTR, chociaż można go łatwo zbudować w trybie ECB, jak sądzę.

Skupia się wyłącznie na szyfrowaniu. Ładną klasą komplementarną, która obsługuje RFC2898 - oparte na haseł bazowanie na kluczach, w języku Javascript jest available from Anandam. Ta para bibliotek działa dobrze z analogicznymi klasami .NET. Dobry współzawodnictwo. Chociaż w przeciwieństwie do SlowAES, JavaScript PBKDF2 jest zauważalnie wolniejszy niż klasa Rfc2898DeriveBytes podczas generowania kluczy.

Nie jest zaskakujące, że pod względem technicznym istnieje dobra współpraca, ale kluczowym punktem był dla mnie 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.). Rzeczy nie były tam, gdzie się ich spodziewałem. SlowAES nie był taki. Właściwości były dokładnie tam, gdzie oczekiwałem. Łatwo było mi to odebrać, znając modele programowania kryptograficznego Java i .NET.

Anandam PBKDF2 nie był na tym poziomie. Obsługiwano tylko jedno wywołanie funkcji DeriveBytes, więc jeśli musisz uzyskać zarówno klucz, jak i IV z hasła, biblioteka ta nie będzie działać, bez zmian. Trochę drobnych modyfikacji i działa dobrze w tym celu.

EDIT: ułożyła an example opakowań SlowAES i zmodyfikowanej wersji Anandam na PBKDF2 na składniki skryptów Windows. Używanie tej AES z kluczem pochodnym od hasła pokazuje dobre współdziałanie z klasą .NET RijndaelManaged.

EDIT2: the demo page pokazuje, jak korzystać z tego szyfrowania AES ze strony internetowej. Używanie tych samych wejść (iv, klucz, tryb itp.) Obsługiwanych w .NET zapewnia dobre współdziałanie z klasą .NET Rijndael. Możesz zrobić "źródło widoku", aby uzyskać javascript dla tej strony.

Edit3
późny dodatek: Javascript Cryptography considered harmful. Warto przeczytać.

+8

+1 dla [Kryptografia JavaScript uważana za szkodliwą] (http://www.matasano.com/articles/javascript-cryptography/) –

+1

Widzę jedną prawidłową aplikację - HTML5, w której wszystkie pliki są przechowywane lokalnie. Jeśli lokalne pliki mogą zostać przejęte, to w każdym razie skazane na porażkę ;-). – Nux

+8

o linku edit3, jest to kawał bzdura artykułu ... połowa jego oświadczeń jest całkowicie fałszywa! – momomo

24

W moich poszukiwaniach szyfrowania AES znalazłem to od niektórych studentów Standford. Roszczenia są najszybsze.Obsługuje CCM, OCB, GCM i szyfrowanie blokowe. http://crypto.stanford.edu/sjcl/

+0

, o czym mówię! – momomo

+5

Brakuje dokumentacji i jest ona trudna w użyciu. Jak zmienić kluczową długość? Zacząłem polować po dokumentach i nie mogłem tego rozgryźć w rozsądnym czasie. Również podczas szyfrowania zwracana jest tablica par klucz-wartość, ale dokumenty nie wydają się tego wyjaśniać. Skończyło się na używaniu biblioteki ruchomych typów. – CpnCrunch

+0

A to nie jest tak asynchroniczne, więc jeśli szyfrujesz lub odszyfrowujesz dłuższy ciąg, na przykład z AES-CBC, to blokuje interfejs użytkownika – rsz

8

Niedawno miałem potrzebę wykonania pewnej interoperacyjności szyfrowania/deszyfrowania między javascript i python.

Konkretnie ...

1) Za pomocą AES do szyfrowania i deszyfrowania w javascript w python (Google App Engine) 2) Za pomocą RSA do szyfrowania i deszyfrowania w javascript w python (Google App Engine) 3) Używając pycrypto

Znalazłem wiele różnych wersji RSA i AES pływających po Internecie i były one różne w ich podejściu, ale nie znalazłem dobry przykład końcowej współpracy javascript i Pythona.

Ostatecznie udało mi się spleść coś, co pasowało do moich potrzeb po wielu próbach i błędach.

W każdym razie zapukałem do przykładu js/webapp rozmawiającego z serwerem Pythona hostowanego w wyszukiwarce Google, który używa AES i klucza publicznego oraz klucza prywatnego RSA.

Chyba bym ją tutaj zamieścił linkiem na wypadek, gdyby był przydatny dla innych, którzy muszą wykonać to samo.

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

i zobaczyć demo w RSA-AES-demo DOT appspot DOT com

edit: patrzeć na wyjściu konsoli przeglądarka, a także przeglądać źródła, aby uzyskać pewne wskazówki i użyteczne wiadomości co do tego, co jest dzieje się w demo

edycji: updated bardzo stary i nieistniejącego link do tej pory źródła wskazują

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

+1

Dziękuję WAM bardzo za to! Nie mogłem do końca życia dostać moje javascriptowe aes do rozmowy z moimi python. – Spike

+1

Próbowałem całą noc (z pycrypto i innymi), aby zrobić to, co pomógł mi mój kod w ciągu 10 minut. Dziękuję bardzo! –

+1

Bez względu na przyczynę, RSA działa łatwo, ale AES jest królewskim bólem.Dziękuję Ci za to!!! – speedplane

1

Jeśli próbujesz użyć javascript, aby uniknąć przy użyciu protokołu SSL, pomyśl jeszcze raz. Istnieje wiele metod połowicznych, ale SSL zapewnia bezpieczną komunikację. Biblioteki szyfrowania JavaScript mogą pomóc w pewnym zestawie ataków, ale nie w prawdziwym ataku man-in-the-middle.

Jeśli szukasz SSL dla silnika aplikacji Google w niestandardowej domenie, spójrz na numer wwwizer.com.

Poniższy post wyjaśnia, jak tworzyć próba bezpieczną komunikację z javascript i jak się to źle: Use JavaScript encryption module instead of SSL/HTTPS

+1

Nie wiem, dlaczego zostało to odrzucone do zapomnienia, ponieważ jest to bardzo dobry punkt, że każdy, kto myśli o implementacji szyfrowania javascript, musi przynajmniej rozważyć. Rewizja. – Jules

+0

Korzystanie z szyfrowania po stronie klienta w celu uniknięcia SSL to stary punkt, który niektórzy ludzie twierdzą, że się temu sprzeciwia: w rzeczywistości może dodać ochronę do HTTPS, uniknąć ataków pasywnych lub być wykorzystywany w pobranych aplikacjach i rozszerzeniach przeglądarki. Właśnie zobaczyłem, że kiedyś został użyty nieprawidłowo (moja szkoła, ale już to naprawili) i wielokrotnie używano go poprawnie (na przykład kryptokat). –

10

Ten post jest stary, ale crypto-js, może być teraz najbardziej kompletny javascript biblioteki szyfrowania.

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

Możesz zajrzeć do ich Quick-start Guide, która jest również odniesieniem dla następującego portu node.js.

node-cryptojs-aes jest node.js port crypto-js

+1

Niestety brakuje dokumentacji. Wydaje się, że tylko przewodnik "szybkiego startu". Gdzie jest pełna dokumentacja? Mówi, że obsługuje wiele kluczy długości, ale nie ma dokumentacji, jak to zrobić. – CpnCrunch

+0

@CpnCrunch: pełny dokument API nie jest online, ale kod jako pełne komentarze do javadoc API. I możesz go wygenerować. Przeczytaj komentarze na temat [źródło kodu cipher-core.js] (http://code.google.com/p/crypto-js/source/browse/tags/3.1.2/src/cipher-core.js) znajdziesz szyfr rozmiar klucza i rozmiar IV szyfru. – marcz

+0

Dziwne, kiedy szyfruję i odszyfrowuję z powrotem, teksty są różne – OMGPOP

7

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

Od 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) 

Edit:Web Cryptography API jest teraz implemented in most browsers 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 wykorzystywała obietnic.

Niektóre przykłady można znaleźć tutaj:

+0

Dostaję około 8 MiB/s z CryptoJS. Ciekawe, jak by to się udało. – Lodewijk

4

Spróbuj asmcrypto.js - to naprawdę szybko.

PS: Jestem autorem i mogę odpowiedzieć na wszelkie pytania. Również byłbym zadowolony, aby uzyskać pewne informacje zwrotne :)

+0

asmcrypto.js jest ładne, ale na IE10 nie działa dobrze. zawiesza się w przeglądarce na więcej niż 1 minutę lub przynajmniej 45 sekund. Poza tym nie rozumiem, dlaczego musisz zastąpić funkcję globalnej matematyki? jest wiele bibliotek, które używają tego. – decho

+2

Czy możesz skomentować, że masz pewność, że działa poprawnie? IOW: Skąd wiesz, że właściwie zaimplementowałeś AES? – Lodewijk

+0

Wydajność IE10 jest niska, ponieważ nie optymalizuje ona w ogóle asm.js. Ma też trochę inne wzory JIT. Sprawienie, by kod działał dobrze w IE, powoduje również jego zasysanie w Chrome i FF. Załóżmy, że mam właściwy wybór. Odnośnie do _Math.random_ była długa dyskusja (https://github.com/vibornoff/asmcrypto.js/issues/27). Krótko mówiąc, ta potrzeba zapobiegania wyciekowi surowego _Math.random_ (co teoretycznie może pogarszać bezpieczeństwo PRNG). – vibornoff