ฉันกำลังทำงานร่วมกับทีมพัฒนาที่ใช้การเข้ารหัสเมื่อไม่มีการใช้งานที่ระดับแอปพลิเคชัน มีไว้สำหรับฟิลด์ที่ละเอียดอ่อนโดยเฉพาะภายใน 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 หรือเราจำเป็นต้องจัดเก็บข้อมูลการกำหนดเวอร์ชันที่สำคัญควบคู่ไปกับข้อมูลที่เข้ารหัสหรือไม่?
หรือมีวิธีที่ดีกว่านี้ในการแก้ปัญหาการหมุนเวียนคีย์ในสถานการณ์ของเราหรือไม่