2011-09-08 37 views
1

我已经从xsd模式(使用xsd.exe)自动生成一个类(vb.net)。我用数据填充对象属性并将对象序列化为xml并将xml存储在字符串中。在我的XML中,我必须加密一些元素。做这个的最好方式是什么?如何加密xml元素?

在将对象序列化到xml之前,我可以加密我的对象属性吗?在我的xsd模式的文档中,它表示所有加密的值(元素)都必须是字符串,但是当我从xsd schem中自​​动生成类时,出生号被设置为日期而不是字符串...?出生号码是我必须加密的元素的一部分。 我想用PKI来加密我想用来加密xml元素的对称密钥。

有人可以帮助我吗? 谢谢!

回答

1

一个简单的解决方案可能是公开每个属性的两个版本,加密和未加密,并用[XmlIgnore]标记所有未加密的版本。

如果您无法编辑自动生成的类,并且希望对这些属性进行加密,则可以在部分类中添加未加密的包装属性,例如,

==在自动生成的文件:

class MyClass { 
    String SensitiveProperty { get; set; } 
} 

==在未自动生成的部分文件:

partial class MyClass { 
    [XmlIgnore] 
    String SensitivePropertyDecrypted { 
    get { 
     return CryptoHelper.Decrypt(SensitiveProperty); 
    } 
    set { 
     SensitiveProperty = CryptoHelper.Encrypt(value); 
    } 
    } 
} 

...其中 “CryptoHelper” 是一个类你已经写成支持您希望实现的加密方案(即使用您使用PKI传递的对称密钥)。

+0

谢谢!但是我怎样才能使用XmlIgnore(我不能直接在自动生成的类中做任何更改,因为这个类必须定期更新)?我有一个class.partial.vb扩展了自动生成的类,我可以在这个类中做一些改变吗? – Liss

+0

我已经更新了我的答案,以考虑到自动生成的类 – Rich

+0

谢谢!你能解释一下多一点吗?是不是应该标记为XmlIgnore的SensitivProperty?并且此属性位于自动生成的类中...是否必须在部分文件中为SensitiveProperty和SensitivePropertyDecrypt创建新属性,并使用XmlIgnore标记敏感属性? 然后当我序列化我的类对象时,只有部分文件中没有XmlIgnore的属性才会被序列化?自动生成的类中的属性怎么样? – Liss