Varsayımlarım yanlışsa beni düzeltmekten çekinmeyin, ama neden sorduğumu açıklayayım.
MSDN'den alınan SecureString
:
Gizli tutulması gereken metni temsil eder. Metin kullanıldığında gizlilik için şifrelenir ve artık gerekmediğinde bilgisayar belleğinden silinir.
Bunu anlıyorum, bir parola veya diğer özel bilgileri bir SecureString
üzerinde saklamak tam anlamıyla mantıklı System.String
, çünkü gerçekte nasıl ve ne zaman bellekte saklanacağını kontrol edebilirsiniz, çünkü System.String
:
hem değişmez hem de artık gerekmediğinde, çöp toplama için programlı olarak planlanamaz; yani, örnek oluşturulduktan sonra salt okunurdur ve örneğin bilgisayar belleğinden ne zaman silineceğini tahmin etmek mümkün değildir. Sonuç olarak, bir String nesnesi parola, kredi kartı numarası veya kişisel veriler gibi hassas bilgiler içeriyorsa, uygulamanız verileri bilgisayar belleğinden silemediği için bilgilerin kullanıldıktan sonra açığa çıkma riski vardır.
Ancak, bir GUI uygulaması (örneğin, bir ssh istemcisi) söz SecureString
konusu olduğunda, a System.String
. Tüm metin denetimleri , temel veri türü olarak bir dize kullanır .
Bu, kullanıcı bir tuşa her bastığında, oradaki eski dizenin atıldığı ve parola maskesi kullanıyor olsa bile metin kutusundaki değerin ne olduğunu göstermek için yeni bir dize oluşturulduğu anlamına gelir. Ve bu değerlerden herhangi birinin bellekten ne zaman atılacağını veya atılacağını kontrol edemeyiz .
Şimdi sunucuya giriş yapma zamanı. Bil bakalım ne oldu? Kimlik doğrulama için bağlantının üzerinden bir dize geçirmeniz gerekir . O halde bizim dönüştürmek izin SecureString
bir içine System.String
.... ve şimdi çöp toplama geçmesi zorlamak (veya tampon ile 0'lar yazma) için bir yol ile yığın bir dize var.
Benim noktasıdır : sen ne olursa olsun, hat boyunca bir yerde, SecureString
bir gidiş bir çevrilmek üzere System.String
bunu anlamı, bir noktada yığın üzerinde en varoldukları için de (çöp toplama bir garantisi olmadan) olacak.
Benim açımdan : ssh bağlantısına bir dize göndermeyi engellemenin veya bir kontrol deposunun bir dizgiye sahip olmasını engellemenin (özel bir kontrol yapmanın) yolları olup olmadığı değil . Bu soru için, "ssh bağlantısı" yerine "giriş formu", "kayıt formu", "ödeme formu", "köpek yavrusu-çocuk-değil-sizin-çocuk-değil-formu-gıda-gıda", vb.
- Peki,
SecureString
gerçekte hangi noktada kullanmak pratik hale geliyor? - Bir
System.String
nesnenin kullanımını tamamen ortadan kaldırmak için ekstra geliştirme zamanına değecek mi? - Bütün mesele a'nın yığın üzerindeki
SecureString
süresini azaltmak mıdırSystem.String
(fiziksel bir takas dosyasına geçme riskini azaltmak)? - Bir saldırgan zaten yığın denetimi için araçlara sahipse, büyük olasılıkla (A) tuş vuruşlarını okuma araçlarına sahiptir veya (B) fiziksel olarak makineye sahiptir ... Bu yüzden onu kullanmasını
SecureString
önlemek Yine de veri? - Bu sadece "muğlaklık yoluyla güvenlik" midir?
Eğer soruları çok kalın soruyorsam özür dilerim, merakım daha iyi oldu. Sorularımın herhangi birini veya tümünü yanıtlamaktan çekinmeyin (veya varsayımlarımın tamamen yanlış olduğunu söyle). :)
SecureString
Gerçekten güvenli bir dize olmadığını unutmayın . Bu sadece birisinin belleğinizi inceleyebileceği ve hassas verileri başarıyla alabileceği zaman penceresini azaltmanın bir yoludur. Bu kurşun geçirmez değildir ve olması amaçlanmamıştır. Ancak yükselttiğiniz noktalar çok geçerli. İlgili: stackoverflow.com/questions/14449579/…