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