ชุดคีย์

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

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

ตัวอย่าง: AEAD

ลองพิจารณาชุดคีย์ AEAD ซึ่งมีคีย์หลายรายการสำหรับพรอมิเตอ AEAD ดังที่ได้อธิบายไปก่อนหน้านี้ คีย์แต่ละรายการจะระบุฟังก์ชัน 2 รายการอย่างเจาะจง ดังนี้ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\)ตอนนี้ชุดคีย์ยังระบุฟังก์ชันใหม่ 2 รายการด้วย ได้แก่ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\) - \(\mathrm{Enc}\) ซึ่งจะเท่ากับฟังก์ชัน \(\mathrm{Enc}\) ของคีย์หลักของชุดคีย์ ขณะที่ฟังก์ชัน \(\mathrm{Dec}\) จะพยายามถอดรหัสด้วยคีย์ทั้งหมด โดยดูคีย์ตามลำดับ (ดูด้านล่างเพื่อดูวิธีที่ Tink ปรับปรุงประสิทธิภาพของการดำเนินการนี้)

สิ่งที่น่าสนใจคือชุดคีย์เป็นคีย์แบบสมบูรณ์ กล่าวคือเป็นคำอธิบายฟังก์ชัน \(\mathrm{Enc}\) และ\(\mathrm{Dec}\) ที่ใช้อย่างครบถ้วน ซึ่งหมายความว่าผู้ใช้สามารถเขียนคลาสที่รับKeysetHandleเป็นอินพุต ซึ่งแสดงถึงแนวคิดที่ว่าคลาสต้องมีคำอธิบายออบเจ็กต์ที่สมบูรณ์ \(\mathrm{Enc}\) และ \(\mathrm{Dec}\) เพื่อทำงานอย่างถูกต้อง ซึ่งช่วยให้ผู้ใช้เขียน API ที่สื่อสารว่าหากต้องการใช้คลาสนี้ คุณต้องระบุคำอธิบายขององค์ประกอบพื้นฐานของการเข้ารหัส

การหมุนเวียนคีย์

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

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

อย่างไรก็ตาม ผู้ใช้ต้องระมัดระวังเมื่อใช้การเปลี่ยนคีย์ดังกล่าว โดยเริ่มจาก KMS ควรเพิ่มคีย์ใหม่ลงในชุดคีย์ (แต่ยังไม่ได้ตั้งค่าเป็นคีย์หลัก) จากนั้นต้องเปิดตัวชุดคีย์ใหม่ในไบนารีทั้งหมด เพื่อให้ไบนารีทุกรายการที่ใช้ชุดคีย์นี้มีคีย์ใหม่ล่าสุดในชุดคีย์ จากนั้นจึงควรตั้งค่าคีย์ใหม่เป็นคีย์หลัก และเผยแพร่ชุดคีย์ที่ได้ไปยังไบนารีทั้งหมดที่ใช้ชุดคีย์นั้นอีกครั้ง

ตัวระบุคีย์ในข้อความที่เข้ารหัส

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

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

เมื่อคีย์อยู่ในชุดคีย์ Tink จะคํานวณแท็กนี้จากรหัสที่คีย์มีในชุดคีย์ การที่รหัส2ไม่ซ้ำกันภายในชุดคีย์หมายความว่าแท็กจะไม่ซ้ำกัน ดังนั้น หากใช้เฉพาะคีย์ที่ติดแท็ก ประสิทธิภาพจะไม่ลดลงเมื่อเทียบกับการถอดรหัสด้วยคีย์เดียว เนื่องจาก Tink จะต้องลองใช้คีย์เพียงคีย์เดียวเมื่อถอดรหัส

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


  1. ส่วนต่างๆ ของ Tink ยังคงถือว่าชุดคีย์เป็นชุด แต่คุณควรเปลี่ยน เหตุผลคือโดยทั่วไปแล้วลําดับเป็นสิ่งสำคัญ เช่น พิจารณาวงจรทั่วไปของการหมุนเวียนคีย์ด้วย Aead ก่อนอื่น ระบบจะเพิ่มคีย์ใหม่ลงในชุดคีย์ กุญแจนี้ยังไม่ได้ทำให้เป็นแบบหลัก แต่ใช้งานได้ ชุดคีย์ใหม่นี้จะเปิดตัวในไบนารีทั้งหมด เมื่อไบนารีทั้งหมดทราบคีย์ใหม่แล้ว ระบบจะตั้งค่าคีย์นั้นเป็นคีย์หลัก (เฉพาะในตอนนี้เท่านั้นที่การใช้คีย์นี้จะปลอดภัย) ในขั้นตอนที่ 2 นี้ การเปลี่ยนคีย์จะต้องทราบคีย์ล่าสุดที่เพิ่ม 

  2. Tink อนุญาตให้มีชุดคีย์ที่มีรหัสซ้ำกันเพื่อให้ใช้งานร่วมกับไลบรารีภายในของ Google ได้ เราจะนำการรองรับนี้ออกในอนาคต