• crypto
  • edge

ย้ายจาก Node.js crypto ไปยัง Web Crypto API: ประสบการณ์การแนะนำ

ลึกเข้าไปในประสบการณ์การเปลี่ยนถ่ายของ crypto ไปยัง Web Crypto API โดยให้คำแนะนำที่ครอบคลุมเกี่ยวกับ 3 สถานการณ์ทั่วไป

Sijie
Sijie
Developer

บทนำ

Web Crypto API เป็นเครื่องมือ JavaScript ใหม่สำหรับการเข้ารหัสลับ มันเข้ากันได้กับเบราว์เซอร์ที่ทันสมัยและแพลตฟอร์มชั้นนำ รวมถึง Cloudflare Workers และ Vercel รวมทั้ง Node.js ความสามารถในการทำงานร่วมกันในลักษณะนี้หมายถึงความฝันของนักพัฒนา - เขียนโค้ดการเข้ารหัสลับของคุณครั้งเดียวและรันบนแพลตฟอร์มที่หลากหลายโดยใช้ Web Crypto API

อย่างไรก็ตาม Node.js มีโมดูล "crypto" ที่มีประวัติยาวนาน เหลือให้โค้ดรุ่นเก่าที่ต้องการการย้ายจำนวนมาก ในบทความนี้ เราจะเจาะลึกถึงประสบการณ์การเปลี่ยนถ่าย โดยให้คำแนะนำที่ครอบคลุมเกี่ยวกับ 3 สถานการณ์ทั่วไป เรามุ่งหวังที่จะแนะนำเส้นทางที่จะนำไปสู่ความสำเร็จในการย้าย

Web Crypto API คืออะไร

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

API ให้ primitive สำหรับการสร้างคีย์, การเข้ารหัสและถอดรหัส, ลายเซ็นดิจิตอล, การอนุพันธ์คีย์และบิต, และข้อคัดย่อการเข้ารหัส มันมุ่งเน้นรอบอินเตอร์เฟสที่เรียกว่า SubtleCrypto สามารถค้นหารายละเอียดเพิ่มเติมและบทเรียนที่เอกสาร MDN ของ Mozilla

แต่ Node.js มีโมดูล crypto อยู่แล้ว?

นักพัฒนา Node.js มักจะคุ้นเคยกับ โมดูล crypto มันมีชุด primitive การเข้ารหัสที่ครอบคลุม โมดูลนี้ไม่เพียงแต่จัดเตรียมกลไกสำหรับการดำเนินการเข้ารหัสเดียวกันที่กำหนดใน Web Crypto API แต่ยังรวมถึงอัลกอริธึมการเข้ารหัสที่หลากหลายกว่า

แล้วทำไมเราถึงยังต้องการ Web Crypto API? เนื่องจาก JavaScript กำลังได้รับความนิยมเพิ่มขึ้นในแพลตฟอร์มและสภาพแวดล้อมมากมาย จากฝั่งไคลเอนต์ถึงเซิร์ฟเวอร์และโดยเฉพาะอย่างยิ่งในระดับ edge มันจึงสำคัญที่จะมีเครื่องมือการเข้ารหัสที่ข้ามแพลตฟอร์มเพื่อทำให้กระบวนการง่ายขึ้น

นอกจากนี้ ฟังก์ชันในมาตรฐาน Web Crypto API ทั้งหมดคืนค่า promise และรองรับไวยากรณ์ async/await นี่เป็นข้อได้เปรียบที่สำคัญเหนือโมดูล crypto ซึ่งเป็น synchronous และสามารถบล็อก event loop

และยังมีสิ่งที่น่าสนใจที่ Node.js ได้เพิ่ม การสนับสนุน สำหรับ Web Crypto API ซึ่งหมายความว่า ในเกือบทุกกรณี Web Crypto API เหมาะสมบนแพลตฟอร์มที่เป็นที่รู้จักส่วนใหญ่

การใช้ Web Crypto API

บนแพลตฟอร์มส่วนใหญ่ คอลเลกชันของ Web Crypto APIs สามารถเข้าถึงได้ผ่านวัตถุ crypto ทั่วโลก ซึ่งรวมถึงยูทิลิตี้ 3 รายการระดับบน: getRandomValues, randomUUID และ subtle

มีความแตกต่างมากมายเมื่อเปรียบเทียบกับโมดูล crypto แบบดั้งเดิม ซึ่งสามารถสรุปเป็น 3 ส่วนที่พบได้บ่อยที่สุด มาดูกันว่าพวกมันและวิธีที่จะย้ายจากโค้ดที่มีอยู่

#1 สร้างค่าแบบสุ่ม

ในโมดูล crypto คุณสามารถสร้างค่าที่สุ่มได้โดยเรียก randomBytes

มีฟังก์ชันที่คล้ายกันที่เรียกว่า getRandomValues ใน Web Crypto แต่ค่าคืนเป็น ArrayBuffer ดังนั้นเราจึงต้องมีขั้นตอนอื่นเพื่อแปลงมันเป็นสตริง

#2 การสร้างแฮช (หรือคัดย่อ)

createHash ใช้งานง่ายในโมดูล crypto:

ใน Web Crypto เราสามารถใช้ subtle.digest

อย่างที่คุณเห็น การแปลงจาก ArrayBuffer เป็นสตริง hex ก็จำเป็นเช่นกัน

#3 การเข้ารหัสและถอดรหัส

ในโมดูล crypto สามารถนำไปใช้ AES การเข้ารหัสและถอดรหัสด้วย:

ใน Web Crypto เราต้องสร้างคีย์โดย importKey ก่อน:

บทสรุป

อย่างที่คุณเห็น การย้ายไม่ยาก งานหลักคือการเปลี่ยนไวยากรณ์ให้เหมาะกับ API ใหม่และแก้ไข ArrayBuffer ด้วย TextEncoder

ในฐานะผลิตภัณฑ์การระบุตัวตน Logto ใช้การเข้ารหัสลับในหลายที่ เราได้ย้ายจากโมดูล crypto ไปยัง Web Crypto API การเปลี่ยนถ่ายนี้ช่วยให้เราปรับตัวกับสภาพแวดล้อม edge ได้ดีขึ้นและทำให้สามารถเรียกใช้โค้ด SDK อย่างปลอดภัยในเบราว์เซอร์