Tink ใช้ชุดคีย์เพื่อเปิดใช้การหมุนเวียนคีย์ ในทางเทคนิคแล้ว ชุดคีย์คือรายการคีย์ที่ไม่ว่าง1 ซึ่งมีคีย์หนึ่งที่กำหนดเป็นคีย์หลัก (คีย์ที่ใช้ เช่น เพื่อลงนามและเข้ารหัสข้อความธรรมดาใหม่) นอกจากนี้ คีย์ ในชุดคีย์จะมีรหัสที่ไม่ซ้ำกัน2 และสถานะคีย์ซึ่งช่วยให้ ปิดใช้คีย์ได้โดยไม่ต้องนำออกจากชุดคีย์
ชุดคีย์เป็นวิธีหลักที่ผู้ใช้จะเข้าถึงคีย์ได้ (ผ่านคลาส KeysetHandle) ซึ่งช่วยให้มั่นใจได้ว่าผู้ใช้ทุกคนจะมีโค้ดสำหรับจัดการคีย์หลายรายการพร้อมกัน สำหรับผู้ใช้วิทยาการเข้ารหัสส่วนใหญ่ การจัดการคีย์หลายรายการเป็นสิ่งจำเป็น คุณต้องเปลี่ยนคีย์ได้ (เช่น คีย์เก่าอาจรั่วไหล)
และแทบจะไม่มีการ "เปลี่ยนไปใช้คีย์ถัดไป" แบบอะตอม
ซึ่งใช้กับเครื่องที่โค้ดทำงานและข้อความเข้ารหัสทั้งหมดได้
ทั่วโลกและในทันที ดังนั้น ผู้ใช้จึงต้องเขียนโค้ดที่
ทำงานเมื่อเปลี่ยนจากคีย์หนึ่งไปยังคีย์ถัดไป
ตัวอย่าง: AEAD
พิจารณาชุดคีย์ AEAD ซึ่งมีคีย์หลายรายการสำหรับ Primitive 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 จะต้องลองใช้คีย์เพียงคีย์เดียวเมื่อถอดรหัส
อย่างไรก็ตาม เนื่องจากแท็กเป็นส่วนหนึ่งของคีย์ จึงหมายความว่าคีย์จะอยู่ในชุดคีย์ได้ก็ต่อเมื่อมีรหัสที่เฉพาะเจาะจงเท่านั้น ซึ่งส่งผลบางอย่างเมื่อ อธิบายการใช้งานออบเจ็กต์หลักใน ภาษาต่างๆ
คีย์ที่ต้องมีรหัสแต่ไม่มีคำนำหน้าเอาต์พุต
คีย์บางรายการต้องมีรหัสที่เฉพาะเจาะจง แต่ไม่ต้องเพิ่มคำนำหน้าในเอาต์พุต ตัวอย่างเช่น คีย์ลายเซ็นที่มีตัวแปร NO_PREFIX_WITH_PREHASH_ID (จัดเก็บด้วยประเภทคำนำหน้าเอาต์พุต WITH_ID_REQUIREMENT) จะสร้างลายเซ็นที่ไม่มีคำนำหน้า เมื่อคุณใช้คีย์ดังกล่าวกับ Primitive Prehash Tink จะเขียนรหัสคีย์ลงในค่า Prehash เพื่อให้ผู้ลงนามจากระยะไกลทราบว่าควรใช้คีย์ใด
ในการลงนาม
เช่นเดียวกับคีย์ที่ใช้คำนำหน้า คีย์ดังกล่าวจะอยู่ในชุดคีย์ภายใต้รหัสนั้นได้เพียงรหัสเดียว รหัสคีย์ในค่าก่อนแฮชคือข้อมูลเมตาแบบข้อความธรรมดา เช่นเดียวกับคำนำหน้าเอาต์พุต ลายเซ็นไม่ได้ผูกรหัสคีย์ไว้ และผู้ตรวจสอบจะไม่เห็นรหัสคีย์ สำหรับเลย์เอาต์ระดับไบต์ โปรดดูรูปแบบการส่งผ่านข้อมูลของ Tink
-
Tink บางส่วนยังคงถือว่าชุดคีย์เป็นชุด อย่างไรก็ตาม คุณควรเปลี่ยนรหัสนี้ เนื่องจากโดยทั่วไปแล้วลำดับมีความสำคัญ ตัวอย่างเช่น ลองพิจารณาวงจรการหมุนเวียนคีย์ทั่วไปด้วย Aead ขั้นแรก ระบบจะเพิ่มคีย์ใหม่ลงในชุดคีย์ คีย์นี้ยังไม่ได้เป็นคีย์หลัก แต่ใช้งานได้ เราได้เปิดตัวชุดคีย์ใหม่นี้ในไบนารีทั้งหมดแล้ว เมื่อไบนารีทั้งหมด ทราบคีย์ใหม่แล้ว ระบบจะตั้งค่าคีย์ให้เป็นคีย์หลัก (เฉพาะในตอนนี้เท่านั้นที่การใช้คีย์นี้ จะปลอดภัย) ในขั้นตอนที่ 2 นี้ การหมุนเวียนคีย์จะต้องทราบคีย์ล่าสุดที่เพิ่ม ↩
-
Tink อนุญาตให้มีชุดคีย์ที่มีการทำซ้ำรหัสเพื่อให้เข้ากันได้กับไลบรารีภายในของ Google ระบบจะนำการสนับสนุนนี้ออกในอนาคต ↩