kühler sein würde, wenn Sie einen privaten Schlüssel verwendet, um das <lic> Element zu unterzeichnen und hinzugefügt, um das Ergebnis in die Datei (in einem <Hash> Elemente vielleicht). Dies würde es jedem ermöglichen, die XML-Datei zu lesen, falls Ihr Support die Lizenznummer oder das Verfallsdatum kennen muss, aber sie können keine Werte ohne den privaten Schlüssel ändern.
Der öffentliche Schlüssel, der zur Überprüfung der Signatur benötigt wird, wäre allgemein bekannt.
Klärung
Signieren von Code wird nur gegen Änderungen schützen, wird es keine Informationen halten sie versteckt. Ihre ursprüngliche Frage erwähnt Verschlüsselung, aber ich bin mir nicht sicher, ob es eine Voraussetzung ist, die Daten zu verstecken oder nur vor Änderungen zu schützen.
Beispielcode: (PrivateKey.key niemals veröffentlichen. ServerMethods werden nur benötigt, wenn die XML-Datei signiert wird, ClientMethods werden nur benötigt, wenn die XML-Datei überprüft wird.
)
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()); }
}
}
}
Bitte senden Sie ein kurzes Beispiel des Codes überprüfen, und was genau nicht funktioniert (zB ‚On line 12 I einen compilor Fehler 12345 erhalten‘ oder ‚während Laufzeit bekomme ich eine SecurityException in Zeile 15 '). – Treb
schlechte daten durch enception klasse ah gut – abmv
Müssen Sie die Daten verschlüsseln, um sie zu verbergen, oder nur die Daten vor Änderungen schützen? – sisve