Hola a todos,
hay otro metodo aunque tendría que repasar el tema para hacer una key de aplicación bastante segura.
consiste en lo siguiente,
creas una llave publica y en vez de ser esa la que das , la conservas seguramente, y utilizas la llave privada junto con datos del registro o del ordenador donde se ha instalado para tener que se utilize la llave privada como key de aplicación,
Es decir consistiría en lo que se llama criptografía asimetrica (donde es la clave publica la que se comparte) , pero en el caso que yo he esplicado sería criptografía asimetrica inversa, no he encontrado ninguna pagina que hable sobre ello,
vamos, en resumen el problema de utilizar una criptografía asimetrica tradicional estaría sobre todo en que si envias la llave publica esta solo sirve para descifrar sin embargo si implementas la clave privada dentro de tu aplicación podrías utilizarla para cifrar los datos del registro (nombre, usuario, email, y algunos datos que identifican unicamente al ordenador donde lo ha instalado) y enviarla al creador de la aplicación para que compruebe que coinciden el el registro inicial y que el equipo sea unico.
La llave pública es el candado y su pareja es la llave de metal (llave privada) que lo abre. Por supuesto, esta pareja debe ser fabricada una para la otra.
digamos que el candado lo guardo y solo distribuyo copias de la llave de metal,
http://www.alcancelibre.org/article.php/20070620210641855
la llave privada puede descifrar (como la llave publica) y cifrar ¿que cifrafía? pues los datos que he dicho antes, sin que sea visible para el usuario coge unos parametros del sistema además de su email, por ejemplo, su nombre dirección, ...etc y lo cifra y me lo envia a mi, el que he hecho la aplicación, y yo lo puedo descifrar con mi llave publica y confirmar que los datos que me ha mandado corresponden a los datos que tengo yo cuando se registró, si no coinciden o hay dos equipos utilizando estos datos pues entonces habría que darle avertencia de que está utilizando el software ilegalmente...etc.
lo importante es que el cliente pueda cifrar esos datos con la copia de la llave privada , cosa que no podría hacer si lo que distribuyo es la clave publica.
la forma de identificar al equipo como unico puede ser del siguiente modo:
Con la creación de un identificador unico global GUID de un ordenador http://www.subgurim.net/Articu los/csharp/97/guid-identificad or-global-unico.aspx
también con SID: http://technet.microsoft.com/e s-es/library/cc780850(WS.10).a spx
si no estoy equivocado, por ejemplo, los archivos de windows disponen de un identificador unico para todos los archivos de un equipo
acabo de encontrar sobre ese tema este enlace http://forums.techarena.in/windows-server-help/10000.htm
de tal forma que cuando se instala la aplicacion si se obtiene ese SID se puede identificar de forma unica al equipo, esto para windows, en linux no se si será exactamente igual,
si se regenera el SID de los archivos sería como si instalas de nuevo el sistema operativo
con lo cual este ultimo metodo llevaría a tener que volver a registrar la aplicación con los mismos datos pero con distinto SID para los archivos, con lo cual el Creador de la aplicación tendría que llevar un registro de datos_registro + SID_de_sistema (que solo podría ser una combinación unica).
espero que me deis vuestra opinion sobre esta idea,
gracias
perdonar que no me esplique extensamente es que hace tiempo tuve esa idea pero no he repasado el tema como
tengo algo que escribí hace tiempo:
generar clave publica y clave privada en windows ej.
en el programa :
clave publica para desemcriptar los datos enviados con clave privada,
datos enviados con clave privada:
¿como crear un certificado con la llave privada ¿o publica? en dicho ordenador?
enviar el certificado cifrado con la llave privada proporcionada como licencia.
y un codigo en c#:
validar através de internet el certificado (comunicación servidor de software y software instalado)
http://www.accv.es/
http://www.programandoamedianoche.com/2009/08/utilizar-certificados-digitales-desde-net/
http://en.juantxu.net/doku.php/ssl PARA HACER EL CERTIFICADO A PARTIR DE CLAVES
http://thinkingindotnet.wordpress.com/2007/04/06/trucos-habilitar-ssl-en-iis-70-usando-certificados-firmados-por-nosotros/
PARA CREAR LA CLAVE PUBLICA Y LA CLAVE PRIVADA EN C#
COLOCAR EN EL PROGRAM.CS
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace CrearClavesPublicasPrivadas
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label1;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Código generado por el Diseñador de Windows Forms
///
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.button1.Location = new System.Drawing.Point(8, 8);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(104, 48);
this.button1.TabIndex = 0;
this.button1.Text = "Generar claves";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.textBox1.Location = new System.Drawing.Point(120, 40);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(144, 26);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
//
// label1
//
this.label1.Location = new System.Drawing.Point(120, 8);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(152, 24);
this.label1.TabIndex = 2;
this.label1.Text = "Nombre clave";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(280, 94);
this.Controls.Add(this.label1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
if (textBox1.Text != "")
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
string PCB = RSA.ToXmlString(true);
string CPubB = RSA.ToXmlString(false);
string nombre = textBox1.Text;
nombre += "PCB.xml";
StreamWriter PCAwriter = new StreamWriter(nombre);
PCAwriter.Write(PCB);
PCAwriter.Close();
string nombre2 = textBox1.Text;
nombre2 += "CPubB.xml";
StreamWriter CPubAwriter = new StreamWriter(nombre2);
CPubAwriter.Write(CPubB);
CPubAwriter.Close();
MessageBox.Show("LAS CLAVES FUERON CREADAS CON EXITO", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
else
{
MessageBox.Show("DEBE LLENAR EL CAMPO NOMBRE CLAVE.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
espero que os resulte interesante