SecureString ใช้งานได้จริงในแอปพลิเคชัน C # หรือไม่
อย่าลังเลที่จะแก้ไขฉันหากข้อสันนิษฐานของฉันผิดที่นี่ แต่ให้ฉันอธิบายว่าทำไมฉันถึงถาม นำมาจาก MSDN, a SecureString: แสดงถึงข้อความที่ควรเก็บเป็นความลับ ข้อความถูกเข้ารหัสเพื่อความเป็นส่วนตัวเมื่อมีการใช้งานและลบออกจากหน่วยความจำคอมพิวเตอร์เมื่อไม่ต้องการใช้อีกต่อไป ฉันได้รับมันทำให้รู้สึกที่สมบูรณ์ในการจัดเก็บรหัสผ่านหรือข้อมูลส่วนตัวอื่น ๆ ในSecureStringช่วงเวลาSystem.Stringเพราะคุณสามารถควบคุมวิธีการและเวลาที่มันถูกเก็บไว้ในหน่วยความจำจริงเพราะSystem.String: มีทั้งที่ไม่เปลี่ยนรูปและเมื่อไม่ต้องการอีกต่อไปจะไม่สามารถกำหนดตารางเวลาทางโปรแกรมสำหรับการรวบรวมขยะ นั่นคืออินสแตนซ์จะอ่านอย่างเดียวหลังจากที่มันถูกสร้างขึ้นและมันเป็นไปไม่ได้ที่จะทำนายเมื่ออินสแตนซ์จะถูกลบออกจากหน่วยความจำคอมพิวเตอร์ ดังนั้นหากวัตถุ String มีข้อมูลที่ละเอียดอ่อนเช่นรหัสผ่านหมายเลขบัตรเครดิตหรือข้อมูลส่วนบุคคลมีความเสี่ยงที่ข้อมูลจะถูกเปิดเผยหลังจากใช้งานเพราะแอปพลิเคชันของคุณไม่สามารถลบข้อมูลออกจากหน่วยความจำคอมพิวเตอร์ อย่างไรก็ตามในกรณีของโปรแกรม GUI (ตัวอย่างเช่นลูกค้า SSH) ที่จะต้องมีการสร้างขึ้นจากSecureString System.Stringทั้งหมดของการควบคุมข้อความที่ใช้สตริงเป็นชนิดข้อมูลพื้นฐาน ดังนั้นนี่หมายความว่าทุกครั้งที่ผู้ใช้กดปุ่มสตริงเก่าที่ถูกทิ้งและสตริงใหม่จะถูกสร้างขึ้นเพื่อเป็นตัวแทนของค่าภายในกล่องข้อความแม้ว่าจะใช้หน้ากากรหัสผ่าน และเราไม่สามารถควบคุมได้ว่าค่าเหล่านั้นจะถูกทิ้งจากหน่วยความจำเมื่อใดหรือไม่ ถึงเวลาเข้าสู่ระบบเซิร์ฟเวอร์แล้ว คาดเดาอะไร คุณต้องผ่านสตริงผ่านการเชื่อมต่อสำหรับการรับรองความถูกต้อง งั้นเรามาแปลงSecureStringเป็น a System.String.... และตอนนี้เรามีสตริงบน heap โดยไม่มีทางบังคับให้ผ่านการรวบรวมขยะ (หรือเขียน 0 ไปยังบัฟเฟอร์) จุดของฉันคือ : ไม่ว่าสิ่งที่คุณทำบางเส้นที่SecureStringจะไปที่จะถูกแปลงเป็นSystem.Stringความหมายมันจะมีอยู่ที่อย่างน้อยในกองในบางจุด (โดยไม่มีการรับประกันของการเก็บขยะใด ๆ ) จุดของฉันไม่ใช่ : มีวิธีหลีกเลี่ยงการส่งสตริงไปยังการเชื่อมต่อ ssh หรือหลีกเลี่ยงการมีตัวควบคุมเก็บสตริง (ทำการควบคุมแบบกำหนดเอง) สำหรับคำถามนี้คุณสามารถแทนที่ "การเชื่อมต่อ …