Mã hóa Javascript AES [đã đóng]


109

Có thư viện nào dành cho mã hóa AES 256-bit trong Javascript không?


Dưới đây là những gì bạn cần để mã hóa AES bằng cách sử dụng crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var cryptisedAES = CryptoJS.AES.encrypt ("Message", "Passphrase"); var decrypted = CryptoJS.AES.decrypt (EncryptoAES.toString (), "Passphrase"); console.log ("Đã mã hóa:", đã mã hóaAES.toString ()); console.log ( "Decryised:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Câu trả lời:


66

JSAES là một triển khai mạnh mẽ của AES trong JavaScript. http://point-at-infinity.org/jsaes/


32
JSAES được cấp phép theo GNU GPL - do đó nó không thể sử dụng được cho một số dự án.
Robert

11
Điều này bây giờ là khá hữu ích và tính năng phong phú code.google.com/p/crypto-js
David Kierans

2
@HappyDeveloper Chà, không. Đừng đổ lỗi cho giấy phép cho điều này. Tác giả đã chọn sai giấy phép, vì GPL không phù hợp cho các thư viện.
inta

4
Nó "miễn phí để sử dụng", nhưng bạn không thể sử dụng nó nếu bạn muốn phát hành sản phẩm kết quả của mình theo một thứ gì đó khác với GPL.
Curtis

3
JSAES là một điểm khởi đầu tốt nhưng nó chỉ có thể được sử dụng để mã hóa 16 byte dữ liệu. Nếu bạn muốn mã hóa khối dữ liệu lớn hơn, bạn phải tự mở rộng nó để triển khai vector intialization, chế độ mã hóa (CBC hoặc khác ...), padding.
Paolo

35

Đây là trang trình diễn sử dụng slowAES.

slowAES rất dễ sử dụng. Được thiết kế hợp lý. Bao bì OO hợp lý. Hỗ trợ các nút và đòn bẩy như IV và chế độ Mã hóa. Tương thích tốt với .NET / C #. Tên là lưỡi trong má; nó được gọi là " AES chậm " vì nó không được triển khai trong C ++. Nhưng trong các thử nghiệm của tôi, nó không chậm một cách phi thực tế.

Nó thiếu chế độ ECB. Cũng thiếu chế độ CTR, mặc dù bạn có thể tạo một chế độ khá dễ dàng với chế độ ECB, tôi đoán vậy.

Nó chỉ tập trung vào mã hóa. Một lớp bổ sung tuyệt vời có khả năng lấy khóa dựa trên mật khẩu tuân thủ RFC2898 , trong Javascript, có sẵn từ Anandam . Cặp thư viện này hoạt động tốt với các lớp .NET tương tự. Tương tác tốt. Tuy nhiên, trái ngược với SlowAES, Javascript PBKDF2 chậm hơn đáng kể so với lớp Rfc2898DeriveBytes khi tạo khóa.

Không có gì ngạc nhiên khi về mặt kỹ thuật có một tương tác tốt, nhưng điểm mấu chốt đối với tôi là mô hình được SlowAES áp dụng rất quen thuộc và dễ sử dụng. Tôi thấy một số thư viện Javascript khác dành cho AES khó hiểu và khó sử dụng. Ví dụ: trong một số chúng, tôi không thể tìm thấy nơi để đặt IV hoặc chế độ (CBC, ECB, v.v.). Mọi thứ không như tôi mong đợi. SlowAES không như vậy. Các tài sản đã ở đúng nơi tôi mong đợi. Thật dễ dàng đối với tôi, tôi đã quen thuộc với các mô hình lập trình tiền điện tử Java và .NET.

PBKDF2 của Anandam không hoàn toàn ở cấp độ đó. Nó chỉ hỗ trợ một lệnh gọi đến hàm DeriveBytes, vì vậy nếu bạn cần lấy cả khóa và IV từ mật khẩu, thì thư viện này sẽ không hoạt động, không thay đổi. Một số sửa đổi nhỏ, và nó đang hoạt động tốt cho mục đích đó.

CHỈNH SỬA : Tôi đã tổng hợp một ví dụ về đóng gói SlowAES và một phiên bản sửa đổi của PBKDF2 của Anandam thành Thành phần Tập lệnh Windows. Sử dụng AES này với khóa lấy từ mật khẩu cho thấy khả năng tương tác tốt với lớp .NET RijndaelManaged.

EDIT2 : trang demo hiển thị cách sử dụng mã hóa AES này từ một trang web. Sử dụng các đầu vào tương tự (iv, phím, chế độ, v.v.) được hỗ trợ trong .NET mang lại cho bạn khả năng tương tác tốt với lớp .NET Rijndael. Bạn có thể làm một "nguồn xem" để lấy javascript cho trang đó.

EDIT3
một bổ sung muộn: Javascript Cryptography được coi là có hại. Đáng để đọc.



1
Tôi thấy một trường hợp sử dụng hợp lệ - ứng dụng HTML 5 trong đó tất cả các tệp được lưu trữ cục bộ. Nếu các tệp cục bộ có thể bị tấn công thì bạn sẽ phải chết trong mọi trường hợp ;-).
Nux

8
về liên kết edit3, nó là một mẩu tin tào lao của một bài báo ... một nửa các tuyên bố của nó là hoàn toàn sai sự thật!
mmm

2
Vấn đề khóa ngẫu nhiên có thể được giải quyết bằng cách yêu cầu người dùng di chuyển chuột và nhập các phím như một trình tạo ngẫu nhiên thực sự.
mmm

2
Liên kết đến trang trình diễn dường như bị hỏng.
Sean,

26

Trong các tìm kiếm mã hóa AES, tôi đã tìm thấy điều này từ một số sinh viên Standford. Tuyên bố là nhanh nhất hiện có. Hỗ trợ mã hóa CCM, OCB, GCM và Block. http://crypto.stanford.edu/sjcl/


đó là những gì tôi đang nói về!
mmm

5
Tài liệu thiếu và khó sử dụng. Làm thế nào để bạn thay đổi độ dài khóa? Tôi đã tìm kiếm khắp các tài liệu và không thể tìm ra nó trong thời gian hợp lý. Ngoài ra, khi bạn mã hóa thứ gì đó, bạn nhận được một mảng các cặp khóa-giá trị được trả về, nhưng tài liệu dường như không giải thích những điều này. Tôi đã kết thúc bằng cách sử dụng thư viện loại có thể di chuyển.
CpnCrunch

Và đây không phải là async vì vậy nếu bạn đang mã hóa hoặc giải mã một số chuỗi dài hơn ví dụ với AES-CBC, sau đó nó khối UI
rsz

12

Googling "JavaScript AES" đã tìm thấy một số ví dụ. Cái đầu tiên xuất hiện được thiết kế để giải thích thuật toán cũng như cung cấp giải pháp:

Tập lệnh loại có thể di chuyển: AES


1
Tôi không thể tìm ra cách đặt IV trong thư viện đó. Ngoài ra nó không phải là rất OO.
Cheeso

Tương đương với IV trong chế độ bộ đếm là nonce. Việc triển khai này đã được cải tiến để trở nên OO hơn. Nó chỉ bao gồm chế độ hoạt động của bộ đếm (CTR).
ChrisV

Điều này hoạt động khá tốt, ngoại trừ nó không có bất kỳ chế độ ECB nào.
CpnCrunch

10

Bài đăng này hiện đã cũ, nhưng tiền điện tử , hiện có thể là thư viện mã hóa javascript hoàn chỉnh nhất.

CryptoJS là một tập hợp các thuật toán mật mã được thực hiện bằng JavaScript. Nó bao gồm các bộ mã hóa sau: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop và các bộ băm: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 với 224, 256, 384 hoặc 512 bit.

Bạn có thể muốn xem Hướng dẫn bắt đầu nhanh của họ , đây cũng là tài liệu tham khảo cho cổng node.js sau.

node-cryptojs-aes là một cổng node.js của crypto-js


1
Thật không may, tài liệu là thiếu. Nó dường như chỉ có một hướng dẫn 'bắt đầu nhanh'. Tài liệu đầy đủ ở đâu? Nó cho biết nó hỗ trợ nhiều độ dài khóa, nhưng không có tài liệu về cách làm điều đó.
CpnCrunch

@CpnCrunch: tài liệu API đầy đủ không trực tuyến, nhưng mã dưới dạng nhận xét api javadoc đầy đủ. Và bạn có thể tạo ra nó. Đọc các nhận xét trên nguồn cipher-core.js, bạn sẽ tìm thấy kích thước khóa của mật mã và kích thước IV của mật mã.
marcz

lạ, khi tôi mã hóa và giải mã trở lại, các văn bản khác nhau
omgpop

Có một số xung đột vì sử dụng openssl
Vlad

9

Gần đây, tôi đã có nhu cầu thực hiện một số khả năng tương tác mã hóa / giải mã giữa javascript và python.

Đặc biệt...

1) Sử dụng AES để mã hóa trong javascript và giải mã trong python (Google App Engine) 2) Sử dụng RSA để mã hóa trong javascript và giải mã trong python (Google App Engine) 3) Sử dụng pycrypto

Tôi đã tìm thấy rất nhiều phiên bản khác nhau của RSA và AES trôi nổi trên web và chúng đều khác nhau trong cách tiếp cận nhưng tôi không tìm thấy một ví dụ nào tốt về khả năng tương tác giữa javascript và python.

Cuối cùng, tôi đã cố gắng tập hợp một cái gì đó phù hợp với nhu cầu của tôi sau rất nhiều lần thử và sai.

Nhưng dù sao, tôi đã lấy ra một ví dụ về js / webapp nói chuyện với máy chủ python được lưu trữ trên công cụ ứng dụng của Google sử dụng AES và công cụ RSA khóa công khai và khóa riêng tư.

Mặc dù tôi sẽ đưa nó vào đây theo liên kết trong trường hợp nó sẽ có ích cho những người khác, những người cần hoàn thành điều tương tự.

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

và xem demo tại rsa-aes-demo DOT appspot DOT com

chỉnh sửa: xem đầu ra bảng điều khiển trình duyệt và cũng xem nguồn để nhận một số gợi ý và thông báo hữu ích về những gì đang diễn ra trong bản trình diễn

chỉnh sửa: cập nhật liên kết rất cũ và không còn tồn tại đến nguồn cho đến nay trỏ tới

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


1
Cám ơn bạn rất nhiều về điều này! Cả đời này, tôi không thể bắt các aes javascript của mình nói chuyện với các aes python của mình.
Spike

1
Tôi đã cố gắng cả đêm (với pycrypto và những thứ khác) để làm những gì mã của bạn đã giúp tôi hoàn thành trong 10 phút. Cảm ơn bạn rất nhiều!
Remy Vanherweghem

1
Vì bất cứ lý do gì tôi nhận được RSA hoạt động dễ dàng nhưng AES là một nỗi đau của hoàng gia. Cảm ơn vì điều này!!!
bay cao tốc

1
liên kết ... không được tìm thấy!
machineaddict

7

Đánh giá từ kinh nghiệm của riêng tôi, asmcrypto.js cung cấp triển khai AES nhanh nhất trong JavaScript (đặc biệt là trong Firefox vì nó hoàn toàn có thể tận dụng asm.js ở đó).

Từ 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)

Chỉnh sửa: Các Web Cryptography API hiện đang thực hiện ở hầu hết các trình duyệt và phải được sử dụng như một giải pháp chính nếu bạn quan tâm đến hiệu suất. Cần biết rằng IE11 đã triển khai phiên bản dự thảo trước đó của tiêu chuẩn không sử dụng các hứa hẹn.

Một số ví dụ có thể được tìm thấy ở đây:


Tôi nhận được khoảng 8 MiB / giây với CryptoJS. Tự hỏi làm thế nào điều này sẽ hoạt động.
Lodewijk


3

Hãy thử asmcrypto.js - nó thực sự nhanh chóng.

Tái bút: Tôi là tác giả và tôi có thể trả lời câu hỏi của bạn nếu có. Ngoài ra, tôi rất vui khi nhận được một số phản hồi :)


asmcrypto.js rất hay, nhưng trên IE10 thì nó không hoạt động tốt. đôi khi nó treo trình duyệt hơn 1 phút hoặc ít nhất 45 giây. Thêm vào đó, tôi không hiểu, tại sao bạn cần thay thế hàm Toán học toàn cục? có rất nhiều thư viện sử dụng cái này.
decho

2
Bạn có thể nhận xét về cách bạn chắc chắn rằng nó hoạt động bình thường không? IOW: Làm thế nào để bạn biết bạn đã triển khai AES đúng cách?
Lodewijk

Hiệu suất IE10 kém do nó không tối ưu hóa asm.js cả. Ngoài ra nó có các mẫu JIT khác một chút. Làm cho mã hoạt động tốt trong IE cũng khiến nó bị Chrome và FF thu hút. Giả sử tôi đã lựa chọn đúng. Về Math.random , đã có một cuộc thảo luận dài . Nói ngắn gọn là nhu cầu ngăn chặn rò rỉ đầu ra Math.random thô (về lý thuyết có thể làm giảm bảo mật PRNG).
vibornoff



1

Nếu bạn đang cố gắng sử dụng javascript để tránh sử dụng SSL, hãy suy nghĩ lại. Có nhiều biện pháp nửa vời, nhưng chỉ SSL cung cấp giao tiếp an toàn. Các thư viện mã hóa Javascript có thể giúp chống lại một số cuộc tấn công nhất định, nhưng không phải là một cuộc tấn công trung gian thực sự.

Nếu bạn đang tìm kiếm SSL cho công cụ ứng dụng google trên miền tùy chỉnh, hãy xem tại wwwizer.com .

Bài đăng sau giải thích cách tạo cố gắng giao tiếp an toàn với javascript và cách xử lý sai: Sử dụng mô-đun mã hóa JavaScript thay vì SSL / HTTPS


1
Không chắc tại sao điều này lại bị lãng quên, vì đó là một điểm rất tốt mà bất kỳ ai nghĩ đến việc triển khai mã hóa javascript ít nhất cũng cần phải xem xét. Đã ủng hộ.
Jules

Sử dụng tiền điện tử phía máy khách để tránh SSL là một điểm cũ mà một số người nói là đi ngược lại: trên thực tế, nó có thể tăng cường bảo mật cho HTTPS, tránh các cuộc tấn công thụ động hoặc được sử dụng trong các ứng dụng đã tải xuống và tiện ích mở rộng trình duyệt. Tôi chỉ thấy một lần nó được sử dụng sai (trường đại học của tôi, nhưng họ đã sửa nó) và nhiều lần được sử dụng đúng (ví dụ như cryptocat).
Gustavo Rodrigues



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.