2009-04-27 131 views
91

Có thư viện nào có sẵn để mã hóa AES 256 bit trong Javascript không?Mã hóa AES Javascript

+0

Dưới đây là những gì bạn cần để mã hóa AES bằng crypto-js

Trả lời

59

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

+26

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

+0

Làm cách nào để chỉ định 'chế độ hoạt động' và IV? Trông không phải là một lựa chọn. –

+11

Tính năng này hiện hữu ích và giàu tính năng http://code.google.com/p/crypto-js/ –

12

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

Movable Type Scripts: 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

+0

Tương đương với IV trong chế độ truy cập là nonce. Việc thực hiện này đã được cải cách để có nhiều OO hơn. Nó chỉ bao gồm chế độ hoạt động của bộ đếm (CTR). – ChrisV

+0

Đ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

35

Đây là a demonstration page sử dụng slowAES.

slowAES dễ sử dụng. Thiết kế hợp lý. Hợp lý OO bao bì. Hỗ trợ các nút bấm và đòn bẩy như chế độ Mã hóa và IV. Khả năng tương thích tốt với .NET/C#. Cái tên là lưỡi-trong-má; nó được gọi là "slow AES" 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 phải là chậm chạp.

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

Nó chỉ tập trung vào mã hóa. Một lớp bổ sung tốt đẹp thực hiện RFC2898 bắt nguồn từ khóa dựa trên mật khẩu đầy đủ, trong Javascript, là available from Anandam. Cặp thư viện này hoạt động tốt với các lớp .NET tương tự. Tốt interop. Mặc dù, 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.

Thật không ngạc nhiên khi kỹ thuật có giao tiếp tốt, nhưng điểm mấu chốt đối với tôi là mô hình được chấp nhận bởi SlowAES rất quen thuộc và dễ sử dụng. Tôi đã tìm thấy một số thư viện Javascript khác cho AES khó hiểu và sử dụng. Ví dụ, trong một số người trong số họ tôi không thể tìm thấy nơi để thiết lập IV, hoặc chế độ (CBC, ECB, vv). Mọi thứ không phải là nơi tôi mong đợi. SlowAES không như thế. Các tài sản đã đúng nơi tôi mong đợi họ được. Thật dễ dàng để tôi nhận, đã quen thuộc với các mô hình lập trình 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 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ư viện này sẽ không hoạt động, không thay đổi. Một số sửa đổi nhỏ, và nó hoạt động tốt cho mục đích đó.

EDIT: Tôi đặt cùng an example bao bì SlowAES và một phiên bản sửa đổi của Anandam của PBKDF2 vào Windows Script Components. Sử dụng AES này với một khóa có nguồn gốc từ mật khẩu cho thấy sự tương tác tốt với lớp .NET RijndaelManaged.

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

EDIT3
một bổ sung cuối: Javascript Cryptography considered harmful. Worth đọc.

+8

+1 cho [Mật mã JavaScript được coi là có hại] (http://www.matasano.com/articles/javascript-cryptography/) –

+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ữ ở địa phương. Nếu các tập tin địa phương có thể bị tấn công thì bạn phải chịu số phận trong mọi trường hợp ;-). – Nux

+8

về liên kết edit3, nó là một phần 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! – momomo

24

Trong các tìm kiếm của tôi cho mã hóa AES, tôi đã tìm thấy điều này từ một số sinh viên của Standford. Yêu cầu được nhanh nhất ra khỏi đó.Hỗ trợ mã hóa CCM, OCB, GCM và Block. http://crypto.stanford.edu/sjcl/

+0

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

+5

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

+0

Và điều này không phải là không đồng bộ 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ó chặn giao diện người dùng – rsz

8

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ụ thể ...

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 RSA và AES khác nhau trên web và tất cả đều khác nhau trong cách tiếp cận của chúng nhưng tôi không tìm thấy ví dụ điển hình về khả năng tương thích giữa javascript và python.

Cuối cùng tôi đã xoay xở để cùng nhau điều gì đó phù hợp với nhu cầu của tôi sau nhiều lần thử và sai.

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

Tôi mặc dù tôi sẽ bao gồm nó ở đây bằng liên kết trong trường hợp nó sẽ được sử dụng một số cho những người khác cần phải thực hiện cùng một điều.

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

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

chỉnh sửa: nhìn vào trình duyệt giao diện điều khiển đầu ra và cũng có thể xem mã nguồn để có được một số gợi ý và thông điệp hữu ích như những gì xảy ra trong bản demo

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

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

+1

Cảm ơn bạn rất nhiều vì điều này! Tôi không thể cho cuộc sống của tôi có được aes javascript của tôi để nói chuyện với ae trăn của tôi. – Spike

+1

Tôi đã cố gắng cả đêm (với pycrypto và những người 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! –

+1

Vì lý do nào đó tôi có RSA làm việc 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!!! – speedplane

1

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

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

Các bài sau đây giải thích làm thế nào để tạo ra thông tin liên lạc an toàn nỗ lực với javascript và làm thế nào để có được nó sai: Use JavaScript encryption module instead of SSL/HTTPS

+1

Không chắc chắn lý do tại sao điều này đã được downvoted để lãng quên, vì nó là một điểm rất tốt mà bất cứ ai nghĩ đến việc thực hiện mã hóa javascript cần phải ít nhất là xem xét. Được thăng hạng. – Jules

+0

Sử dụng mật mã phía máy khách để tránh SSL là điểm cũ mà một số người nói để chống lại nó: trên thực tế nó có thể thêm 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 của trình duyệt. Tôi chỉ thấy một khi nó được sử dụng sai (trường đại học của tôi, nhưng họ đã cố định nó) và nhiều lần sử dụng đúng (cryptocat, làm ví dụ). –

10

bài này bây giờ là cũ, nhưng crypto-js, có thể bây giờ là hoàn thiện nhất javascript thư viện mã hóa.

CryptoJS là tập hợp các thuật toán mã hóa được triển khai trong JavaScript. Nó bao gồm các cyphers sau: AES-128, AES-192, AES-256, DES, Triple DES, Thỏ, RC4, RC4Drop và hashers: 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 Quick-start Guide cũng là tham chiếu 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 là tài liệu bị thiếu. Nó chỉ có vẻ như có một hướng dẫn 'bắt đầu nhanh'. Tài liệu đầy đủ ở đâu? Nó nói nó hỗ trợ nhiều độ dài khóa, nhưng không có tài liệu hướng dẫn về cách thực hiện điều đó. – CpnCrunch

+0

@CpnCrunch: tài liệu API đầy đủ không trực tuyến, nhưng mã là nhận xét đầy đủ về javadoc api. Và bạn có thể tạo ra nó. Đọc các nhận xét trên [cipher-core.js source] (http://code.google.com/p/crypto-js/source/browse/tags/3.1.2/src/cipher-core.js) youl tìm thấy thuật toán mã hóa kích thước khóa và kích thước IV của mật mã. – marcz

+0

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

7

Đánh giá theo 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ó có thể tận dụng đầy đủ asm.js tại đó).

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) 

Edit: Các Web Cryptography API tại là implemented in most browsers và nên đượ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. Hãy lưu ý 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 lời hứa.

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

+0

Tôi nhận được khoảng 8 MiB/s với CryptoJS. Tự hỏi làm thế nào điều này sẽ thực hiện. – Lodewijk

4

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

PS: 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 muốn được vui để nhận được một số phản hồi :)

+0

asmcrypto.js là tốt đẹp, nhưng trên IE10 nó không hoạt động tốt. nó treo trình duyệt trong hơn 1 phút đôi khi, hoặc ít nhất 45 giây. Ngoài ra, tôi không hiểu, tại sao bạn cần thay thế chức năng Toán toàn cầu? có rất nhiều thư viện sử dụng thư viện 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 đúng không? IOW: Làm thế nào để bạn biết bạn đã triển khai AES đúng cách? – Lodewijk

+0

Hiệu năng IE10 kém vì nó không tối ưu hóa asm.js. Ngoài ra nó có một chút mẫu JIT khác nhau. Làm cho mã hoạt động tốt trong IE cũng làm cho nó bị hút trong Chrome và FF. Giả sử tôi có lựa chọn đúng. Liên quan đến _Math.random_ có một [thảo luận] dài (https://github.com/vibornoff/asmcrypto.js/issues/27). Nói ngắn gọn nhu cầu này để phòng ngừa rò rỉ đầu ra _Math.random_ thô (theo lý thuyết có thể làm suy giảm an ninh PRNG). – vibornoff

Các vấn đề liên quan