Защита от изменений легче, чем защита от просмотра.
Если вас беспокоят просто изменения / взломы, вы можете просто вычислить цифровую подпись на элементах XML, составляющих ваши неизменяемые настройки WCF, используя ваш открытый ключ. Если клиент что-то изменит, сигнал не будет совпадать.
Я не знаю хорошего способа защитить его от взгляда, на самом деле, потому что решительный человек сможет узнать, что вы делаете в WCF (как указывал предыдущий автор). Вы можете сделать это более сложным, но это не помешает кому-либо просматривать или изучать информацию.
UPDATE
Вам необходимо использовать свой собственный закрытый ключ RSA для подписи. Возможно, у вас уже есть пара ключей RSA. Если нет, вы можете сгенерировать пару ключей, один раз, чтобы сделать подпись. Вот так.
int keySize = 1024; // you choose
byte[] key = Keys.GenerateKeyPair(keySize);
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportCspBlob(key);
Если у вас есть это, вы можете экспортировать и сохранить его. Для собственного использования, подписывая, вам нужен закрытый ключ. Для проверки приложения будут использовать открытый ключ. Вот как ты их получаешь.
string PublicKeyXml = rsaKey.ToXmlString(false);
string PrivateKeyXml = rsaKey.ToXmlString(true);
Храните их. Если вы когда-нибудь захотите снова что-то подписать, используя тот же закрытый ключ, получите RSA CSP с методом FromXmlString (), передавая PrivateKeyXml. Если вы хотите проверить, используйте FromXmlString (), передавая PublicKeyXml.
Как только у вас есть ключ и XML для подписи, вы можете сделать подпись. Это происходит только во время упаковки и развертывания, когда вы создаете и завершаете конфигурацию.
// Sign an XML file.
// This document cannot be verified unless the verifying
// code has the key with which it was signed.
public static void SignXml(System.Xml.XmlDocument Doc, RSA Key)
{
// Check arguments.
if (Doc == null)
throw new ArgumentException("Doc");
if (Key == null)
throw new ArgumentException("Key");
// Create a SignedXml object.
System.Security.Cryptography.Xml.SignedXml signedXml = new SignedXml(Doc);
// Add the key to the SignedXml document.
signedXml.SigningKey = Key;
// Create a reference to be signed.
Reference reference = new Reference();
reference.Uri = "";
// Add an enveloped transformation to the reference.
var env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Add the reference to the SignedXml object.
signedXml.AddReference(reference);
// Compute the signature.
signedXml.ComputeSignature();
// Get the XML representation of the signature and save
// it to an XmlElement object.
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Append the element to the XML document.
Doc.DocumentElement.AppendChild(Doc.ImportNode(xmlDigitalSignature, true));
}
Затем вставьте подписанный XML в app.config или в виде строки в приложении, или как угодно. Когда приложение запускается, вы проверяете подпись во время выполнения, используя блоб открытого ключа.
// Verify the signature of the signed XML.
RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider();
rsaCsp.FromXmlString(PublicKeyXml);
bool isValid = VerifyXml(xmlDoc, rsaCsp);
Вот код, который выполняет проверку подписи:
// Verify the signature of an XML file against an asymmetric
// algorithm and return the result.
public Boolean VerifyXml(XmlDocument Doc, RSA Key)
{
// Check arguments.
if (Doc == null)
throw new ArgumentException("Doc");
if (Key == null)
throw new ArgumentException("Key");
// Create a new SignedXml object and pass it
// the XML document class.
System.Security.Cryptography.Xml.SignedXml signedXml = new SignedXml(Doc);
// Find the "Signature" node and create a new XmlNodeList object.
XmlNodeList nodeList = Doc.GetElementsByTagName("Signature");
// Throw an exception if no signature was found.
if (nodeList.Count <= 0)
{
throw new CryptographicException("Verification failed: No Signature was found in the document.");
}
// Though it is possible to have multiple signatures on
// an XML document, this app only supports one signature for
// the entire XML document. Throw an exception
// if more than one signature was found.
if (nodeList.Count >= 2)
{
throw new CryptographicException("Verification failed: More that one signature was found for the document.");
}
// Load the first <signature> node.
signedXml.LoadXml((XmlElement)nodeList[0]);
// Check the signature and return the result.
return signedXml.CheckSignature(Key);
}
Чтобы проверить, что ваша подпись и проверка действительно работают, измените подпись или содержимое XML, которое было подписано. Вы должны увидеть, что проверка не удалась. В случае неудачной проверки ваше приложение может выдать или закрыть, или что-то еще.