คำตอบที่มีอยู่ซึ่งใช้ประโยชน์จาก SJCL, CryptoJS และ / หรือ WebCrypto ไม่จำเป็นต้องผิดแต่คำตอบนั้นไม่ปลอดภัยเท่าที่คุณสงสัย โดยทั่วไปคุณต้องการที่จะใช้ libsodium ก่อนอื่นฉันจะอธิบายว่าทำไมจึงเป็นเช่นนั้น
ทำไมไม่ใช้ SJCL, CryptoJS, WebCrypto เป็นต้น?
คำตอบสั้น ๆ :เพื่อให้การเข้ารหัสของคุณปลอดภัยจริง ๆ ห้องสมุดเหล่านี้คาดหวังว่าคุณจะมีตัวเลือกมากเกินไปเช่นโหมดการเข้ารหัสบล็อก (CBC, CTR, GCM ถ้าคุณไม่สามารถบอกได้ว่าหนึ่งในสามที่ฉันเพิ่งระบุไว้นั้นปลอดภัย ใช้และภายใต้ข้อ จำกัด คุณไม่ควรรับภาระกับตัวเลือกประเภทนี้เลย )
นอกจากตำแหน่งงานของคุณจะเป็นวิศวกรการเข้ารหัสอัตราต่อรองจะซ้อนกับคุณในการใช้งานอย่างปลอดภัย
ทำไมต้องหลีกเลี่ยง CryptoJS
CryptoJS นำเสนอการสร้างบล็อกจำนวนหนึ่งและคาดว่าคุณจะรู้วิธีใช้อย่างปลอดภัย มันเริ่มต้นที่โหมด CBC ( เก็บถาวร )
เหตุใดโหมด CBC จึงไม่ดี
อ่านบทความนี้เกี่ยวกับช่องโหว่ AES-CBC
ทำไมต้องหลีกเลี่ยง WebCrypto
WebCrypto เป็นมาตรฐานที่ได้รับการออกแบบโดยคณะกรรมการเพื่อจุดประสงค์ที่ตั้งฉากกับวิศวกรรมการเข้ารหัส โดยเฉพาะWebCrypto ถูกหมายถึงการเปลี่ยนแฟลช, ไม่ให้ความปลอดภัย
ทำไมต้องหลีกเลี่ยง SJCL
API สาธารณะและเอกสารของ SJCL ขอให้ผู้ใช้เข้ารหัสข้อมูลด้วยรหัสผ่านที่มนุษย์จำได้ นี่เป็นสิ่งที่คุณไม่ค่อยอยากทำในโลกแห่งความเป็นจริง
นอกจากนี้: PBKDF2 เริ่มต้นนับรอบของมันคือประมาณ86 ครั้งที่มีขนาดเล็กที่สุดเท่าที่คุณอยากให้มันเป็น AES-128-CCM น่าจะใช้ได้
จากสามตัวเลือกข้างต้น SJCL มีโอกาสน้อยที่จะจบด้วยน้ำตา แต่มีตัวเลือกที่ดีกว่า
ทำไม Libsodium ถึงดีกว่า?
คุณไม่จำเป็นต้องเลือกระหว่างเมนูของโหมดตัวเลขฟังก์ชันแฮชและตัวเลือกที่ไม่มีความจำเป็นอื่น ๆ คุณจะไม่เสี่ยงกวดขันขึ้นพารามิเตอร์ของคุณและลบการรักษาความปลอดภัยทั้งหมดออกจากโพรโทคอของคุณ
แต่libsodiumให้ตัวเลือกที่เรียบง่ายแก่คุณเพื่อความปลอดภัยสูงสุดและ API ที่เรียบง่าย
crypto_box()
/ crypto_box_open()
เสนอการเข้ารหัสคีย์สาธารณะที่มีการรับรองความถูกต้อง
- อัลกอริทึมที่เป็นปัญหาประกอบด้วย X25519 (ECDH over Curve25519) และ XSalsa20-Poly1305 แต่คุณไม่จำเป็นต้องรู้
crypto_secretbox()
/ crypto_secretbox_open()
เสนอการเข้ารหัสที่รับรองความถูกต้องของคีย์ที่ใช้ร่วมกัน
- อัลกอริทึมที่เป็นปัญหาคือ XSalsa20-Poly1305 แต่คุณไม่จำเป็นต้องรู้ / ดูแล
นอกจากนี้ libsodium มีการผูกไว้ในภาษาการเขียนโปรแกรมยอดนิยมหลายสิบภาษาดังนั้นจึงเป็นไปได้มากที่ libsodium จะทำงานเมื่อพยายามทำงานร่วมกับสแต็คการเขียนโปรแกรมอื่น นอกจากนี้ libsodium มีแนวโน้มที่จะเร็วมากโดยไม่ลดทอนความปลอดภัย
วิธีใช้ Libsodium ใน JavaScript
ก่อนอื่นคุณต้องตัดสินใจเลือกสิ่งหนึ่ง:
- คุณเพียงแค่ต้องการเข้ารหัส / ถอดรหัสข้อมูล (และอาจจะยังคงใช้ข้อความธรรมดาในการสืบค้นฐานข้อมูลอย่างปลอดภัย) และไม่ต้องกังวลกับรายละเอียด? หรือ...
- คุณจำเป็นต้องใช้โปรโตคอลเฉพาะหรือไม่?
หากคุณเลือกตัวเลือกแรก , รับCipherSweet.js
เอกสารที่ได้คือพร้อมใช้งานออนไลน์ EncryptedField
เพียงพอสำหรับกรณีการใช้งานส่วนใหญ่ แต่EncryptedRow
และEncryptedMultiRows
API อาจง่ายกว่าถ้าคุณมีฟิลด์ที่แตกต่างกันจำนวนมากที่คุณต้องการเข้ารหัส
ด้วย CipherSweet คุณไม่จำเป็นต้องรู้เลยว่า nonce / IV คือการใช้อย่างปลอดภัย
นอกจากนี้วิธีนี้จะจัดการint
/ float
เข้ารหัสโดยไม่รั่วไหลข้อเท็จจริงเกี่ยวกับเนื้อหาผ่านขนาด ciphertext
มิฉะนั้นคุณจะต้องการโซเดียมบวก ,ซึ่งเป็นส่วนหน้าใช้งานง่ายเพื่อห่อ libsodium ต่างๆ Sodium-Plus ช่วยให้คุณสามารถเขียนรหัส, แบบอะซิงโครนัส, ข้ามแพลตฟอร์มที่ง่ายต่อการตรวจสอบและเหตุผลเกี่ยวกับ
หากต้องการติดตั้ง sodium-plus เพียงรัน ...
npm install sodium-plus
ขณะนี้ไม่มี CDN สาธารณะสำหรับการสนับสนุนเบราว์เซอร์ จะมีการเปลี่ยนแปลงในไม่ช้า อย่างไรก็ตามคุณสามารถคว้าsodium-plus.min.js
จากรุ่นล่าสุด Githubถ้าคุณต้องการมัน
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
เอกสารสำหรับโซเดียมบวกมีอยู่ใน Github
หากคุณต้องการบทช่วยสอนทีละขั้นตอนบทความ dev.to นี้มีสิ่งที่คุณกำลังมองหา