2008-09-30 25 views
15

Uygulama çalışmaları arasında şifrelenmiş verileri (birkaç küçük dizeler) saklamanız gerekir. Kullanıcının uygulamayı başlattığı her seferinde bir şifre vermesini istemiyorum. Yani her şeyden önce, şifreleme anahtar (lar) ını güvenli bir şekilde depolamaya gider.Şifreli verilerin sürekli olarak saklanması .Net

RSACryptoServiceProvider'ı ve PersistentKeyInCsp'yi kullanarak bakıyordum, ancak nasıl çalıştığından emin değilim. Uygulama konteynırları veya makine yeniden başlatmaları arasında anahtar konteyner kalıcı mı? Evet ise, kullanıcıya özgü veya makineye özgüdür. Yani Şifrelenmiş verilerimi kullanıcının dolaşım profilinde saklarsam, kullanıcı farklı bir makinede oturum açtığında verilerin şifresini çözebilir miyim?

Yukarıdakiler işe yaramazsa, seçeneklerim (dolaşım profilleriyle uğraşmam gerekiyor).

cevap

35

Veri Koruma API'si (DPAPI) tam olarak istediğiniz şeyi yapar. Şifreleme anahtarı olarak makinenin kimlik bilgilerini veya (daha iyi) kullanıcıyı kullanarak keyfi verilerin simetrik şifrelemesini sağlar. Anahtarları yönetmek için endişelenmenize gerek yok; Windows sizin için bununla ilgilenir. Kullanıcı şifresini değiştirirse, Windows kullanıcının yeni şifresini kullanarak verileri yeniden şifreleyecektir.

DPAPı'nın System.Security.Cryptography.ProtectedData sınıfı ile .NET olduğu ortaya çıktı:

byte[] plaintextBytes = GetDataToProtect(); 
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser); 

Koruma yönteminin ikinci parametre ek bir uygulama olarak kullanılabilir, isteğe bağlı bir entropi bayt dizidir -Özel "gizli". , DPAPı'nın (here açıklandığı şekilde) bir yerde şifrelenmiş veri depolamak gerekir gerçi Gezici profilleri ile düzgün çalışır

byte[] encodedBytes = GetDataToUnprotect(); 
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser); 

(ağ paylaşımı:

, şifresini ProtectedData.Unprotect aramayı kullanmak için Çeşitli makinelerin erişebileceği IsolatedStorageScope.Roaming vb. Ile IsolatedStorage.

Daha fazla bilgi için MSDN'deki ProtectedData sınıfına bakın. İstediğinizden daha fazla bilgi içeren bir DPAPI beyaz kağıdı here var.

+0

Sadece kuşaklar için, bunu bir yere daha "genel" (en azından örneğin intranetinizdeki) bu yüzden den binebilirsek devam eden işlemek üzere diğer koduna bakmak gerekecek diğer makineler. Normalde, makineye ve kullanıcıya özgü bir konum almak için Environment.SpecialFolder.ApplicationData'yı kullanabilirsiniz. –

+0

Cevabınız için teşekkürler, bu işe yaramalı. Bunun 1.1'de nasıl yapılabileceği hakkında bir fikriniz var mı? ProtectedData .Net 2.0 için yeni –

+1

.NET 1.1'de DPAPI kullanmak için P/Invoke kullanmanız gerekir.Oldukça eksiksiz bir çalışma için buraya bakın: http://msdn.microsoft.com/en-us/library/aa302402.aspx –

0

DPAPI yaklaşımına eklemek istiyorum.

Kullanıcı mağazası yaklaşımını kendim uygulamadığım halde, belirli bir kullanıcı için verileri şifreleyen ve şifreleyen bir kullanıcı deposu yaklaşımı için Microsoft belgeleri vardır.

DPAPI'yi makine deposunu kullanarak kullandım. Yapmak istediklerinize uyması durumunda onu anlatacağım. Windows kullanıcı profilini yüklemek için bir Windows servisi kullandım ve verileri şifrelemek için kullanıcının şifresi kullanıldı.

Bir yan not olarak, DPAPI, biraz daha zayıf (AES) olabilir Üçlü DES kullanır, ancak sonra ne tür bir koruma aradığınızdan emin değilim.

, Windows Veri Koruma http://msdn.microsoft.com/en-us/library/ms995355.aspx

İlgili konular