sarebbe più fresco se si è utilizzato una chiave privata per firmare l'elemento <lic> e aggiunto il risultato al file (in un <hash> elemento forse). Ciò consentirebbe a tutti di leggere il file xml nel caso in cui il supporto debba conoscere il numero di licenza o la data di scadenza, ma non possono modificare alcun valore senza la chiave privata.
La chiave pubblica necessaria per verificare la firma sarebbe di dominio pubblico.
Chiarimento
firma il codice servirà solo a proteggerlo contro i cambiamenti, non mancherà di tenere tutte le informazioni in esso nascoste. La tua domanda originale menziona la crittografia, ma non sono sicuro che sia un requisito per nascondere i dati, o semplicemente proteggerli dalle modifiche.
Codice di esempio: (Non pubblicare mai PrivateKey.key. ServerMethods sono necessari solo quando si firma il file xml, ClientMethods sono necessari solo durante la verifica del file xml.)
using System;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
public static class Program {
public static void Main() {
if (!File.Exists("PublicKey.key")) {
// Assume first run, generate keys and sign document.
ServerMethods.GenerateKeyPair();
var input = new XmlDocument();
input.Load("input.xml");
Debug.Assert(input.DocumentElement != null);
var licNode = input.DocumentElement["lic"];
Debug.Assert(licNode != null);
var licNodeXml = licNode.OuterXml;
var signedNode = input.CreateElement("signature");
signedNode.InnerText = ServerMethods.CalculateSignature(licNodeXml);
input.DocumentElement.AppendChild(signedNode);
input.Save("output.xml");
}
if (ClientMethods.IsValidLicense("output.xml")) {
Console.WriteLine("VALID");
} else {
Console.WriteLine("INVALID");
}
}
public static class ServerMethods {
public static void GenerateKeyPair() {
var rsa = SharedInformation.CryptoProvider;
using (var keyWriter = File.CreateText("PublicKey.key"))
keyWriter.Write(rsa.ToXmlString(false));
using (var keyWriter = File.CreateText("PrivateKey.key"))
keyWriter.Write(rsa.ToXmlString(true));
}
public static string CalculateSignature(string data) {
var rsa = SharedInformation.CryptoProvider;
rsa.FromXmlString(File.ReadAllText("PrivateKey.key"));
var dataBytes = Encoding.UTF8.GetBytes(data);
var signatureBytes = rsa.SignData(dataBytes, SharedInformation.HashAlgorithm);
return Convert.ToBase64String(signatureBytes);
}
}
public static class ClientMethods {
public static bool IsValid(string data, string signature) {
var rsa = SharedInformation.CryptoProvider;
rsa.FromXmlString(File.ReadAllText("PublicKey.key"));
var dataBytes = Encoding.UTF8.GetBytes(data);
var signatureBytes = Convert.FromBase64String(signature);
return rsa.VerifyData(dataBytes, SharedInformation.HashAlgorithm, signatureBytes);
}
public static bool IsValidLicense(string filename) {
var doc = new XmlDocument();
doc.Load(filename);
var licNode = doc.SelectSingleNode("/root/lic") as XmlElement;
var signatureNode = doc.SelectSingleNode("/root/signature") as XmlElement;
if (licNode == null || signatureNode == null) return false;
return IsValid(licNode.OuterXml, signatureNode.InnerText);
}
}
public static class SharedInformation {
public static int KeySize {
get { return 1024; }
}
public static string HashAlgorithm {
get { return "SHA512"; }
}
public static RSACryptoServiceProvider CryptoProvider {
get { return new RSACryptoServiceProvider(KeySize, new CspParameters()); }
}
}
}
Si prega di inviare un breve esempio di codice, e che cosa esattamente non funziona (ad esempio 'On line 12 ottengo un errore compilor 12345', o 'durante runtime Ottengo un SecurityException sulla riga 15 '). – Treb
dati errati contenuti nella classe di codifica ah bene – abmv
È necessario crittografare i dati per nasconderlo o semplicemente proteggere i dati dalle modifiche? – sisve