จะเปลี่ยนคีย์ aes-256 หลังจากเข้ารหัสได้อย่างไร?

ฉันมีเว็บไซต์ที่ผู้ใช้ส่งข้อมูลส่วนบุคคลของพวกเขา และฉันกำลังคิดที่จะเข้ารหัสข้อมูลเหล่านี้โดยใช้ aes-256 และรหัสผ่านของพวกเขาถูกใช้เป็นกุญแจสำคัญในการเข้ารหัสนั้น จากนั้นฉันก็จัดเก็บข้อมูลที่เข้ารหัสไว้ในฐานข้อมูล mysql...

ตอนนี้หากผู้ใช้เปลี่ยนรหัสผ่าน ฉันจะเปลี่ยนคีย์ของข้อมูลที่เข้ารหัสได้อย่างไร

ฉันควรรวบรวมข้อมูลทั้งหมดจากฐานข้อมูลแล้วถอดรหัสข้อมูลด้วยคีย์เก่าแล้วเข้ารหัสอีกครั้งด้วยคีย์ใหม่หรือไม่


person Michael harris    schedule 24.01.2012    source แหล่งที่มา


คำตอบ (4)


คุณไม่จำเป็นต้องเข้ารหัสข้อมูลทั้งหมดของผู้ใช้อีกครั้งเมื่อผู้ใช้เปลี่ยนรหัสผ่าน

สร้างคีย์ลับเพื่อเข้ารหัสข้อมูลของผู้ใช้ เรียกสิ่งนี้ว่า "คีย์การเข้ารหัสเนื้อหา" รับรหัสจากรหัสผ่านของผู้ใช้ เรียกสิ่งนี้ว่า "คีย์เข้ารหัสคีย์" เข้ารหัส "คีย์เข้ารหัสเนื้อหา" โดยใช้ "คีย์เข้ารหัสคีย์" เก็บคีย์ที่เข้ารหัสไว้พร้อมกับเกลือและจำนวนการวนซ้ำที่ใช้สำหรับการรับคีย์

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

เนื่องจากคีย์การเข้ารหัสเนื้อหาได้รับการสุ่มเลือกจากพื้นที่ขนาดใหญ่ คุณจึงสามารถใช้ ECB เป็นโหมดการเข้ารหัสได้อย่างปลอดภัยเมื่อทำการเข้ารหัส

อย่าเพียงแค่แฮชรหัสผ่าน แม้ว่าคุณจะใช้เกลือ แม้ว่าคุณจะใช้อัลกอริธึมที่ยังไม่เสียหายก็ตาม คุณต้องดำเนินการแฮชซ้ำหลายพันครั้ง มีไลบรารีสำหรับทำสิ่งนี้ (อย่างถูกต้อง) บนแพลตฟอร์มส่วนใหญ่ ใช้อัลกอริธึมการรับคีย์ (PBKDF2 จาก PKCS #5) เพื่อสร้างคีย์ลับจากรหัสผ่าน

แนวคิดนี้เป็นไปตามแบบร่างสำหรับการเข้ารหัส S/MIME ที่ใช้รหัสผ่าน

person erickson    schedule 24.01.2012
comment
คีย์เข้ารหัสจะถูกเก็บไว้ที่ไหน? ในหน่วยความจำบนแอปพลิเคชันเซิร์ฟเวอร์ หรือในที่เก็บข้อมูลจริงบนเซิร์ฟเวอร์ฐานข้อมูล - person dimiguel; 14.06.2017
comment
@dimgl เก็บไว้ในที่เก็บข้อมูลถาวรที่เชื่อถือได้พร้อมการสำรองข้อมูล ไม่อยู่ในความทรงจำแน่นอน เว้นแต่คุณจะไม่สนใจว่าเนื้อหาจะถูกทำลายอย่างถาวรจากไฟฟ้าดับหรือไม่ - person erickson; 14.06.2017
comment
ทำอย่างไร เนื่องจากคีย์การเข้ารหัสเนื้อหาถูกสุ่มเลือกจากพื้นที่ขนาดใหญ่ช่วยแก้ปัญหากับ ECB - person Freek; 13.02.2020
comment
@Freek เนื่องจากข้อความธรรมดาทุกอัน (คีย์เข้ารหัสเนื้อหา) ที่ใช้กับคีย์เข้ารหัสคีย์ใดคีย์หนึ่งนั้นมีเอกลักษณ์เฉพาะตัว ไซเปอร์เท็กซ์ที่ได้จึงเป็นเช่นนั้น - person erickson; 13.02.2020
comment
ดูคำพูดที่สองจาก Applied Cryptography ที่นี่ - person erickson; 13.02.2020
comment
อ่า คุณหมายถึงการเข้ารหัสของการเข้ารหัสเนื้อหา ฉันอ่านการเข้ารหัสข้อมูล ด้วย คีย์การเข้ารหัสเนื้อหาเมื่อดูคำตอบนี้ครั้งแรก - person Freek; 13.02.2020

ประการแรก โดยทั่วไปคุณไม่ควรใช้รหัสผ่านเป็นคีย์ AES อาจมีบางอย่างเช่นแฮชเข้ารหัส (ไม่ใช่ MD5) ของรหัสผ่าน + เกลือ (คุณจะเก็บเกลือไว้ แต่ไม่ใช่แฮชในกรณีนี้)

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

person Jarred    schedule 24.01.2012

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

มันทำงานอย่างไร?

  • คุณเข้ารหัสข้อมูล D สำหรับผู้ใช้ U ด้วยคีย์ที่สร้างขึ้นแบบสุ่ม KU,D
  • คุณเข้ารหัสคีย์ KU,D ด้วยคีย์แยกต่างหาก K1U,K ที่สร้างจากเกลือสุ่ม S1U (ซึ่งคุณเก็บ บันทึก) และรหัสผ่านของผู้ใช้ P1U (ซึ่งคุณอาจจะหรืออาจจะไม่ติดตามก็ได้) คีย์ที่เข้ารหัสคือ E1U
  • คุณจัดเก็บ S1U และ K1U,K ให้พร้อมเมื่อผู้ใช้ต้องการเข้าถึงข้อมูลของตน
  • เมื่อผู้ใช้ U ต้องการเข้าถึงข้อมูลของพวกเขา พวกเขาจะให้รหัสผ่าน P1U แก่คุณ และให้คุณค้นหา S1U และสร้าง K1U,K ใหม่ sub> จากข้อมูลนั้น และใช้สิ่งนั้นเพื่อถอดรหัส E1U โดยให้ KU,D แก่คุณอีกครั้ง ซึ่งคุณสามารถถอดรหัสข้อมูลจริงได้
  • คุณมั่นใจได้ว่าคุณสามารถตรวจสอบได้เมื่อรหัสผ่านที่ให้มานั้นถูกต้อง เพื่อที่คุณจะได้ไม่พูดพล่อยๆ แบบไบนารีหากผู้ใช้พิมพ์รหัสผ่านผิด

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

ด้วยระดับของการอ้อม คุณยังคงแจ้งให้ผู้ใช้ทราบรหัสผ่านเก่า (P1U) และรหัสผ่านใหม่ (P2U) และตรวจสอบความถูกต้อง แต่คุณจะต้อง ถอดรหัส E1U จากนั้นเข้ารหัสอีกครั้งด้วยคีย์ใหม่ K2U,K ที่สร้างจากเกลือใหม่ S2U และรหัสผ่านใหม่ P2 คุณ. คุณไม่จำเป็นต้องแตะข้อมูลที่เข้ารหัสเลย

ด้วยระดับของการอ้อม ระบบ S ยังสามารถเก็บสำเนาคีย์ข้อมูล KU,D ที่เข้ารหัสชุดที่สองไว้ ซึ่งเข้ารหัสด้วยรหัสผ่านของระบบ หากจำเป็นหรือต้องการเปลี่ยนคีย์ที่ใช้ในการเข้ารหัสข้อมูล ระบบสามารถใช้สำเนาคีย์ที่เข้ารหัสเพื่อดำเนินการดังกล่าวได้ สามารถเก็บบันทึกว่าคีย์ใดที่ผู้ใช้บันทึกครั้งล่าสุดไว้ในคีย์ของตน ดังนั้นเมื่อผู้ใช้กลับมาดูข้อมูล ก็สามารถจัดให้เปลี่ยนคีย์ที่เก็บไว้ K2U,D ได้ เนื่องจาก ในขณะนั้นมีรหัสผ่าน (ส่วนที่เหลือไม่มี)

นี่เป็นการเปลี่ยนแปลงเล็กน้อยในแนวคิดบางส่วนใน "วิทยาการเข้ารหัสลับใน the Database: The Last Line of Defense" โดย Kevin Kenan คีย์ KnU,K เป็นตัวอย่างของ KEK ซึ่งเป็นคีย์การเข้ารหัสคีย์ คุณยังสามารถอ่านเกี่ยวกับตระกูลหลักได้ในหนังสือ ซึ่งจะช่วยในการจัดการข้อมูลที่เข้ารหัส

person Jonathan Leffler    schedule 24.01.2012

นั่นมันโง่

AES ใช้คีย์ 256 บิต ดังนั้นเมื่อคุณบอกว่าคุณจะใช้รหัสผ่านสำหรับคีย์ มันจะไม่นานเท่ากับข้อกำหนดขนาดคีย์

person Dan Kanze    schedule 24.01.2012
comment
ฉันจะแฮชรหัสผ่านเพื่อให้มีขนาด 256 ไบต์ จากนั้นใช้ในการเข้ารหัส - person Michael harris; 24.01.2012