2008-11-06 22 views
5

LINQ to XML kullanarak şifrelenmiş XML dosyalarını okumak/yazmak istiyorum. XDocument nesnesinin kullandığı Akışı şifrelemek için .NET Framework'e yerleşik şifreleme algoritmalarını kullanmayı bilen var mı?LINQ to XML kullanarak Şifreli XML dosyasını nasıl okuyabilirim/yazarım?

ben denemek vermedi, ancak okuma/yazma erişimi için CryptoStream ayarlanamaz. Sadece LINQ'ın XML'e bir istisna atmasına neden olan Okuma veya Yazmayı destekler.

Güncelleme: O/okuma "anında" belgeyi yazmak için iyi olurdu, ama ben ancak o zaman tekrar dışarı şifreli geri yazma, şifreli xml dosyası okumak manipüle yükümlüyüm.

+0

Ne yapmak istediğinizi açıklayabilir misiniz? Tüm belgeyi hafızasına okumak, üzerinde çalışmak, sonra tekrar yazmak yeterli midir - yoksa anında okuyabilmeniz/yazabilmeniz gerekiyor mu? – tvanfosson

cevap

8

kolay yaklaşım muhtemelen XDocument.Load olan(), Linq etrafında, daha sonra XDocument.Save(). Hızlı bir deneme uygulamasından (atılamayan kaynaklara kolay gidin): CryptoStream içine

XDocument writeContacts = new XDocument(
    new XElement("contacts", 
     new XElement("contact", 
     new XElement("name", "Patrick Hines"), 
     new XElement("phone", "206-555-0144", 
      new XAttribute("type", "home")), 
     new XElement("phone", "425-555-0145", 
      new XAttribute("type", "work")), 
     new XElement("address", 
      new XElement("street1", "123 Main St"), 
      new XElement("city", "Mercer Island"), 
      new XElement("state", "WA"), 
      new XElement("postal", "68042") 
     ) 
    ) 
    ) 
); 

Rijndael RijndaelAlg = Rijndael.Create(); 

FileStream writeStream = File.Open("data.xml", FileMode.Create); 
CryptoStream cStream = new CryptoStream(writeStream, 
    RijndaelAlg.CreateEncryptor(RijndaelAlg.Key, RijndaelAlg.IV), 
    CryptoStreamMode.Write); 

StreamWriter writer = new StreamWriter(cStream); 

writeContacts.Save(writer); 

writer.Flush(); 
writer.Close(); 

FileStream readStream = File.OpenRead("data.xml"); 

cStream = new CryptoStream(readStream, 
    RijndaelAlg.CreateDecryptor(RijndaelAlg.Key, RijndaelAlg.IV), 
    CryptoStreamMode.Read); 

XmlTextReader reader = new XmlTextReader(cStream); 

XDocument readContacts = XDocument.Load(reader); 

//manipulate with Linq and Save() when needed 

Takas favori ICryptoTransform.

+0

Bunu, şifrelemeyi yapmak için AesManaged sınıfı ile denedim ve hataya okuma/yazma erişimine sahip olmak istediğinden dolayı hata yaptım. Hmm ... Tekrar deneyeceğim. Teşekkürler. –

+0

Anahtarları nasıl saklıyorsunuz? –

+0

@Chris - uygulamaya bağlıdır. Bazen hiç saklamaya gerek yok. Belki zamanında bir kullanıcıdan bir şifre kabul edip [Rfc2898DeriveBytes] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx) kullanarak anahtarı oluşturmak. Diğer durumlarda, şifreyi güvenli bir yapılandırma konumunda saklarsınız. Örneğim sadece şifreleme/şifre çözme sürecinin bir örneğidir. Rijandael tarafından oluşturulan anahtarın, gerçekleşme başına üretildiği için gerçek bir uygulamada kullanmak istemezsiniz. –

0

[güncelleme:! (Aynı sürede) aynı yazdığı Corbin Mart şeref, ancak kodda]

En tek yoludur akışları. ,

  • ((dosyanın vs)
  • (XDocument içine örneğin) veri okumak
  • kodunuzu yapmak yılına ait bir CryptoStream oluşturmak belgeyi okumak, değişiklikleri yapın: Ben Sizin olurdu hayal vs)
  • sandık vb (dosyasına yeni bir CryptoStream yazma) [
  • akımı
için docuemnt tasarruf aynı IV, vb) ile başlayan temel akış nedir bağlı 210

(FileStream, MemoryStream, vs) iyi de tamamen kapatmak/yeniden açık okuma arasında öyle olmak zorunda ve yazmak (yani CryptoStream muhtemelen taban akışının sahipliğini hissedecek ve .Close() olacaktır).

İlgili konular