การเข้ารหัส Javascript AES [ปิด]


109

มีไลบรารีสำหรับการเข้ารหัส AES 256 บิตใน Javascript หรือไม่


นี่คือสิ่งที่คุณต้องการสำหรับการเข้ารหัส AES โดยใช้ crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("ข้อความ", "รหัสผ่าน"); var ถอดรหัส = CryptoJS.AES.decrypt (เข้ารหัส AES.toString (), "รหัสผ่าน"); console.log ("เข้ารหัส:", เข้ารหัส AES.toString ()); console.log ( "ถอดรหัส:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

คำตอบ:


66

JSAES คือการนำ AES มาใช้ใน JavaScript อย่างมีประสิทธิภาพ http://point-at-infinity.org/jsaes/


32
JSAES ได้รับอนุญาตภายใต้ GNU GPL - ดังนั้นจึงไม่สามารถใช้ได้กับบางโครงการ
Robert

11
ตอนนี้มีประโยชน์มากและมีcode.google.com/p/crypto-js
David Kierans

2
@HappyDeveloper ดีไม่มี. อย่าโทษใบอนุญาตสำหรับสิ่งนี้ ผู้เขียนเลือกใบอนุญาตผิดเนื่องจาก GPL ไม่เหมาะสำหรับห้องสมุด
inta

4
"ไม่มีค่าใช้จ่ายในการใช้งาน" แต่คุณไม่สามารถใช้งานได้หากต้องการปล่อยผลิตภัณฑ์ที่เป็นผลลัพธ์ภายใต้สิ่งอื่นที่ไม่ใช่ GPL
Curtis

3
JSAESเป็นจุดเริ่มต้นที่ดี แต่สามารถใช้เข้ารหัสข้อมูล 16 ไบต์เท่านั้น หากคุณต้องการเข้ารหัสบล็อกข้อมูลที่ใหญ่ขึ้นคุณต้องขยายด้วยตัวเองเพื่อใช้งานเวกเตอร์การเริ่มต้นโหมดเข้ารหัส (CBC หรืออื่น ๆ ... ) ช่องว่างภายใน
เปาโล

35

นี่คือหน้าสาธิตที่ใช้ slowAES

slowAESนั้นใช้งานง่าย ออกแบบอย่างมีเหตุผล บรรจุภัณฑ์ OO ที่เหมาะสม รองรับลูกบิดและคันโยกเช่น IV และโหมดการเข้ารหัส เข้ากันได้ดีกับ. NET / C # ชื่อลิ้น - แก้ม; เรียกว่า " AES ช้า " เนื่องจากไม่ได้ใช้งานใน C ++ แต่ในการทดสอบของฉันมันไม่ได้ช้าจนทำไม่ได้

ไม่มีโหมด ECB นอกจากนี้ยังไม่มีโหมด CTR แม้ว่าคุณจะสามารถสร้างโหมด ECB ได้อย่างง่ายดาย แต่ฉันเดาว่า

เน้นการเข้ารหัสเพียงอย่างเดียว ชั้นเสริมที่ดีที่ไม่RFC2898เข้ากันใช้รหัสผ่านมาที่สำคัญใน Javascript เป็นใช้ได้จาก Anandam ไลบรารีคู่นี้ทำงานได้ดีกับคลาส. NET ที่คล้ายคลึงกัน การทำงานร่วมกันที่ดี แม้ว่าในทางตรงกันข้ามกับ SlowAES Javascript PBKDF2 นั้นช้ากว่าคลาสRfc2898DeriveBytesอย่างเห็นได้ชัดเมื่อสร้างคีย์

ไม่น่าแปลกใจที่ในทางเทคนิคมีการทำงานร่วมกันที่ดี แต่ประเด็นสำคัญสำหรับฉันคือรูปแบบที่ใช้โดย SlowAES นั้นคุ้นเคยและใช้งานง่าย ฉันพบว่าไลบรารี Javascript อื่น ๆ สำหรับ AES นั้นยากที่จะเข้าใจและใช้งาน ตัวอย่างเช่นในบางส่วนฉันไม่พบตำแหน่งที่จะตั้งค่า IV หรือโหมด (CBC, ECB ฯลฯ ) สิ่งต่างๆไม่ได้อยู่ในที่ที่ฉันคาดหวังไว้ SlowAES ไม่ได้เป็นเช่นนั้น คุณสมบัติถูกต้องตามที่ฉันคาดหวังไว้ มันเป็นเรื่องง่ายสำหรับฉันที่จะรับเพราะคุ้นเคยกับโมเดลการเขียนโปรแกรม crypto ของ Java และ. NET

PBKDF2 ของ Anandam ไม่ค่อยอยู่ในระดับนั้น รองรับการเรียกใช้ฟังก์ชัน DeriveBytes เพียงครั้งเดียวดังนั้นหากคุณต้องการรับทั้งคีย์และ IV จากรหัสผ่านไลบรารีนี้จะไม่ทำงานไม่เปลี่ยนแปลง การปรับเปลี่ยนเล็กน้อยและใช้งานได้ดีสำหรับจุดประสงค์นั้น

แก้ไข : ฉันรวบรวมตัวอย่างของบรรจุภัณฑ์SlowAESและPBKDF2ของAnandamเวอร์ชันดัดแปลงไว้ใน Windows Script Components การใช้ AES นี้กับคีย์ที่ได้รับรหัสผ่านจะแสดงการทำงานร่วมกันที่ดีกับคลาส. NET RijndaelManaged

แก้ไข 2 : หน้าสาธิตแสดงวิธีใช้การเข้ารหัส AES นี้จากหน้าเว็บ การใช้อินพุตเดียวกัน (iv, คีย์, โหมด ฯลฯ ) ที่รองรับใน. NET ช่วยให้คุณทำงานร่วมกันได้ดีกับคลาส. NET Rijndael คุณสามารถสร้าง "ดูแหล่งที่มา" เพื่อรับจาวาสคริปต์สำหรับหน้านั้น

แก้ไข
เพิ่มเติมในช่วงท้าย: การเข้ารหัส Javascript ถือว่าเป็นอันตราย คุ้มค่ากับการอ่าน



1
ฉันเห็นกรณีการใช้งานที่ถูกต้อง - แอป HTML 5 ซึ่งไฟล์ทั้งหมดจะถูกเก็บไว้ในเครื่อง หากไฟล์ในเครื่องสามารถถูกแย่งชิงได้แสดงว่าคุณถึงวาระไม่ว่าในกรณีใด ๆ ;-)
Nux

8
เกี่ยวกับลิงก์แก้ไข 3 มันเป็นส่วนหนึ่งของบทความ ... ครึ่งหนึ่งของข้อความนั้นเป็นเท็จทั้งหมด!
mmm

2
ปัญหาคีย์แบบสุ่มสามารถแก้ไขได้โดยให้ผู้ใช้เลื่อนเมาส์และป้อนคีย์เป็นตัวสร้างแบบสุ่มจริง
mmm

2
ดูเหมือนว่าลิงก์ไปยังหน้าสาธิตจะเสีย
ฌอน

26

ในการค้นหาการเข้ารหัส AES ฉันพบสิ่งนี้จากนักเรียน Standford บางคน อ้างว่าเร็วที่สุด รองรับการเข้ารหัส CCM, OCB, GCM และ Block http://crypto.stanford.edu/sjcl/


นั่นคือสิ่งที่ฉันกำลังพูดถึง!
mmm

5
เอกสารขาดและใช้งานยาก คุณจะเปลี่ยนความยาวคีย์ได้อย่างไร? ฉันตามล่าหาเอกสารและไม่สามารถหาได้ในเวลาอันสมควร นอกจากนี้เมื่อคุณเข้ารหัสบางสิ่งคุณจะได้รับอาร์เรย์ของคู่คีย์ - ค่าที่ส่งคืน แต่เอกสารดูเหมือนจะไม่อธิบายสิ่งเหล่านี้ ฉันลงเอยด้วยการใช้ไลบรารีชนิดเคลื่อนย้ายได้
CpnCrunch

และนี่ไม่ใช่ async ดังนั้นหากคุณกำลังเข้ารหัสหรือถอดรหัสสตริงที่ยาวกว่าเช่น AES-CBC จะบล็อก UI
rsz

12

Googling "JavaScript AES"พบตัวอย่างมากมาย อันแรกที่โผล่ขึ้นมาได้รับการออกแบบมาเพื่ออธิบายอัลกอริทึมรวมถึงวิธีแก้ปัญหา:

สคริปต์ประเภทที่เคลื่อนย้ายได้: AES


1
ฉันคิดไม่ออกว่าจะตั้งค่า IV ในไลบรารีนั้นอย่างไร ยังไม่ OO มาก
Cheeso

ค่าเทียบเท่าของ IV ในโหมดตัวนับคือ nonce การดำเนินการนี้ได้รับการปรับรูปแบบให้เป็น OO มากขึ้น จะรวมเฉพาะโหมดการทำงานของตัวนับ (CTR) เท่านั้น
ChrisV

ใช้งานได้ดียกเว้นไม่มีโหมด ECB
CpnCrunch

10

โพสต์นี้เก่าแล้ว แต่crypto-jsอาจเป็นไลบรารีการเข้ารหัสจาวาสคริปต์ที่สมบูรณ์ที่สุด

CryptoJSคือชุดของอัลกอริทึมการเข้ารหัสที่ใช้ใน JavaScript ประกอบด้วยไซเฟอร์ต่อไปนี้: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop และแฮช: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 กับ 224, 256, 384 หรือ 512 บิต

คุณอาจต้องการดูคู่มือเริ่มต้นใช้งานฉบับย่อซึ่งเป็นข้อมูลอ้างอิงสำหรับพอร์ต node.js ต่อไปนี้

node-cryptojs-aesคือพอร์ต node.js ของcrypto-js


1
น่าเสียดายที่เอกสารขาด ดูเหมือนว่าจะมีเพียงคำแนะนำ "เริ่มต้นอย่างรวดเร็ว" เท่านั้น เอกสารฉบับเต็มอยู่ที่ไหน? มันบอกว่ารองรับความยาวคีย์ได้หลายแบบ แต่ไม่มีเอกสารเกี่ยวกับวิธีการทำเช่นนั้น
CpnCrunch

@CpnCrunch: เอกสาร API ฉบับเต็มไม่ออนไลน์ แต่รหัสเป็นความคิดเห็น javadoc api แบบเต็ม และคุณสามารถสร้างได้ อ่านความคิดเห็นเกี่ยวกับcipher-core.js source youl ค้นหาขนาดคีย์ของ cipher และขนาด IV ของการเข้ารหัส
marcz

แปลกเมื่อฉันเข้ารหัสและถอดรหัสกลับข้อความจะแตกต่างกัน
OMGPOP

มีความขัดแย้งเนื่องจากการใช้งาน openssl
Vlad

9

เมื่อเร็ว ๆ นี้ฉันจำเป็นต้องทำการเข้ารหัส / ถอดรหัสการทำงานร่วมกันระหว่าง javascript และ python

โดยเฉพาะ ...

1) การใช้ AES เพื่อเข้ารหัสในจาวาสคริปต์และถอดรหัสใน python (Google App Engine) 2) การใช้ RSA เพื่อเข้ารหัสในจาวาสคริปต์และถอดรหัสใน python (Google App Engine) 3) การใช้ pycrypto

ฉันพบ RSA และ AES เวอร์ชันต่างๆมากมายที่ลอยอยู่บนเว็บและพวกเขาต่างก็มีแนวทางที่แตกต่างกัน แต่ฉันไม่พบตัวอย่างที่ดีของการทำงานร่วมกันของจาวาสคริปต์และหลามแบบ end to end

ในที่สุดฉันก็สามารถรวบรวมสิ่งที่เหมาะกับความต้องการของฉันได้หลังจากลองผิดลองถูกมาหลายครั้ง

อย่างไรก็ตามฉันเคาะตัวอย่างของ js / webapp ที่พูดคุยกับโปรแกรม google app ที่โฮสต์เซิร์ฟเวอร์ python ที่ใช้ AES และคีย์สาธารณะและสิ่ง RSA คีย์ส่วนตัว

ฉันแม้ว่าฉันจะรวมไว้ที่นี่ด้วยลิงก์ในกรณีที่อาจมีประโยชน์กับผู้อื่นที่ต้องการทำสิ่งเดียวกัน

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

และดูการสาธิตได้ที่ rsa-aes-demo DOT appspot DOT com

แก้ไข: ดูที่เอาต์พุตคอนโซลของเบราว์เซอร์และดูแหล่งที่มาเพื่อรับคำแนะนำและข้อความที่เป็นประโยชน์เกี่ยวกับสิ่งที่เกิดขึ้นในการสาธิต

แก้ไข: อัปเดตลิงก์ที่เก่ามากและหมดอายุไปยังแหล่งที่มาให้ชี้ไปที่

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


1
ขอบคุณมากสำหรับเรื่องนี้! ฉันไม่สามารถใช้ javascript aes เพื่อคุยกับ python aes ของฉันได้ตลอดชีวิต
เข็ม

1
ฉันพยายามตลอดทั้งคืน (ด้วย pycrypto และอื่น ๆ ) เพื่อทำสิ่งที่รหัสของคุณช่วยให้ฉันทำสำเร็จใน 10 นาที ขอบคุณมาก!
Remy Vanherweghem

1
ไม่ว่าด้วยเหตุผลใดก็ตามฉันจึงทำให้ RSA ทำงานได้อย่างง่ายดาย แต่ AES เป็นความเจ็บปวดของราชวงศ์ ขอบคุณสำหรับสิ่งนี้!!!
เครื่องบินเร็ว

1
ไม่พบลิงค์ ... !
machineaddict

7

จากประสบการณ์ของฉันเองasmcrypto.js นำเสนอการใช้งาน AES ที่เร็วที่สุดใน JavaScript (โดยเฉพาะใน Firefox เนื่องจากสามารถใช้ประโยชน์จาก asm.js ได้อย่างเต็มที่)

จาก 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)

แก้ไข:ขณะนี้Web Cryptography APIถูกนำไปใช้ในเบราว์เซอร์ส่วนใหญ่แล้วและควรใช้เป็นโซลูชันหลักหากคุณสนใจเกี่ยวกับประสิทธิภาพ โปรดทราบว่า IE11 ใช้มาตรฐานเวอร์ชันร่างก่อนหน้าซึ่งไม่ได้ใช้สัญญา

ตัวอย่างบางส่วนสามารถพบได้ที่นี่:


ฉันได้รับประมาณ 8 MiB / s ด้วย CryptoJS สงสัยว่าจะทำอย่างไร
Lodewijk


3

ลองasmcrypto.js - มันเร็วมาก

PS: ฉันเป็นผู้เขียนและฉันสามารถตอบคำถามของคุณได้หากมี นอกจากนี้ฉันยินดีที่จะรับคำติชม :)


asmcrypto.js นั้นดี แต่ใน IE10 นั้นใช้งานได้ไม่ดี มันแฮงค์เบราว์เซอร์นานกว่า 1 นาทีในบางครั้งหรืออย่างน้อย 45 วินาที นอกจากนี้ฉันไม่เข้าใจทำไมคุณต้องแทนที่ฟังก์ชันคณิตศาสตร์ทั่วโลก มีห้องสมุดจำนวนมากที่ใช้ห้องสมุดนี้
เดโช

2
คุณช่วยแสดงความคิดเห็นว่าคุณแน่ใจได้อย่างไรว่ามันทำงานอย่างถูกต้อง? IOW: คุณรู้ได้อย่างไรว่าคุณติดตั้ง AES อย่างถูกต้อง?
Lodewijk

ประสิทธิภาพของ IE10 ไม่ดีเนื่องจากไม่ได้ปรับ asm.js ให้เหมาะสมเลย นอกจากนี้ยังมีรูปแบบ JIT ที่แตกต่างกันเล็กน้อย การทำให้โค้ดทำงานได้ดีใน IE ยังทำให้ Chrome และ FF ดูดเข้าไปอีกด้วย สมมติว่าฉันมีทางเลือกที่ถูกต้อง เกี่ยวกับMath.randomมีความยาวการอภิปราย พูดสั้น ๆ ถึงความจำเป็นในการป้องกันการรั่วไหลของเอาต์พุตMath.random แบบดิบ(ซึ่งในทางทฤษฎีอาจลดความปลอดภัยของ PRNG)
vibornoff



1

หากคุณกำลังพยายามใช้จาวาสคริปต์เพื่อหลีกเลี่ยงการใช้ SSL ให้คิดใหม่อีกครั้ง มีมาตรการครึ่งทางมากมาย แต่SSL เท่านั้นที่ให้การสื่อสารที่ปลอดภัย ไลบรารีการเข้ารหัส Javascript สามารถช่วยป้องกันการโจมตีบางชุดได้ แต่ไม่ใช่การโจมตีแบบ man-in-the-middle

หากคุณกำลังมองหา SSL สำหรับเครื่องยนต์แอป Google บนโดเมนที่กำหนดเองจะดูที่wwwizer.com

โพสต์ต่อไปนี้อธิบายถึงวิธีสร้างความพยายามในการสื่อสารที่ปลอดภัยด้วยจาวาสคริปต์และวิธีการทำให้ผิดพลาด: ใช้โมดูลการเข้ารหัส JavaScript แทน SSL / HTTPS


1
ไม่แน่ใจว่าเหตุใดสิ่งนี้จึงถูกลดลงเพื่อให้ลืมเลือนเนื่องจากเป็นจุดที่ดีมากที่ใครก็ตามที่คิดจะใช้การเข้ารหัสจาวาสคริปต์จะต้องพิจารณาอย่างน้อยที่สุด โหวตแล้ว
Jules

การใช้การเข้ารหัสลับฝั่งไคลเอ็นต์เพื่อหลีกเลี่ยง SSL เป็นจุดเก่าที่บางคนบอกว่าต่อต้านมันจริง ๆ แล้วมันสามารถเพิ่มความปลอดภัยให้กับ HTTPS หลีกเลี่ยงการโจมตีแฝงหรือใช้ในแอปพลิเคชันที่ดาวน์โหลดและส่วนขยายของเบราว์เซอร์ ฉันเพิ่งเห็นครั้งหนึ่งที่ใช้ผิด (วิทยาลัยของฉัน แต่พวกเขาแก้ไขแล้ว) และหลายครั้งใช้ถูก (ตัวอย่างเช่น cryptocat)
Gustavo Rodrigues



1

นี่คือทางออกเดียวที่เหมาะกับฉัน:

http://www.hanewin.net/encrypt/aes/aes.htm

มันค่อนข้างธรรมดา แต่ใช้งานง่ายและดูเหมือนจะทำงานได้ดี


คุณเรียกใช้ฟังก์ชันเข้ารหัสและถอดรหัสได้อย่างไร?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.