Lizenz verwalten

Lizenz hinzufügen

Lizenzen werden im Bereich Kundenverwaltung im Unterabschnitt Lizenzen verwaltet. Neue Lizenzen kann man über die rechte Maustaste (Popupmenü) umbenennen, löschen oder hinzufügen.

Ändern der Lizenzdaten

Klickt man in der Lizenzliste eine Lizenz an so erscheinen im unteren Teil des Fensters die Details. Code1 (E-Mail des Kunden), Code2 (Lizenzname des Produktes), Von und Bis dienen als Eingangsdaten zur Lizenzgenerierung. Key1-3 werden vom Lizenzgenerator erzeugt (der mitgelieferte Generator erzeugt nur Key1). Verwendung des mitgelieferten Generators:

  1. Aus dem Code1 und Code2 wird ein Key1 generiert, welcher dem Kunden als Lizenzcode zusammen mit Code1 geliefert wird.

  2. Mit dem Key1 und dem Code1 kann der Code2 zur Lizenzüberprüfung wieder restauriert werden. D.h. der Kunde gibt zur Lizenzvalidierung den Code1 und den Key1 ein.

Man kann natürlich auch einen eigenen Lizenzgenerator benutzen wenn man diesen in der Skriptdatei LicenseGen.xml einfügt. Hier der Code zur Einbindung in eigene Programme:

using System; 
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace <YOURNAMESPACE>
{
    /// 
    /// Usage to create a key:
    /// * Create a passphrase (string phrase="myproduct_mymail@mymail.com";)
    /// * Create a internal key using the passphrase (GenerateKey(phrase))
    /// * Create a productstring
    ///            product=namevalue;version=versionvalue;expires=datevalue
    ///            namevalue==name of product (must not contain any ';' or '='
    ///            versionvalue==version value (e.g. "1.1")
    ///            datevalue==datetime to expire
    /// * Create the Licensekey using Encrypt (Encrypt(productstring))
    /// The passphrase must contain something related to product AND owner (e.g. productname + email)
    /// The Productkey identifies the product, version and expireationdate
    /// 
    /// Usage to check if a key is valid
    /// * Create a passphrase (phrase)
    /// * Create a internal key using the passphrase (GenerateKey(phrase))
    /// * Descrypt the key (given by user) productstring=Decrypt(key)
    /// * productstring is a string of format see above
    /// * use GetProduct(productstring), GetVersion(productstring) and GetExpires(productstring) 
    ///   to check if key is valid
	/// 
	public class License
	{
		private byte[]_key;
		private byte[]_iv;

		/// 
		/// Checks if the license string is valid
		/// 
		/// 
		/// Name of the Product (lizenzname)
		/// Version of the product
		/// true if license is valid
		public bool IsValid(string licenseText,string product,string version)
		{
			string []typevals; // all type value pairs
			string []values;   // splitted type and value
			bool lic=false;

			try
			{
				typevals=licenseText.Split(";".ToCharArray(),10);                 
				foreach(string typeval in typevals)
				{
					values=typeval.Split("=".ToCharArray(),2);                       
					if(values[0]=="prod")                                            
					{
						if(values[1]==product)
							lic=true;
						else
						{
							lic=false;
							break;
						}
					}
					if(values[0]=="ver")                                             
					{
						if(values[1]==version)
							lic=true;
						else
						{
							lic=false;
							break;
						}
					}
					if(values[0]=="exp")                                             
					{
					}
				}
			}
			catch(Exception)
			{
				return false;
			}
			return lic;
		}

		/// 
		/// Extracts the version from a license string
		/// 
		/// 
		/// 
		public string GetVersion(string license)
		{
			string []typevals; // all type value pairs
			string []values;   // slitted type and value
			string version="";                                                 

			try
			{
				typevals=license.Split(";".ToCharArray(),10);                     
				foreach(string typeval in typevals)
				{
					values=typeval.Split("=".ToCharArray(),2);                       
					if(values[0]=="ver")                                             
					{
						version=values[1];
					}
				}
			}
			catch(Exception )
			{
				return "";                                                        
			}
			return version;
		}

		/// 
		/// Extracts the expires string from a license text
		/// 
		/// License string
		/// Expireationdate
		public string GetExpires(string license)
		{
			string []typevals; // all type value pairs
			string []values;   // slitted type and value
			string expires="";                                                 

			try
			{
				typevals=license.Split(";".ToCharArray(),10);                     
				foreach(string typeval in typevals)
				{
					values=typeval.Split("=".ToCharArray(),2);                       
					if(values[0]=="exp")                                             
					{
						expires=values[1];
					}
				}
			}
			catch(Exception )
			{
				return "";                                                        
			}
			return expires;
		}

		/// 
		/// Extracts the product name from a licence string
		/// 
		/// 
		/// 
		public string GetProduct(string license)
		{
			string []typevals; // all type value pairs
			string []values;   // slitted type and value
			string product="";                                                 

			try
			{
				typevals=license.Split(";".ToCharArray(),10);                     
				foreach(string typeval in typevals)
				{
					values=typeval.Split("=".ToCharArray(),2);                       
					if(values[0]=="prod")                                            
					{
						product=values[1];
					}
				}
			}
			catch(Exception )
			{
				return "";                                                        
			}
			return product;
		}

		/// 
                     /// Generates a key from a passphrase using SHA384
		/// 
		/// Passphrase for key generation input
		public void GenerateKey(string passPhrase)
		{
			// may want to change how you create your key and IV?
			// They are the most important part to the secuity of your licenses.
			_key = new Byte[24];
			_iv = new Byte[16];

			byte[] bytePhrase = Encoding.ASCII.GetBytes(passPhrase);
			SHA384Managed sha384 = new SHA384Managed();
			sha384.ComputeHash(bytePhrase);
			byte[] result = sha384.Hash;

			for( int loop=0; loop<24; loop++ ) _key[loop] = result[loop];
			for( int loop=24; loop<40; loop++ ) _iv[loop-24] = result[loop];
		}

		/// 
		/// Encrypt the given value with the Rijndael algorithm.
		/// 
		/// Value to encrypt
		/// Encrypted value. 
		public string Encrypt(string encryptValue)
		{
			CryptoStream encryptStream = null;       // Stream used to encrypt
			RijndaelManaged rijndael = null;         // Rijndael provider
			ICryptoTransform rijndaelEncrypt = null; // Encrypting object
			MemoryStream memStream = new MemoryStream(); // Stream to contain data
			try
			{
				if( encryptValue.Length > 0 )
				{
					// Create the crypto objects
					rijndael = new RijndaelManaged();
					rijndael.Key = _key;
					rijndael.IV = _iv;
					rijndaelEncrypt = rijndael.CreateEncryptor();
					encryptStream = new CryptoStream(
						memStream, rijndaelEncrypt, CryptoStreamMode.Write);

					// Write the encrypted value into memory
					byte[] input = new UnicodeEncoding().GetBytes(encryptValue);
					encryptStream.Write(input, 0, input.Length);
					encryptStream.FlushFinalBlock();

					// Retrieve the encrypted value and return it
					return( Convert.ToBase64String(memStream.ToArray()) );
				}
				else
				{
					return "";                                                       
				}
			}
			catch (Exception ex)
			{
				throw new ApplicationException(ml.ml_string(6, "Konnte Lizenz nicht verschlüsseln"), ex);
			}
			finally
			{
				if( rijndael != null ) rijndael.Clear();
				if( rijndaelEncrypt != null ) rijndaelEncrypt.Dispose();
				if( memStream != null ) memStream.Close();
			}
		}

		/// 
		/// 
		/// 
		/// 
		/// 
		public string Decrypt(string decryptValue)
		{
			CryptoStream decryptStream = null;       // Stream used to decrypt
			RijndaelManaged rijndael = null;         // Rijndael provider
			ICryptoTransform rijndaelDecrypt = null; // Decrypting object
			MemoryStream memStream = new MemoryStream(); // Stream to contain data
			MemoryStream memCypherStream = null;
			try
			{
				if( decryptValue.Length > 0 )
				{
					// Create the crypto objects
					rijndael = new RijndaelManaged();
					rijndael.Key = _key;
					rijndael.IV = _iv;
					rijndaelDecrypt = rijndael.CreateDecryptor();

					memCypherStream = new MemoryStream(Convert.FromBase64String(decryptValue));
					decryptStream = new CryptoStream(memCypherStream,rijndaelDecrypt, CryptoStreamMode.Read);

					do
					{
						Byte[] buf = new byte[100];
						int actualBytesRead = decryptStream.Read(buf,0,100);
						if (0 == actualBytesRead){break;}
						memStream.Write(buf,0,actualBytesRead);
					}while(true);

					return new UnicodeEncoding().GetString(memStream.ToArray());
				}
				else
				{
					return "";                                                       
				}
			}
			catch (Exception ex)
			{
				System.Diagnostics.Debug.WriteLine("License.Decrypt",ex.Message);
				string error=ml.ml_string(7, "Konnte Lizenz nicht entschlüsseln");
				throw new ApplicationException(error);
			}
			finally
			{
				if( rijndael != null ) rijndael.Clear();
				if( rijndaelDecrypt != null ) rijndaelDecrypt.Dispose();
				if( memStream != null ) memStream.Close();
				if( memCypherStream != null) memCypherStream.Close();
			}
		}
	}
}

Letzte Änderung: 14.10.06
Info / Webmaster