ASP.NET写的网站,如何对产品进行授权,不让客户随意安装到其它服务器 ASP.NET写的网站,如何对产品进行加密授权,不让客户随意安装到其它服务器也就是某个授权情况下,仅能安装1台服务器或者仅有一个企业的应用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.techrss.cn/html/2008/12-13/191328.htm 看了“看了下面那篇“Crack别人应用程序”的文章有感,简述.Net下的应用程序授权。”,自己实际操作了把得出的心得 。这里原理啊背景啊什么都不介绍了,笑望人生已经在他的BLOG上都写的相当清楚了,有什么不细节不明白的可以去看原文。推荐先大概看下原文,现看我下面的步骤,然后再回头去研究原文的细节。由于我自己写的实例是用在公司一项目中,源代码就不方便放出来了,嘿嘿。 第一步:生成一组公钥和私钥,公钥用于你发布程序,私钥属于注册码生成。view plaincopy to clipboardprint?using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { // 公钥 string pubkey = rsa.ToXmlString(false); // 私钥 string prikey = rsa.ToXmlString(true); //如果是webForm就Response.Write(pubkey + ”<br/>” + prikey); 下 //如果是winForm就MessageBox.Show("公钥:" + pubkey + "\r\n私钥:" + prikey); 下 } using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { // 公钥 string pubkey = rsa.ToXmlString(false); // 私钥 string prikey = rsa.ToXmlString(true); //如果是webForm就Response.Write(pubkey + ”<br/>” + prikey); 下//如果是winForm就MessageBox.Show("公钥:" + pubkey + "\r\n私钥:" + prikey); 下} 第二步:取得机器硬件编码。我选用CUP的编号。view plaincopy to clipboardprint?/// <summary> /// 获取CPU编号 /// </summary> /// <returns></returns> public string GetCpuId() { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); String strCpuID = null; foreach (ManagementObject mo in moc) { strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } return strCpuID; } /// <summary> /// 获取CPU编号 /// </summary> /// <returns></returns> public string GetCpuId() { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); String strCpuID = null; foreach (ManagementObject mo in moc) { strCpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } return strCpuID; } 第三步:编写注册码生成WinForm程序,使用CUP的编号来生成注册码,当然你也可以用 WebForm来写。view plaincopy to clipboardprint?using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(“私钥”); // 加密对象 RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa); f.SetHashAlgorithm("SHA1"); byte source = System.Text.ASCIIEncoding.ASCII.GetBytes(“CUP的编号”); SHA1Managed sha = new SHA1Managed(); byte result = sha.ComputeHash(source); byte b = f.CreateSignature(result); msg.Text = Convert.ToBase64String(b); //这里就得到了string形式的注册码 //再接下来你可以把生成的注册码保存成license.lic文件,license.lic文件也没什么特别的格式就是相当于把注册吗保存到一个txt文件中,无非这个txt文件的后缀改成了lic,你要高兴也可保存成其它多种格式。 //也可以保存在注册表中或是web.config中,总之能让你的发布的应用程序能读的到就行。 } using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(“私钥”); // 加密对象 RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa); f.SetHashAlgorithm("SHA1"); byte source = System.Text.ASCIIEncoding.ASCII.GetBytes(“CUP的编号”); SHA1Managed sha = new SHA1Managed(); byte result = sha.ComputeHash(source); byte b = f.CreateSignature(result); msg.Text = Convert.ToBase64String(b); //这里就得到了string形式的注册码//再接下来你可以把生成的注册码保存成license.lic文件,license.lic文件也没什么特别的格式就是相当于把注册吗保存到一个txt文件中,无非这个txt文件的后缀改成了lic,你要高兴也可保存成其它多种格式。//也可以保存在注册表中或是web.config中,总之能让你的发布的应用程序能读的到就行。} 第四步:在发布的程序相关地方添加对注册码有效性的验证。如添加在程序启动的时候,程序执行特定操作的时候等等,总之看你的需要做有效性的验证。view plaincopy to clipboardprint?//相关注册码获取代码…… //以下代码是发布程序使用公钥对注册码进行验证 using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(“公钥”); RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa); f.SetHashAlgorithm("SHA1"); byte key = Convert.FromBase64String(“注册码”); SHA1Managed sha = new SHA1Managed(); byte name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(“注册码”)); if(f.VerifySignature(name,key)) msg.Text = "验证成功"; //可以return true;等方式返回相应的状态 else msg.Text = "不成功"; } .net能被很好地反編譯,這是致命傷。就算有再好的加密算法也沒用。所以用了3樓的方法後混淆或者壓縮是少不了的。 DLL文件加密混淆,防止反编译。网站要注册使用。 调用list的TrimExcess方法后为什么list的Capacity属性没变? HttpWebRequest如何获取web页面中JavaScript变量的值 comboBox3、4如何感知comboBox2的值发生了变化? 怎么用拼音的首字母检索汉字? C# 正则表达式替换问题 如何判断出一个文件正在被另一个线程访问 C# var r=Math.random() [求助]一个c#+asp.net小问题,却把我难住了~ 如何操作系统的API 抽象类不能实例化到底是什么意思 RDLC分页混乱 问各位前辈几个专用术语。。。我菜鸟,不懂啊
看了“看了下面那篇“Crack别人应用程序”的文章有感,简述.Net下的应用程序授权。”,自己实际操作了把得出的心得 。这里原理啊背景啊什么都不介绍了,笑望人生已经在他的BLOG上都写的相当清楚了,有什么不细节不明白的可以去看原文。推荐先大概看下原文,现看我下面的步骤,然后再回头去研究原文的细节。由于我自己写的实例是用在公司一项目中,源代码就不方便放出来了,嘿嘿。
第一步:生成一组公钥和私钥,公钥用于你发布程序,私钥属于注册码生成。view plaincopy to clipboardprint?
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
// 公钥
string pubkey = rsa.ToXmlString(false);
// 私钥
string prikey = rsa.ToXmlString(true);
//如果是webForm就Response.Write(pubkey + ”<br/>” + prikey); 下
//如果是winForm就MessageBox.Show("公钥:" + pubkey + "\r\n私钥:" + prikey); 下
}
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
// 公钥
string pubkey = rsa.ToXmlString(false);
// 私钥
string prikey = rsa.ToXmlString(true);
//如果是webForm就Response.Write(pubkey + ”<br/>” + prikey); 下
//如果是winForm就MessageBox.Show("公钥:" + pubkey + "\r\n私钥:" + prikey); 下
} 第二步:取得机器硬件编码。我选用CUP的编号。view plaincopy to clipboardprint?
/// <summary>
/// 获取CPU编号
/// </summary>
/// <returns></returns>
public string GetCpuId()
{
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
String strCpuID = null;
foreach (ManagementObject mo in moc)
{
strCpuID = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return strCpuID;
}
/// <summary>
/// 获取CPU编号
/// </summary>
/// <returns></returns>
public string GetCpuId()
{
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
String strCpuID = null;
foreach (ManagementObject mo in moc)
{
strCpuID = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return strCpuID;
} 第三步:编写注册码生成WinForm程序,使用CUP的编号来生成注册码,当然你也可以用 WebForm来写。view plaincopy to clipboardprint?
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(“私钥”);
// 加密对象
RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa);
f.SetHashAlgorithm("SHA1");
byte source = System.Text.ASCIIEncoding.ASCII.GetBytes(“CUP的编号”);
SHA1Managed sha = new SHA1Managed();
byte result = sha.ComputeHash(source);
byte b = f.CreateSignature(result);
msg.Text = Convert.ToBase64String(b); //这里就得到了string形式的注册码
//再接下来你可以把生成的注册码保存成license.lic文件,license.lic文件也没什么特别的格式就是相当于把注册吗保存到一个txt文件中,无非这个txt文件的后缀改成了lic,你要高兴也可保存成其它多种格式。
//也可以保存在注册表中或是web.config中,总之能让你的发布的应用程序能读的到就行。
}
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(“私钥”);
// 加密对象
RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa);
f.SetHashAlgorithm("SHA1");
byte source = System.Text.ASCIIEncoding.ASCII.GetBytes(“CUP的编号”);
SHA1Managed sha = new SHA1Managed();
byte result = sha.ComputeHash(source);
byte b = f.CreateSignature(result);
msg.Text = Convert.ToBase64String(b); //这里就得到了string形式的注册码
//再接下来你可以把生成的注册码保存成license.lic文件,license.lic文件也没什么特别的格式就是相当于把注册吗保存到一个txt文件中,无非这个txt文件的后缀改成了lic,你要高兴也可保存成其它多种格式。
//也可以保存在注册表中或是web.config中,总之能让你的发布的应用程序能读的到就行。
} 第四步:在发布的程序相关地方添加对注册码有效性的验证。如添加在程序启动的时候,程序执行特定操作的时候等等,总之看你的需要做有效性的验证。view plaincopy to clipboardprint?
//相关注册码获取代码……
//以下代码是发布程序使用公钥对注册码进行验证
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(“公钥”);
RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa);
f.SetHashAlgorithm("SHA1");
byte key = Convert.FromBase64String(“注册码”);
SHA1Managed sha = new SHA1Managed();
byte name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(“注册码”));
if(f.VerifySignature(name,key))
msg.Text = "验证成功"; //可以return true;等方式返回相应的状态
else
msg.Text = "不成功";
}
所以用了3樓的方法後混淆或者壓縮是少不了的。
网站要注册使用。