Score:1

การหมุนเวียนคีย์และการกำหนดเวอร์ชันสำหรับการเข้ารหัสขณะพัก

ธง jp

ฉันกำลังทำงานร่วมกับทีมพัฒนาที่ใช้การเข้ารหัสเมื่อไม่มีการใช้งานที่ระดับแอปพลิเคชัน มีไว้สำหรับฟิลด์ที่ละเอียดอ่อนโดยเฉพาะภายใน RDB (ที่เก็บข้อมูล DB พื้นฐานมีชั้นการเข้ารหัสเพิ่มเติม แต่นั่นไม่ใช่หัวข้อที่นี่) เรากำลังใช้ Spring's AesBytesEncryptor และคลาสที่เกี่ยวข้องสำหรับสิ่งนั้น

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

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

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

ฉันหวังว่าจะหลีกเลี่ยงสิ่งนั้นได้โดยใช้การตรวจสอบผลรวมของแบบฟอร์มแทน แอปพลิเคชันจะลองใช้คีย์ถอดรหัสในทางกลับกัน จนกว่าจะได้ค่าที่ถอดรหัสซึ่งไม่ทำลายผลรวมตรวจสอบ

เข้าใจแล้ว AesBytesEncryptor ของ Spring อาจให้ทุกอย่างที่เราต้องการแล้ว แต่ความเสถียรจะขึ้นอยู่กับโหมดที่เราใช้ นี่คือความคิดของฉันเกี่ยวกับสองโหมดที่รองรับ:

  • โหมด AES/CBC/PKCS5การเติม: ไม่มีการตรวจสอบต่อ se แต่ช่องว่างภายในอาจเสียหายเมื่อพยายามถอดรหัสด้วยคีย์ที่ไม่ถูกต้อง อย่างไรก็ตาม ขึ้นอยู่กับขนาดของช่องว่างภายใน ซึ่งขึ้นอยู่กับขนาดข้อมูลข้อความล้วน กรณีที่เลวร้ายที่สุดอาจมีช่องว่างภายในเพียง 1 ไบต์ ดังนั้นโอกาสที่จะโดนช่องว่างภายในที่ถูกต้องด้วยคีย์ถอดรหัสผิดอาจสูงถึง 1/256 ดูเหมือนจะเสี่ยงเกินไปที่จะพึ่งพา

  • โหมด AES/GCM/NoPadding: ที่นี่ "แท็กการรับรองความถูกต้อง" GCM ทำหน้าที่เป็นรูปแบบการตรวจสอบ เท่าที่ฉันเข้าใจมันยาว 128 บิต (16 ไบต์) สำหรับ AES เสมอ นั่นหมายถึงโอกาสที่จะโดนแท็กยืนยันตัวตนที่ถูกต้องด้วยคีย์ถอดรหัสผิดคือประมาณ 1/(2^128)ซึ่งไม่เคยเกิดขึ้นจริง ดังนั้นฉันคิดว่ามันน่าจะเหมาะกับการใช้งานของเรา

สมมติฐานข้างต้นถูกต้องหรือไม่? ฉันผิดอะไร

คุณคิดว่ามันแข็งแกร่งพอที่จะลองใช้คีย์ถอดรหัสหลายคีย์พร้อมกันระหว่างการหมุนคีย์หรือไม่ เมื่อใช้ AES/GCM/NoPadding หรือเราจำเป็นต้องจัดเก็บข้อมูลการกำหนดเวอร์ชันที่สำคัญควบคู่ไปกับข้อมูลที่เข้ารหัสหรือไม่?

หรือมีวิธีที่ดีกว่านี้ในการแก้ปัญหาการหมุนเวียนคีย์ในสถานการณ์ของเราหรือไม่

SAI Peregrinus avatar
si flag
คุณต้องหมุนคีย์การเข้ารหัสข้อมูลจริง (DEK) หรือไม่ วิธีทั่วไปคือการมีคีย์สองคีย์: คีย์เข้ารหัสข้อมูลที่ไม่มีวันเปลี่ยนแปลงและไม่ถูกเก็บไว้ ซึ่งเข้ารหัสด้วย "คีย์การเข้ารหัสคีย์" (KEK) และค่าที่เข้ารหัสนั้น (และ KEK) จะถูกเก็บไว้ ในการหมุนเวียนคีย์ คุณต้องถอดรหัส DEK (ใน RAM ตามปกติ) โดยใช้ KEK เก่า จากนั้นเข้ารหัสโดยใช้ KEK ใหม่และจัดเก็บข้อความเข้ารหัสนั้น สามารถทำได้ในการทำธุรกรรมฐานข้อมูลเดียว
meeque avatar
jp flag
ใช่ เรากำลังเล็งแนวทาง KEK/DEK อย่างไรก็ตามมีหลายรสชาติที่แตกต่างกันเช่น เมื่อพูดถึง[ความละเอียด](https://cloud.google.com/kms/docs/envelope-encryption#balancing_deks_and_keks) หรือต้องหมุน KEK/DEK อย่างไรและอย่างไร ฉันได้ข้อสรุปว่าเราควรจะหมุนเวียนทั้ง KEK และ DEK ได้ และฉันคิดว่าคำถามนี้เกี่ยวข้องกับทั้งสองข้อ นั่นเป็นเหตุผลที่ฉันพยายามหลีกเลี่ยงหัวข้อ KEK/DEK ที่กล่าวว่าถ้าใครต้องการเปลี่ยนใจฉันสามารถถามคำถามแยกต่างหากได้ ... ยังไงก็ตาม ฉันยังต้องการฟีดแบ็คเกี่ยวกับสิ่งนี้ :)
meeque avatar
jp flag
มีใครอยากยิงคำถามเดิมอีกไหม?

โพสต์คำตอบ

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