SORU
4 EKİM 2014, CUMARTESİ


Bir C hiç pratik SecureString# uygulama?

Benim varsayım yanlış İşte, ama bana neden sorduğumu açıklayayım eğer beni düzeltmek için çekinmeyin.

SecureString msdn'den alınan:

Temsil ettiği gizli tutulması gereken bir metin. Metin kullanıldığında gizlilik için şifrelenir, ve artık gerekli olduğunda bilgisayarın hafızasından silinmiş.

Ben bu anlamı saklamak için bir şifre ya da diğer özel bilgileri bir SecureString System.String, çünkü kontrol edebilirsiniz nasıl ve ne zaman aslında saklanan hafıza, çünkü bir System.String:

hem değişmez ve artık gerekli, olamaz programlı olarak planlanan çöp toplama; örnek salt okunur sonra oluşturulur ve bu mümkün değil tahmin örneği silinecek bilgisayar belleği. Sonuç olarak, eğer bir String nesnesi içeren hassas bilgileri gibi şifre, kredi kartı numarası ya da kişisel veriler, bir risk bilgileri olabilir ortaya sonra kullanılır çünkü uygulama silinemiyor verileri bilgisayar belleği.

Ancak, bir GUI uygulaması (örneğin, bir ssh istemci), SecureString durumundabir den inşa edilecekSystem.String. Metnin tümünü kontrol edertemel veri türü bir dize kullanın.

Yani, bu demek oluyor ki her zaman kullanıcı presler bir anahtar, eski dize vardı, atılır ve yeni bir dize inşa etmek için neyi temsil değeri içindeki metin kutusu bile kullanarak bir parola maske.Ve ne zaman ya da eğer bu değerler herhangi bir bellekten atılır eğer kontrol edemeyiz.

Şimdi sunucuya oturum açmak için zamanı geldi. Bil bakalım ne oldu?Kimlik doğrulaması için bağlantı üzerinde bir dizi geçmesi gerekir. Hadi System.String ...Bir de bizim SecureString bu yüzden dönüştürmek. şimdi çöp toplama (veya tampon için 0 yazma) geçmesi için zorlama yolu ile yığın üzerinde bir dize var.

Benim noktasıdır: ne yaparsan yap, bir yere hat boyunca, o SecureStringgidiyor* *9, bir anlamı dönüştürülmesi için en az bir noktada (çöp toplama herhangi bir garantisi olmadan) öbek var.

Benim demek istediğim bu değil: ister ssh bağlantısı için bir dize göndermek, ya da kontrol deposuna sahip engellemeyi bir dize engellemeyi yolları (özel bir kontrol edin) vardır. Bu soru, sen-ebilmek yerine "ssh bağlantısı" ile "giriş formu", "kayıt formu", "ödeme formu", "gıdalar---besleme--köpek-ama-değil- - -çocuk formu", vb.

  • Yani, kullanarak ne yaptığını bir SecureString aslında olmak pratik?
  • Tamamen ortadan kaldırmak için ekstra geliştirme zamanı bu kadar değerli olamaz mı System.String bir nesne.
  • SecureString bütün mesele sadece System.String yığın (bedeni takas dosyası için taşınması riskini azaltır) bir süreyi azaltmak için mi?
  • Eğer bir saldırgan zaten bir yığın muayene için anlamı varsa, o zaman onlar büyük olasılıkla da (A) zaten tuş vuruşlarını, ya da (B) zaten okumak anlamına gelirfiziksel makine var... SecureString kullanarak veri genede engel olur?
  • Bu sadece "bilinmezlik yoluyla güvenlik"?

Eğer çok kalın sorular verirsem özür dilerim, merak beni daha iyi var. Sorularıma herhangi bir cevap için ücretsiz (ya da benim varsayımlar tamamen yanlış olduğunu söyle. :)

CEVAP
5 EKİM 2014, Pazar


Aslında SecureString çok pratik kullanımı var.

(Cevap: çok!) bu tür senaryoları: gördüm biliyor musunuz

  • Bir şifre bir günlük dosyasına yanlışlıkla görünür.
  • Bir şifre bir yere gösterilir - bir GUI işlerin bu uygulama bir komut satırı göstermek oldu, ve komut satırı şifre oluşuyordu.Oops.
  • Bellek kullanarak arkadaşınız ile yazılım profil profiler. Meslektaşım bellek şifrenizi görür. Sesler gerçek mi? Hiç de değil.
  • Bir keresinde "ben" istisnalar durumunda, şaşırtıcı bir şekilde yerel değişkenler yararlı. değer elde edebilecek RedGate kullanılan yazılım "String şifreleri" yanlışlıkla. günlük olduğunu tahmin edebiliyorum ama
  • String parola içeren bir kilitlenme bilgi dökümü.

Tüm bu sorunları önlemek için nasıl biliyor musunuz? SecureString. Genellikle gibi aptalca hatalar yapmazlar emin olur. Nasıl görmezden geliyor? Şifre yönetilmeyen şifreli olduğundan emin yaparak hafıza ve gerçek değer 'ı ne yaptığını emin olduğunuzda sadece erişilebilir.

, SecureString anlamda işleri çok kolay:

1) Her şey şifrelenir

2) Kullanıcı aramaları AppendChar

3) YÖNETİLMEYEN bellekte her şeyin Şifresini çözmek ve karakter ekleyin

4) yine YÖNETİLMEYEN BELLEK Şifrelemek her şeyi.

Eğer kullanıcı bilgisayarınıza erişimi varsa? Bir virüs SecureStrings tüm erişim mümkün olacak? Evet. Tüm yapmanız gereken kendinizi bellek çözülür RtlEncryptMemory içine, şifresiz bellek yeri adresi al ve oku kanca. Voila! Aslında, sürekli SecureString kullanımı için tarama ve tüm faaliyetlerini günlük bir virüs yapabilir. Kolay olacak demiyorum, ama bu yapılabilir. "SecureString bir kullanıcı var sonra tamamen gitti" sisteminizde virüs/. güçlülüğü gördüğünüz gibi

Sonrası birkaç puan var. Eğer UI bazı kullanırsanız emin,"", fiili kullanma SecureString bu kullanışlıdır. içten dize parola tutun denetimleri Ama, yine de, aptallık yukarıda listeledim bazı karşı koruyabilir.

Diğerleri belirttiği gibi, ayrıca, WPF dahili SecureString kullanan PasswordBox destekler.

Sonuç; eğer hassas verileri(şifreler, kredi kartları,..) varsa, SecureString kullanın. Bu ne C# Çerçeve şudur. Örneğin, 27* *sınıf mağazalar SecureString şifre. Eğer 43**, bakarsanız ~80'den fazla farklı kullanımları görebilirsiniz .SecureString NET çerçeve.

Bazı API beklediği için string SecureString dönüştürmek istediğiniz zaman birçok durum vardır.

Her zamanki sorun, ya da:

  1. Apı GENEL. Hassas bir veri olduğunu bilmez.
  2. Apı hassas verileri ile ilgili olduğunu bilir ve " - bu sadece kötü bir tasarım." dizesini kullanır

Olur SecureString string dönüştürülür ne zaman? seni yetiştiren iyi bir nokta: Bu sadece ilk nokta yüzünden olabilir. Örneğin API hassas veri olduğunu bilmez. Şahsen bu olay daha var. SecureString dışarı dize almak bu kadar basit değildir.

Basit bir nedenle basit değileğer belirtildiği gibi ; asla kullanıcı dize SecureString dönüştürmek izin istendi: GC devreye girer. Eğer varsa bunu yaparken kendinizi görürseniz, geri adım ve kendine sor: Neden böyle bir şey yapıyorum, ya da gerçekten buna neden ihtiyaç duyar?

Ben gördüm, çok ilginç bir dava var. Yani, WinApi fonksiyonu Bilgisi SecureStringToGlobalAllocUnicode araman gerekiyor demek ki bir şifre olarak LPTSTR alır. Bu temelde yönetilmeyen bellekte yaşayan şifrelenmemiş parola verir. İşte işte bitti en kısa sürede almak gerekir.

Her zaman uzatmak SecureString sınıfta bir uzantı yöntemi gibi ToEncryptedString(__SERVER__PUBLIC_KEY) verir sana string örnek SecureString o şifreli kullanarak sunucunun ortak anahtarını. Sadece server sonra bunu çözebilir. GC görmek asla sorun çözüldü, "orijinal asla ifşa olarak" dize, hafıza başardı. BuPSRemotingCryptoHelper (EncryptSecureStringCore(SecureString secureString))yapılıyor tam olarak.

Ve hemen hemen bir şey ile ilgili: çokMono SecureString hiç şifrelemek değil. Bu uygulama ..bunun için benim son noktaya getiriyor.. "It somehow causes nunit test breakage", bekle çünkü diye oldu:

SecureString her yerde desteklenmiyor. Eğer platform/mimarlık SecureString, destekliyor mu yoksa özel durum alırsınız. Belgelerinde desteklenen platformlar bir liste var.

Uzun StackOverflow benim yazı ve SecureString tekrar ettim nasıl sayabilir herkes alacak 1 :-).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MotoManTV

    MotoManTV

    10 Aralık 2009
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • sghaff1

    sghaff1

    23 Mart 2009